PDA

Ver la Versión Completa : Copia de un componente...


chechu
28-10-2004, 18:52:19
Buen dia para todos....Necesito una ayuda en lo siguiente.


tengo un formulario que tiene componentes y en tiempo de ejecucion estos se pueden arrastrar, lo que quiero hacer es que esos componentes antes de comenzar el arrastre dejen una copia de si mismos en la posision original de la cual los saco, me explico? bueno si alguien me puede ayudar .........porfi:)

roman
28-10-2004, 19:38:24
Una vez que tengas más claro lo que tratamos en el hilo Guardar Frame... (http://www.clubdelphi.com/foros/showthread.php?t=15426) creo que podrás "clonar" una componente- al menos sus propedades publicadas (sección published).

Los métodos ReadComponent y WriteComponent de TFileStream que te mencioné en el otro hilo se aplican también a otro tipo de streams. Podrías usar TMemoryStream en lugar de TFileStream para crear una copia de la componente: la escribes al stream con WriteComponent y la lees en una nueva instancia con ReadComponent.

Pero por otra parte, pienso que quizá te estés complicando la vida. Según entiendo de tu hilo Arrastrar y Soltar!!! (http://www.clubdelphi.com/foros/showthread.php?t=15385), tú quieres tener algo similar a una paleta de componentes que el usuario arrastra al área de trabajo (un frame).

En el proceso de drag and drop no tienes necesariamente que arrastrar físicamente la componente. En el evento OnDragDrop del frame, en lugar de mover la componente origen, puedes dejarla donde está y crear tú misma una nueva instancia inicializando sus propiedades con los valores que tenga la componente que se "arrastró" o con otros valores por defecto:


procedure FrameDragDrop(Sender, Source: TObject; X, Y: Integer);
begin
if Source is TEdit then
begin
with TEdit.Create(Self) do
begin
Text := TEdit(Source).Text;
Width := TEdit(Source).Width;

Color := clWindow;
end;
end;
end;

// Saludos

chechu
28-10-2004, 22:20:22
Intente hacer lo que me aconsejas y no puedo lograrlo, no se porque no funciona ..........el no arrastrar fisicamente el componente sino crear uno .....el codigo que utilizo es el siguiente:

El usuario da el permiso para crear una nueva pagina(tab) por medio de un boton............, en esa pagina puede agregar componentes (lo que intento hacer arrastrando.. ) y la pagina que quede diseñada por el usuario la debo poder reutilizar (por lo que dentro de las tabs creo frames contenedores los que luego me van a permitir guardar y recuperar las paginas ''segun lo que yo imagino'')..............entonces:

procedure TForm1.ToolButton1Click(Sender: TObject);
var
NuevoTabSheet: TTabSheet;
Marco: TFrame;
i: integer;
begin
NuevoTabSheet:= TTabSheet.Create(PageControl1);
NuevoTabSheet.Visible:= True;
NuevoTabSheet.Caption:= IntToStr(i);;
NuevoTabSheet.PageControl:= PageControl1;
PageControl1.ActivePage:= NuevoTabSheet;
Marco:= TFrame.Create(NuevotabSheet);
NuevoTabSheet.InsertControl(Marco);
Marco.Color:= clwhite;
Marco.Align:= alClient;
Marco.OnDragOver:= Mover;
Marco.OnDragDrop:= FrameDragDrop;
end;

Bien .......defino el procedimiento que cree un nuevo componente y no sea arrastrarlo fisicamente...como me sugeris

procedure TForm1.FrameDragDrop(Sender, Source: TObject; X, Y: Integer);
begin
if Source is TButton then
begin
with TButton.Create(Self) do
begin
width := TButton(Source).Width; {solo a modo de prueba}
end;
end;
end;


entonces al intentar arrastrar el componente no tengo ninguna respuesta .........no se , no funciona:confused:

roman
28-10-2004, 23:14:39
Hola chechu,

En el ejemplo que te puse se me olvidó asignar la propiedad Parent del Edit creado. Debes asignarle el frame para que se haga visible.

Una cosa, el manejador del evento OnDragDrop lo tienes definido en el formulario y no en el frame. No hay mayor problema con esto excepto que en tal situación Self será el formulario y no el frame. Por ello, cuando hagas

TButton.Create(Self)

el owner del botón será el formulario, cosa que no debe ser si piensas seguir el método que te describí en otro hilo. El owner debe ser el frame.

Otra cosa; aunque puedes asignar a Frame.OnDragDrop y Frame.OnDragOver métodos del formulario pienso que será más claro si defines un frame base (como el DesignerFrame que te mostré anteriormente) y en ese frame base asignas los eventos mediante el inspector de objetos.

// Saludos

DANY
24-05-2006, 17:36:55
lo dicho, solucion total para mi.