PDA

Ver la Versión Completa : Duda - referirme a un componente de un form clonado con una funcion.


titomigue
16-10-2012, 21:48:51
hola buenas,
de mi form principal hago "clones" de un segundo form de esta manera:

function ClonoForm(form:TForm; var AIndice:Integer):TForm;
var
ms : TMemoryStream;
clone : TForm;
edit: TEdit;
begin
ms := TMemoryStream.Create;
try
ms.WriteComponent(form) ;
ms.Position := 0;
clone := TFormClass(form.ClassType).CreateNew(Application) ;
ms.ReadComponent(clone) ;
clone.caption:='Clon'+IntToStr(AIndice);
clone.name:='Clon'+IntToStr(AIndice);
clone.Left := form.Left;//posicion de ventana
clone.Top := form.Top;//posicion de ventana
clone.Show; //muestro el clon
Result := Clone;
finally
ms.Free;
end;
end;

Bien, ahora en el form2 cojo el nombre de la ventana por ejemplo "clon2" y hago una función que recibe ese 2.
Bien, ahora desde la función, en un Edit1 (por ejemplo) del form2 quiero escribir ese 2, pero no consigo referirme al componente Edit1 desde la función (me dice que no existe ese componente).
si escribo Form2.Edit1..... lo hace pero dejándome todos los clones con un único numero en el Edit1

¿Como podría referirme concretamente al Edit1 del "clon2"?

gatosoft
17-10-2012, 05:24:07
buen día titomigue,

Estuve intentando enteder tu problema y no comprendí el lio que tienes con "La Función", hubiese sido bueno que la publicaras para analizarla... asi, que intenté replicar tu error en mi Delphi y mi prueba salió bien... o por lo menos lo que yo esperaba....

Para esto cree un proyecto desde cero, con dos formularios (Form1, form2)... el primero tiene un Button1 y el segundo tiene un Edit1....


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

uses Unit2;

{$R *.dfm}

function ClonoForm(form:TForm; var AIndice:Integer):TForm;
var
ms : TMemoryStream;
clone : TForm;
edit: TEdit;
begin
ms := TMemoryStream.Create;
try
ms.WriteComponent(form) ;
ms.Position := 0;
clone := TFormClass(form.ClassType).CreateNew(Application) ;
ms.ReadComponent(clone) ;
clone.caption:='Clon'+IntToStr(AIndice);
clone.name:='Clon'+IntToStr(AIndice);
clone.Left := form.Left;//posicion de ventana
clone.Top := form.Top;//posicion de ventana
clone.Show; //muestro el clon
Result := Clone;
finally
ms.Free;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
Var Indice, i : Integer;
ElClon: Tform;
begin
Indice:= 1;
Form2.Show;
ClonoForm(Form2, Indice);
Form2.Edit1.Text:='Hola, soy el original...!!!';
for i := 0 to Screen.FormCount-1 do
if Pos('Clon',Screen.Forms[i].Name) > 0 then
Begin
ElClon := Screen.Forms[i];
TForm2(ElClon).Edit1.Text := 'Soy '+Screen.Forms[i].Name;
End;
end;

end.



Tal vez lo que estás buscando tiene que ver con el objeto global Screen y su lista de forms activos....

nos comentas omo te va, o nos das mas detalles en caso que no sea loq ue buscas...

Un saludo,

Neftali [Germán.Estévez]
17-10-2012, 10:02:15
La función de Clonar parece correcta, la que ya no se si lo es es la que utilizas para asignar.

algo así, por ejemplo funciona:


procedure TForm1.Button2Click(Sender: TObject);
var
f:TForm;
i:integer;
comp:TComponent;
begin

// Edit2 el nombre del form al que quiero acceder al edit
// Edit3, el valor que quiero asignar al Edit1 del form anterior

for i := 0 to (Screen.FormCount - 1) do begin
if (Screen.Forms[I].Name = Edit2.Text) then begin

comp := Screen.Forms[I].FindComponent('Edit1');
if Assigned(comp) then begin
if (comp is TEdit) then begin
TEdit(comp).Text := Edit3.Text;
end;
end;

end;
end;

end;

titomigue
17-10-2012, 21:09:03
Buenas, he hecho una prueba y me a servido esto:

for i := 0 to Screen.FormCount-1 do
if Pos('Clon',Screen.Forms[i].Name) > 0 then
Begin
ElClon := Screen.Forms[i];
TForm2(ElClon).Edit1.Text := 'Soy '+Screen.Forms[i].Name;
End;

De la manera que dice el amigo Neftali no he probado pero tiene buena pinta también.

Muchas gracias!