Ir al contenido


Foto

Problemas alineando Texto Edit hacia Derecha


  • Por favor identifícate para responder
11 respuestas en este tema

#1 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 05 diciembre 2011 - 09:22

Pues eso, he hecho el simple truco de:



delphi
  1. syslocale.MiddleEast := True;
  2. Edit1.BiDiMode := bdRightToLeft;



He intentado castearlo creandome un componente sin instalar, solo como unidad:



delphi
  1. unit EditsExt;
  2.  
  3. interface
  4.  
  5. Uses
  6.   Windows, StdCtrls, Classes, Controls;
  7.  
  8. type
  9.   TEditExt  = class(TCustomEdit)
  10.     private
  11.       FAlignment: TAlignment;
  12.       procedure CreateParams(var Params: TCreateParams);
  13.       procedure SetAlignment(const Value: TAlignment);
  14.     published
  15.       property Alignment: TAlignment read FAlignment write SetAlignment default taLeftJustify;
  16.   end;
  17.  
  18. implementation
  19.  
  20. procedure TEditExt.CreateParams(var Params: TCreateParams);
  21. const
  22.   Alignments: array[TAlignment] of DWord = (ES_LEFT, ES_RIGHT, ES_CENTER);
  23. begin
  24.   inherited CreateParams(Params);
  25.   Params.Style := Params.Style or Alignments[FAlignment];
  26. end;
  27.  
  28. procedure TEditExt.SetAlignment(const Value: TAlignment);
  29. begin
  30.   if FAlignment <> Value then
  31.   begin
  32.     FAlignment := Value;
  33.     RecreateWnd ;
  34.   end;
  35. end;
  36.  
  37. end.



Usandolo de esta Manera:



delphi
  1. TEditExt(Edit1).Alignment := taRightJustify;



Y no me funciona!!!
  • 0

#2 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 05 diciembre 2011 - 09:43

Buenas,

Puébalo como una clase interpuesta a ver

Nos leemos

  • 0

#3 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 05 diciembre 2011 - 10:00

Hola, hice esto:



delphi
  1. type
  2.   TEdit  = class(StdCtrls.TEdit)
  3.     private
  4.       FAlignment: TAlignment;
  5.       procedure CreateParams(var Params: TCreateParams);
  6.       procedure SetAlignment(const Value: TAlignment);
  7.     published
  8.       property Alignment: TAlignment read FAlignment write SetAlignment default taLeftJustify;
  9.   end;



y luego:



delphi
  1. TEdit(Edit1).Alignment := taRightJustify;



Y aun sigue sin alinearmelo a la derecha.
  • 0

#4 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 05 diciembre 2011 - 10:24

¿Te sirve esto?



delphi
  1. type
  2.   TEditExt  = class(TCustomEdit)
  3.     public
  4.       constructor Create(AOwner: TComponent); override;
  5.  
  6.   end;
  7.  
  8. implementation
  9.  
  10. constructor TEditExt.Create(AOwner: TComponent);
  11. begin
  12.   syslocale.MiddleEast := True;
  13.   inherited Create(AOwner);
  14. end;





delphi
  1. procedure TForm1.FormCreate(Sender: TObject);
  2. begin
  3.     Edit1:= TEditExt.Create(self);
  4.     Edit1.Parent:= self;
  5.     Edit1.BiDiMode:= bdRightToLeft;
  6. end;



Así si funciona....


Saludos.
  • 0

#5 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 05 diciembre 2011 - 10:36

Buenas,

El casteo no hace falta que lo hagas dado que todo TEdit que aparezca en esa unit se tratará como la nueva clase que has creado.

Este código funciona, el Edit1 estará alineado a la derecha y el Edit2 a la izquierda



