Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Duda - referirme a un componente de un form clonado con una funcion. (https://www.clubdelphi.com/foros/showthread.php?t=81159)

titomigue 16-10-2012 21:48:51

Duda - referirme a un componente de un form clonado con una funcion.
 
hola buenas,
de mi form principal hago "clones" de un segundo form de esta manera:

Código Delphi [-]
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....

Código Delphi [-]
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:

Código Delphi [-]
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:

Código Delphi [-]
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!


La franja horaria es GMT +2. Ahora son las 09:53:40.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi