MainForm crea algunos objetos Frame secundarios en el tiempo de ejecución para mostrar varios paneles de opciones.Diferencias en la inicialización de formulario entre Delphi y Lazarus?
Aquí hay un constructor típico para una de esas clases de trama (cada uno de ellos se extienden TFrame):
constructor Tframe2.Create(AOwner: TComponent);
begin
inherited;
edTime.Text := '12:00pm'; //edTime is a TEdit control. this line is where it throws the exception
//etc.
end;
Este código funcionó bien en Delphi (si es o no era la manera correcta de hacer las cosas), pero el el mismo código en Lazarus sigue arrojando una excepción EInvalidOperation, porque el control (TEdit) todavía no tiene asignada una "ventana" principal (rsControlHasNoParentWindow), lo que de hecho tiene sentido cuando examino el código porque el padre no parece estar asignado hasta que se llame al constructor.
Este es el código en la MainForm inicializa la estructura secundaria:
if Assigned(frame) then FreeAndNil(frame);
case Node.AbsoluteIndex of
optInterval: frame := Tframe2.Create(Self); //here's where the constructor gets called.
//etc
end;
frame := TframeOther.Create(Self);
if Assigned(frame) then
begin
frame.Parent := panOptions; //here's where Tframe2's parent gets set
frame.Align := alClient;
end;
Así puede alguien explicar si hay diferencias importantes entre Delphi y Lázaro por lo que la secuencia de inicialización forma?
¿Y cuál sería la forma más estándar de resolver este tipo de problema de orden de inicialización? En comparación con otros idiomas con los que estoy más familiarizado, puede haber diferentes estrategias para resolver dichos errores. Podría agregar otro parámetro al constructor, o si hay un método que recibe el nombre de post constructor pre-dibujarlo en la pantalla que podría anular podría reubicar ese código, o simplemente hacer un método de ayuda y llamarlo después de que se llame a setParent. ¿Alguna de las mejores prácticas en particular aquí?
Editar]: parece que esto puede ser específico para TEdit de alguna manera. Parece que las líneas que inicializan el estado para las casillas de verificación no tienen el mismo problema. ¿Podría ser solo un error en Lazarus?
No sé si eso soluciona el problema, pero establezca Create heredado (AOwner); en el procedimiento de creación. – Ravaut123
Pruebe el código simple * TEdit.Create (nil) .Text: = '12345' *; Este código crea la edición sin padres y le asigna algunos subtítulos. Si esto funciona en VCL pero no en LCL, entonces eso significa que son padres diferentes. También tenga en cuenta que LCL es solo un contenedor contra alguna biblioteca de kits de herramientas. Hay LCL sobre GTK +, LCL sobre Qt y quién sabe qué más. Quizás puedas cambiar el back-end de LCL a otra biblioteca y arreglarlo. O tal vez no. –
Le di una oportunidad, pero no puedo duplicar este problema (lazarus 0.9.30.4). –