Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Alineación derecha en un TEdit (https://www.clubdelphi.com/foros/showthread.php?t=92866)

Angel.Matilla 27-02-2018 13:34:34

Alineación derecha en un TEdit
 
En una aplicación hecha con BCB 6, ¿hay alguna manera de que un TEdit / TLabeledEdit se alinee a la derecha? He estado mirando y no soy capaz de encontrar la manera.

ElDioni 27-02-2018 14:14:18

No se a partir de que versión pero anteriormente el objeto TEdit no incluía la propiedad de alineado de texto. Si buscas en el foro TAlignEdit encontrarás un componente que creó, si no recuerdo mal, román, que a mí me ha ayudado hasta que adquirí la versión XE7 que si lleva la alineación en los edit.

Saludos.

_Leo 27-02-2018 15:21:34

Cita:

Empezado por Angel.Matilla (Mensaje 524778)
En una aplicación hecha con BCB 6, ¿hay alguna manera de que un TEdit / TLabeledEdit se alinee a la derecha? He estado mirando y no soy capaz de encontrar la manera.

Prueba con lo siguiente en el constructor del Form por ejemplo:
Código PHP:

HWND h Edit1->Handle;
SetWindowLong(hGWL_STYLEGetWindowLong(hGWL_STYLE) | ES_RIGHT); 


ecfisa 27-02-2018 16:44:32

Hola.

Otra opción:
Código PHP:

...
TSysLocale OldSysLocale SysLocale;

void __fastcall TForm1::Button1Click(TObject *Sender// u OnCreate
{
  
SysLocale.MiddleEast true;
  
Edit1->BiDiMode bdRightToLeft;
}

void __fastcall TForm1::FormDestroy(TObject *Sender)
{
  
SysLocale OldSysLocale;


Saludos :)

Angel.Matilla 28-02-2018 10:34:50

Cita:

Empezado por _Leo (Mensaje 524782)
Prueba con lo siguiente en el constructor del Form por ejemplo:
Código PHP:

HWND h Edit1->Handle;
SetWindowLong(hGWL_STYLEGetWindowLong(hGWL_STYLE) | ES_RIGHT); 


Funciona a la perfección. Gracias Leo.
Cita:

Empezado por ecfisa (Mensaje 524786)
Código PHP:

void __fastcall TForm1::Button1Click(TObject *Sender// u OnCreate
{
  
SysLocale.MiddleEast true;
  
Edit1->BiDiMode bdRightToLeft;



También funcina, aunque no debería:
Cita:

Alignment does not change for controls that are known to contain number, date, time, or currency values. For example, with data aware controls, the alignment does not change for the following field types: ftSmallint, ftInteger, ftWord, ftFloat, ftCurrency, ftBCD, ftDate, ftTime, ftDateTime, ftAutoInc.
Sin embargo te obliga a andar modificando las variables del sistema. Muchas gracias a los dos por las soluciones.

ElDioni 28-02-2018 12:25:11

De nada hombre, para esto estamos.

Saludos.

Angel.Matilla 28-02-2018 17:51:36

Me está ocurriendo algo curioso. Con este código:

Código PHP:

__fastcall TfRecMod::TfRecMod(TComponentOwner)
     : 
TForm(Owner)
{
     
HWND h;

     
this->Cuota->Handle;
     
SetWindowLong(hGWL_STYLEGetWindowLong(hGWL_STYLE) | ES_RIGHT);

     
this->Importe->Handle;
     
SetWindowLong(hGWL_STYLEGetWindowLong(hGWL_STYLE) | ES_RIGHT);
[... 
etc.]


Me está saliendo esto


Sin embargo en otros formularios, con el mismo código, lo hace bien. ¿Cuál puede ser la razón?

ecfisa 28-02-2018 22:10:53

Cita:

Empezado por Angel.Matilla (Mensaje 524808)
Me está ocurriendo algo curioso. Con este código:

Código PHP:

__fastcall TfRecMod::TfRecMod(TComponentOwner)
     : 
TForm(Owner)
{
     
HWND h;

     
this->Cuota->Handle;
     
SetWindowLong(hGWL_STYLEGetWindowLong(hGWL_STYLE) | ES_RIGHT);

     
this->Importe->Handle;
     
SetWindowLong(hGWL_STYLEGetWindowLong(hGWL_STYLE) | ES_RIGHT);
[... 
etc.]


Me está saliendo esto


Sin embargo en otros formularios, con el mismo código, lo hace bien. ¿Cuál puede ser la razón?

Está comprobado que de ese modo existen problemas de acuerdo con algunas configuraciones del sistema, tal como lo comenté en este mensaje hace 6 años: Alinear texto a la derecha en un Edit .

Saludos :)

Angel.Matilla 01-03-2018 09:33:13

Cita:

Empezado por ecfisa (Mensaje 524813)
Está comprobado que de ese modo existen problemas de acuerdo con algunas configuraciones del sistema, tal como lo comenté en este mensaje hace 6 años: Alinear texto a la derecha en un Edit

Probaré la alternativa que citas. Sin embargo lo que me llama la atención es que en unos formularios funcione y en otros no; no es lógico pensar que en mitad de la ejecución de una aplicación se modifique la configuración del sistema. Gracias.

Angel.Matilla 01-03-2018 09:56:09

:( Da lo mismo. He puesto este código:
Código PHP:

__fastcall TfRecMod::TfRecMod(TComponentOwner)
     : 
TForm(Owner)
{
     
SysLocale.MiddleEast true;
     
Cuota->BiDiMode bdRightToLeft;
     
Importe->BiDiMode bdRightToLeft;
     
SysLocale SL;
[...]


Y me saca así el formulario

mientras que en el formulario prinicpal de la aplicación lo hace bien

¿Puede tener algo que ver el hecho de que esos campos sean TLabeledEdit? Me extrañaría, pero todo puede ser. Y lo cierto es que un problema similar lo tengo con un código que me pasó escafandra para alinear textos en los botones: unas veces sí funciona y otras no. Cierto que se trata más de un tema estético y sé que con las LMDTools se puede hacer, pero quiero evitar tener que añadir librerías externas que no sea imprescindibles. Seguiremos investigando.

Angel.Matilla 01-03-2018 10:15:18

Bueno. He seguido haciendo pruebas con la sugerencia de ecfisa, y he comprobado que si no pongo la línea SysLocale = SL me lo hace bien en todos los formularios que de momneto he visto. Ahora bien, no sé que efecto tendrá sobre el resto de edits que hay en ese formulario, Seguiré investigando. :o

ecfisa 01-03-2018 12:13:29

Cita:

Empezado por Angel.Matilla (Mensaje 524823)
:( Da lo mismo. He puesto este código:
Código PHP:

__fastcall TfRecMod::TfRecMod(TComponentOwner)
     : 
TForm(Owner)
{
     
SysLocale.MiddleEast true;
     
Cuota->BiDiMode bdRightToLeft;
     
Importe->BiDiMode bdRightToLeft;
     
SysLocale SL;
[...]


.

Luego de hacer las asignaciones, en la línea:
Código PHP:

...
 
SysLocale SL

estas restaurando la variable SysLocale al valor previamente guardado, intenta hacer esa acción al salir del formulario como en #4.

Saludos :)

_Leo 01-03-2018 12:37:43

Lo malo de ES_RIGHT es que si por algún motivo se tiene que "re-crear" el TEdit se volverá a crear solo con los estilos que se le asignaron en la creación por tanto ignorara esto.

Seria fácil crear un componente derivado de TEdit con esta funcionalidad como tienen las versiones actuales de C++Builder si lo vas a usar mucho.

Con esta chapucilla puedes sustituir los edits que necesites sin crear un componente completo, no lo he probado mucho, así que podría explotar por algún lado ;-) Pero todo es probar.. la solución de ecfisa es más corta y quizás con ello ya te sirva, aunque no sé si tendría luego por algún lado alguna otra repercusión el usar BiDiMode que está pensado para idiomas que se escriben de derecha a izquierda como el árabe, por ejemplo.

Creamos una cabecera, y la llamamos por ejemplo: “EditR.h” con el siguiente contenido:
Código PHP:

#ifndef __EditR_H
#define __EditR_H

#include <memory>

class TEditR : public TEdit
{
    
virtual void __fastcall CreateParams(TCreateParamsParams) {
        
inherited::CreateParams(Params);
        
Params.Style Params.Style ES_RIGHT;
    }
public:
    
__fastcall TEditR(TComponentOwnerTEditSource) : TEdit(Owner) {
        
std::auto_ptr<TMemoryStreamms(new TMemoryStream);
        
Parent Source->Parent;
        
ms->WriteComponent(Source); // Salvamos las propiedades del TEdit
        
ms->Seek(0soFromBeginning);
        
delete Source// Eliminamos el TEdit original
        
ms->ReadComponent(this); // Recuperamos las propiedades en el TEditR
    
}

    static 
TEditR__fastcall Create(TEditSource) {
        return new 
TEditR(Source->OwnerSource);
    }
};

#endif 

Incluimos la cabecera en el Form que necesitemos y con cada Edit que queramos que se alinee a la derecha hacemos lo siguiente en el constructor por ejemplo:
Código PHP:

TEditR::Create(Edit1); 

Lo que hará es sustituir ese TEdit con el TEditR que aplica el estilo ES_RIGHT desde su creación, copia todas las propiedades del TEdit original, lo destruye y el nuevo ocupa su lugar, podemos seguir referenciándolo con el mismo nombre ya que se llama igual, y tampoco tenemos que preocuparnos de destruirlo ya que tendrá el mismo propietario que tenía el TEdit original y se destruirá como hubiese pasado originalmente con el TEdit.

Una prueba que podemos hacer para comprobar que la diferencia de hacerlo como dije en un principio y de esta manera es forzar a que se recree el Form usando:
Código PHP:

Form1->RecreateWnd(); 

Veremos que con la primera opción se pierde el ES_RIGHT y con la segunda se mantiene.

Si al final no explota por algún lado ;-) con muy pocos cambios se puede aprovechar para añadir otros estilos desde la creación.

Se podría hacer de otras maneras, pero yo creo que si lo usas mucho compensa crear un componente muy sencillo para ello..

Angel.Matilla 01-03-2018 13:26:46

Gracias por tu idea Leo. No es algo que use con demasiada frecuencia (de hecho en toda la aplciación debe usarse media docena de veces); como en muchas otras dudas que me has resuelto es más un tema de estética. La tendré en cuenta y no te quepa duda que la probaré.

ecfisa 01-03-2018 17:27:16

Hola.

Si como mencionas es de uso eventual, tal vez la solución mas simple sea usar en su reemplazo un componente TMemo ajustando su propiedad Alignment, v. gr.:
Código PHP:

void __fastcall TForm1::FormCreate(TObject *Sender)
{
  
Memo1->Height      21;
  
Memo1->Width       120;
  
Memo1->Alignment   taRightJustify;
  
Memo1->WantReturns false;
  
Memo1->Text        "3.141592654"// un ej.


Muestra:


Saludos :)

Angel.Matilla 01-03-2018 17:48:40

Cita:

Empezado por ecfisa (Mensaje 524837)
Si como mencionas es de uso eventual, tal vez la solución mas simple sea usar en su reemplazo un componente TMemo ajustando su propiedad Alignment, v. gr.:

Pues mira, no se me había ocurrido y es una excelente idea.


La franja horaria es GMT +2. Ahora son las 18:15:43.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi