Pregunta

He estado aprendiendo Delphi para los últimos 3 años, en un nivel de manía / ocupacional. Estoy feliz de decir que ahora he progresado hasta el punto de que puedo mirar hacia atrás en mi código temprano con horror y vergüenza. Así que ahora estoy pasando por algunas de mis primeras aplicaciones y volver a escribir / refactorización ellos.

Uno de los malos hábitos que estoy tratando de escapar de los componentes está accediendo a una forma de otra unidad. En un esfuerzo para hacer cumplir esto, he estado experimentando con el uso de marcos como método de ocultación de información. Así que en lugar de tener una forma con los componentes en él, estoy creando un marco para contener todos los componentes de la forma, a continuación, colocando el marco de un formulario, se mueve la declaración marco en las declaraciones privadas,

type
  TMyForm = class(TForm)
   private
    MyFrame: TMyFrame;
    procedure SetTimeDate(const Value: TMyItem);
    function ReadTimeDate:TMyItem ;

a continuación, el registro de la trama en la sección de inicialización forma

initialization 
begin
RegisterClasses([TMyFrame])

Estoy declarando a continuación las propiedades que necesito en la sección pública de la unidad de forma, que tiene acceso a la estructura y sus componentes.

  public
    property TimeDate: TOverlayItem  read ReadTimeDate  write SetTimeDate;

También estoy usando marcos para consolidar grupos de componentes a menudo repetidas.

Esto parece funcionar para los fines que quiero (ocultando MyFrame y sus componentes), pero ¿alguien más tiene alguna experiencia de este método?

¿Hay algún inconveniente con el uso de marcos? De hecho, me estoy ganando ningún beneficio de hacer esto? ¿Hay algún problema con el uso de marcos anidados dentro de los marcos? ¿Hay guías de buenas prácticas en el uso de marcos en Delphi? ¿Hay mejores maneras más fáciles / de lograr el mismo efecto con respecto a la interfaz gráfica de usuario ocultación de información en Delphi?

HMcG

¿Fue útil?

Solución

Parece que todavía tiene una gran cantidad de lógica en la capa de interfaz de usuario. Formas / paneles no deberían tener que las propiedades de mayor valor (excepto tal vez para los diálogos).

Si desea más estructura que leer sobre el patrón MVC.

Una vez dicho todo esto, Marcos puede ser una buena manera de organizar la interfaz gráfica de usuario. Al igual que con todo, que no lo uses.

Otros consejos

I como el marco general para la creación de bits de reutilizables complejos. En su mayor parte creo que puede ser una forma muy limpia para construir pantallas. Sin embargo, como se ha mencionado por Henk Holterman sus pantallas y marcos sólo debe contener la lógica relacionada con el funcionamiento de la interfaz de usuario y ser tan ignorante como sea posible acerca de la lógica de negocio.

Un par de puntos de re marcos y ocultamiento de información en la interfaz de usuario:

  1. Como se discutió en otra pregunta en StackOverflow que hay que tener cuidado cuando se utilizan controladores de eventos en su marco.
  2. Cuadros todavía tienen un montón de propiedades publicadas y realmente no resuelven el problema de las formas que son capaces de tocar el violín de manera inapropiada con uno de los otros trozos. Incluso si no lo hace, si el código que permite a alguien con el tiempo escribir código que altere donde no debe. Siempre me quito la variable de forma global Delphi ensucia con el código y, a menudo escribo objetos envolventes o implementar interfaces que proporcionan controlaban el acceso a la interfaz de usuario.

Así que en lugar de tener un código como este:

ClientForm := TClientViewForm.Create(Self);
try
  ClientForm.Client := MyClient;
  ClientForm.ShowModal;
finally
  ClientForm.Free;
end;

Voy generalmente obligan a las personas a escribir algo por el estilo:

ClientViewer := TClientViewer.Create(MyClient);
try
  ClientViewer.Show;
finally
  ClientViewer.Free;
end;

o incluso

TClientViewer.ShowClient(MyClient);

y tienen el método de clase ShowClient manejar el bit se muestra en el primer listado. De esta forma el código de llamada no recibe nunca el puntero de forma y no puede tocar cualquier resto que no se ofrecen específicamente por la clase contenedora.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top