Ir al contenido


Foto

alguien conoce algo análogo a constraint de VCL

constraint

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

#1 cram

cram

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 832 mensajes
  • LocationMisiones, Argentina

Escrito 18 agosto 2016 - 09:27

La propiedad constraint de algunos componentes de la VCL permite restringir (como lo indica su nombre) las dimensiones del objeto contenedor.

Es decir que, en caso de intentar reducir demasiado el tamaño de un contenedor (ventana, por ej.), se imponga un límite para que los objetos no queden fuera de este.

Por más que busco en FM, no la encuentro, ¿alguien conoce algo parecido?

 

Saludos

 


  • 0

#2 genriquez

genriquez

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 539 mensajes
  • LocationCali, Colombia

Escrito 18 agosto 2016 - 10:17

Hola Cram, creo que no lo tiene, pero es bastante sencillo implementarlo de la siguiente manera.

 

Simplemente adicionas en los uses una librería donde definas esto, o lo adicionas en el form, esto  sobreescribe la clase TLayout,


delphi
  1. TLayout = Class(FMX.Layouts.TLayout)
  2. private
  3. FConstraint: TPoint;
  4. procedure SetConstraint(const Value: TPoint);
  5.  
  6. Protected
  7. procedure HandleSizeChanged; Override;
  8. Public
  9. Property Constraint : TPoint read FConstraint write SetConstraint;
  10.  
  11. End;
  12.  
  13.  
  14. ......
  15.  
  16. { TLayout }
  17.  
  18. procedure TLayout.HandleSizeChanged;
  19. begin
  20. If (FConstraint.X > 0) and (Self.Width < FConstraint.X) then
  21. Self.Width := FConstraint.X;
  22.  
  23. If (FConstraint.Y > 0) and (Self.Height < FConstraint.Y) then
  24. Self.Height := FConstraint.Y;
  25.  
  26. inherited;
  27. end;
  28.  
  29. procedure TLayout.SetConstraint(const Value: TPoint);
  30. begin
  31. FConstraint := Value;
  32. end;

Luego en el OnCreate del formulario puedes adicionar la inicialización de los valores del constraint.


delphi
  1. procedure TForm15.FormCreate(Sender: TObject);
  2. begin
  3. Layout1.Constraint := Point(200,0);
  4. end;

el código fuente del ejemplo está a continuación.


delphi
  1. unit Unit15;
  2.  
  3. interface
  4.  
  5. uses
  6. System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  7. FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls, FMX.Layouts;
  8.  
  9. type
  10.  
  11. TLayout = Class(FMX.Layouts.TLayout)
  12. private
  13. FConstraint: TPoint;
  14. procedure SetConstraint(const Value: TPoint);
  15.  
  16. Protected
  17. procedure HandleSizeChanged; Override;
  18. Public
  19. Property Constraint : TPoint read FConstraint write SetConstraint;
  20.  
  21. End;
  22.  
  23.  
  24. TForm15 = class(TForm)
  25. Layout1: TLayout;
  26. Layout2: TLayout;
  27. Splitter1: TSplitter;
  28. procedure Layout1Resize(Sender: TObject);
  29. procedure FormCreate(Sender: TObject);
  30. private
  31. { Private declarations }
  32. public
  33. { Public declarations }
  34. end;
  35.  
  36. var
  37. Form15: TForm15;
  38.  
  39. implementation
  40.  
  41. {$R *.fmx}
  42.  
  43. procedure TForm15.FormCreate(Sender: TObject);
  44. begin
  45. Layout1.Constraint := Point(200,0);
  46. end;
  47.  
  48. procedure TForm15.Layout1Resize(Sender: TObject);
  49. begin
  50.  
  51. end;
  52.  
  53. { TLayout }
  54.  
  55. procedure TLayout.HandleSizeChanged;
  56. begin
  57. If (FConstraint.X > 0) and (Self.Width < FConstraint.X) then
  58. Self.Width := FConstraint.X;
  59.  
  60. If (FConstraint.Y > 0) and (Self.Height < FConstraint.Y) then
  61. Self.Height := FConstraint.Y;
  62.  
  63. inherited;
  64. end;
  65.  
  66. procedure TLayout.SetConstraint(const Value: TPoint);
  67. begin
  68. FConstraint := Value;
  69. end;
  70.  
  71. end.

puedes hacer esto con cualquier componente.

 

Otra forma puede ser creando nuevos componentes y sobreescribiendo la función.  pero esto ya depende de como te guste más.


  • 3

#3 cram

cram

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 832 mensajes
  • LocationMisiones, Argentina

Escrito 18 agosto 2016 - 09:54

Muchas gracias por la respuesta GEnriquez.

Por supuesto que siempre hay una posibilidad, la que muestras es muy interesante. El asunto es que también tuve que hacer a mano una ampliación controlada, ya que el componente que se supone es especialmente diseñado para esto no lo hace como quiero, pues le falta una propiedad que indique que se quiere mantener el aspecto.

Es que FM tiene tantas novedades respecto de VCL, que aun no puedo comprender como se les pasó una cosa tan útil.

Actualmente estoy trabajando en un comportamiento de la ventana que permita ampliar sus controles pero no permita reducir la ventana a tal punto que no quepan o se vuelvan ilegibles. Para esto inicio de un tamaño que llamo natural y permito la ampliación.

La verdad que FM tiene contrariedades. Por ejemplo una vez que fijas el tamaño de una fuente, ya no se puede ampliar. Es que es una contrariedadm pues las dimensiones de la ventana con la ampliación no son modificadas, pero la fuente una vez definido su tamaño no se puede ampliar a menos que le indiques en la propiedad de la fuente. ... 8o|

 

Voy a probarlo.

Pero en este caso quería evitar la creación o modificación de componentes.

 

Saludos.


  • 0

#4 cram

cram

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 832 mensajes
  • LocationMisiones, Argentina

Escrito 21 agosto 2016 - 07:31

Una respuesta más. Cuando dije interesante es porque noté que estabas creando un componente nuevo. En fin, no lo había visto en detalle, ahora que lo veo en detalle, te comento que es quizá la única forma, pues el componente original solo tiene la posibilidad de capturar el evento OnResize y no uno OnResizing, que sería más apropiado. El asunto es que no puede implementarse algo sin la modificación de la clase, ya que OnResize ocurre después del "resize" y ya no sirve, o al menos no es muy bueno el resultado que podría dar llegar a una dimensión dibujarla y volverla al límite y dibujarla de nuevo (supongo que se entiende).

 

Supongo que deberé crear más de un componente y tenerlos a mano como cuando la VCL no era tan potente en aspectos visuales.

 

Saludos y muchas gracias.


  • 0

#5 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 21 agosto 2016 - 11:53

Una respuesta más. Cuando dije interesante es porque noté que estabas creando un componente nuevo. En fin, no lo había visto en detalle, ahora que lo veo en detalle, te comento que es quizá la única forma, pues el componente original solo tiene la posibilidad de capturar el evento OnResize y no uno OnResizing, que sería más apropiado. El asunto es que no puede implementarse algo sin la modificación de la clase, ya que OnResize ocurre después del "resize" y ya no sirve, o al menos no es muy bueno el resultado que podría dar llegar a una dimensión dibujarla y volverla al límite y dibujarla de nuevo (supongo que se entiende).

 

Supongo que deberé crear más de un componente y tenerlos a mano como cuando la VCL no era tan potente en aspectos visuales.

 

Saludos y muchas gracias.

 

Lo unico que yo creo es que hay que tener cuidado con el diseño de componentes para FMX, hay que tener en mente que no son exclusivos para desktop y los móviles tienen manejos diferentes de los componentes, por eso es que el "transporte" no ha sido rápido ni transparente de la VCL a FMX.

 

Saludos (y)


  • 0

#6 cram

cram

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 832 mensajes
  • LocationMisiones, Argentina

Escrito 21 agosto 2016 - 12:30

Así es Egostar, gracias por la aclaración (lo tuve en cuenta, aunque no lo haya mencionado). Supongo que no todos los sistemas operativos cuentan con el mismo nivel de abundancia en cuanto a eventos.

En realidad constraint es una comodidad para el usuario, más que para el programador, puesto que este debería tener cuidado en al menos algo de lo que hace. Soy algo paranoico al momento de evitar "estupideces" por parte del operador.

 

Saludos


  • 1

#7 genriquez

genriquez

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 539 mensajes
  • LocationCali, Colombia

Escrito 26 agosto 2016 - 06:53

Hola,  la ventaja que veo en este modelo es que no se crea un nuevo componente, simplemente se extiende, eso queda dentro de una unit,  así que basta con utilizar el componente original y si el detecta que la hay modificaciones, simplemente las utiliza,  la única desventaja es que no son visibles en tiempo de diseño, solo en ejecución.

 

así he creado una gran variedad de librerías, que no requiero instalar, solamente las agrego en los uses y listo,  ese esquema es similar al de los helpers,  no hay que modificar el código de Delphi, ni instalar componentes, solo adicionar en los uses.  así de fácil.

 

Saludos.


  • 2




IP.Board spam blocked by CleanTalk.