2010-12-09 28 views
5

¿es posible crear un marco de tiempo de ejecución y agregar paneles existentes como establecer el elemento primario del panel en el marco? y cuando se agregó, dulcifica el marco y lo usa?crear Tframes en tiempo de ejecución:

gustan:

f:= Tframe. create(..) 
... 

panel3.parent = f; //where panel3 has many controls. 

Luego duplica la f? fue posible? ¿cómo? o cualquier otra sugerencia? e

Respuesta

5

No creo que pueda resolver esto duplicando. Lo que necesita es una función como esta:

function CreateFrameAndHostPanel(Owner: TComponent; Parent: TWinControl; Panel: TPanel): TFrame; 
begin 
    Result := TFrame.Create(Owner); 
    Try 
    Result.Parent := Parent; 
    Panel.Parent := Result; 
    Except 
    FreeAndNil(Result); 
    raise; 
    End; 
end; 
3

Debe recordar que todos los controles tienen un padre y un propietario. Los propietarios pueden ser nil, pero luego debe liberar esos controles a través del código, por lo que la mayoría de los controles son propiedad de algún otro componente.

Por lo tanto, si el propietario es destruido, el panel también sería destruido. Y si el panel fue creado en tiempo de diseño, ¡es propiedad de la forma en que está activado!

¡Destruir esa forma destruiría el panel!

Pero si crea los paneles en tiempo de ejecución y establece Application como propietario en lugar de un formulario, podrían moverse sobre múltiples formularios y marcos.

¿Pero es un buen patrón de diseño? ¡No sé lo que intentas hacer, pero es probable que sea una mala idea!

En general, sería más práctico diseñar todo el marco con paneles en tiempo de diseño. A continuación, agregue un código que permita crear el marco copiando datos de otro panel o control. Ese sería un mejor patrón de diseño ...

1

Debe crear el nuevo marco (FRAME2) con el mismo código que ha utilizado para crear el primero (FRAME1); Y luego, debe crear todos los componentes incluidos (creados en tiempo de ejecución) dentro de FRAME1 en FRAME2.

Pues para esto, utilice:

for i := 0 to (FRAME1.ComponentCount - 1) do 
    ... 
    cmp := TComponent(FRAME1.Component[i]); 
    ... create cmp on Frame2 

puede probar con una segunda alternativa; Guarde el FRAME1 utilizando un TMemoryStream (SaveComponent) y luego cree el nuevo Frame y recupere la información guardada en Stream (no tengo esta opción para probar).

Atentamente.

Cuestiones relacionadas