delphi
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs, StdCtrls;
  8.  
  9. type
  10.   TEdit  = class(StdCtrls.TEdit)
  11.     private
  12.       FAlignment: TAlignment;
  13.       procedure SetAlignment(const Value: TAlignment);
  14.     protected
  15.       procedure CreateParams(var Params: TCreateParams); override;
  16.     published
  17.       property Alignment: TAlignment read FAlignment write SetAlignment default taLeftJustify;
  18.   end;
  19.  
  20.   TForm1 = class(TForm)
  21.     Edit1: TEdit;
  22.     Edit2: TEdit;
  23.     procedure FormCreate(Sender: TObject);
  24.   private
  25.     { Private declarations }
  26.   public
  27.     { Public declarations }
  28.   end;
  29.  
  30. var
  31.   Form1: TForm1;
  32.  
  33. implementation
  34.  
  35. {$R *.dfm}
  36.  
  37. procedure TForm1.FormCreate(Sender: TObject);
  38. begin
  39.   Edit1.Alignment := taRightJustify;
  40. end;
  41.  
  42. { TEdit }
  43.  
  44. procedure TEdit.CreateParams(var Params: TCreateParams);
  45. const
  46.   Alignments: array[TAlignment] of DWord = (ES_LEFT, ES_RIGHT, ES_CENTER);
  47. begin
  48.   inherited CreateParams(Params);
  49.   Params.Style := Params.Style or Alignments[FAlignment];
  50. end;
  51.  
  52. procedure TEdit.SetAlignment(const Value: TAlignment);
  53. begin
  54.   if FAlignment <> Value then
  55.   begin
  56.     FAlignment := Value;
  57.  
  58.     RecreateWnd ;
  59.   end;
  60. end;
  61.  
  62. end.



Nos leemos


EDITO: se me olvidaba. Si pones la nueva clase de TEdit en una unit a parte, tienes que asegurarte de que la incluyes en el uses de la unit donde quieras usarla y que esté detrás de la unit StdCtrls



delphi
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6.   Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  7.   Controls, Forms, Dialogs, StdCtrls, MI_UNIT


  • 0

#6 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 05 diciembre 2011 - 10:40

Buenas escafandra,

El único problema que le veo a tu método es que no puedes ver en diseño el aspecto de la pantalla. Por lo demás es una solución perfectamente válida ;)

Nos leemos

  • 0

#7 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 05 diciembre 2011 - 10:44

@cadetill: Pues sigue sin funcionarme :(

@escafandra: la solucion es valida como bien dice cadetill, pero no puedo verlo en tiempo de diseno :p
  • 0

#8 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 05 diciembre 2011 - 10:46

enecumene, he editado el mensaje añadiendo un comentario, mira que no sea por eso ;)

Nos leemos

  • 0

#9 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 05 diciembre 2011 - 10:47

enecumene, he editado el mensaje añadiendo un comentario, mira que no sea por eso ;)

Nos leemos


Pues asi la tengo :D
  • 0

#10 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 05 diciembre 2011 - 10:55

Te adjunto demo que funciona (Delphi 6) para que puedas mirar el código a ver qué diferencias hay

Espero te sierva

Nos leemos

  • 0

#11 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 05 diciembre 2011 - 11:04

Buenas escafandra,

El único problema que le veo a tu método es que no puedes ver en diseño el aspecto de la pantalla. Por lo demás es una solución perfectamente válida ;)

Nos leemos


Si, es un inconveniente, pero se puede compilar como un componente...

De todas formas , puestos a simplificar, se puede simular con una sóla función:


delphi
  1. function  TEditExt(Edit: TCustomEdit): TCustomEdit;
  2. begin
  3.   syslocale.MiddleEast := True;
  4.   Result:= Edit;
  5. end;





delphi
  1. procedure TForm1.FormCreate(Sender: TObject);
  2. begin
  3.     TEditExt(Edit1).BiDiMode:= bdRightToLeft;
  4. end;



Bueno, no es un cast, pero... ¿A que es simple?  *-) :D :D :D

Saludos.
  • 0

#12 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 05 diciembre 2011 - 11:16

@escafandra: No manches :D, pero yo no se por que a mi no me funciona lo del BiDiMode :s

@cadetill: ya pude ver el demo y vi lo que me faltaba, un override en createparams y ya me funciono.

Muchas gracias a todos, hoy aprendi sobre las clases interpuestas :D
  • 0




IP.Board spam blocked by CleanTalk.