Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Acceder a componentes creados en ejecución (https://www.clubdelphi.com/foros/showthread.php?t=93775)

bulc 24-02-2019 16:44:27

Acceder a componentes creados en ejecución
 
Tengo un Form creado en ejecución con varios componentes, entre ellos un TComboBox, unTEdit y un TButton. Quiero que el botón seleccione un elemento del Combo y lo pase al TEdit.
Si puedo acceder al botón, pero no consigo acceder al dato del Combo y pasarlo al TEdit.
Código Delphi [-]
// Código del Botón Btn_TEMA:
procedure TForm1.Btn_TemaClick( Sender: TObject);
begin
    With Sender as TButton do   // Como pasa el Edt_Tema ?
    begin
     Caption := 'Primer Item';
     // ?????????????????
    end;
end;


procedure TForm1.Button1Click(Sender: TObject);
Var
  FModal: TForm;
  EditA, Edt_Tema : TEdit;
  Boton, Btn_Tema: TButton;
  CBox : TComboBox;
  UD : TUpDown;
  Lbl : TLabel;
  Val : Integer;
begin
TRY
   ..............................
   With Btn_Tema do
  begin
    Caption:= 'Pasar Tema';
    Font.Size:= 11;
    Width:= 170;  // Prior to Left !!
    Height:= 40;
    Left:=Trunc( (FModal.Width - Boton.Width) div 2 ) + 130 ; // 95;
    Top:= 90;
    Parent:= FModal;
    onClick := Form1.Btn_TemaClick;  // Lo que hace el Butón Btn_TEMA
    Default:=True; //Btn that receives Event.
   end;
 
FINALLY
     fModal.Free;
 
END;
end;
end.
Saludos.
bulc

WHILENOTEOF 24-02-2019 21:30:39

Si lo creas en ejecución, guarda una referencia al control creado

fEdit : TEdit;
...
fEdit:= TEdit.Create(Form1);
...

y antes de hacer algo, te aseguras que está asignado if (fEdit <> nil) , o if Assigned(fEdit )

Otra forma podría ser asignar la propiedad Tag con un identificador único, y escribes una función que te sirva para localizar un componente del form pasando el Tag como parámetro.

ecfisa 25-02-2019 02:27:43

Hola.

Sinceramente no sé si entendí bién la situación...

Pero a ver, si el problema radica aquí
Código Delphi [-]
// Código del Botón Btn_TEMA:
procedure TForm1.Btn_TemaClick( Sender: TObject);
begin
    With Sender as TButton do   // Como pasa el Edt_Tema ?
    begin
     Caption := 'Primer Item';
     // ?????????????????
    end;
end;
entonces el caso es que: Edt_Tema de tipo TEdit y CBox de tipo TComboBox son variables locales del método Button1Click y para usarlas desde el método Btn_Tema podrías:
  1. Declararlas como privadas de TForm1.
  2. Declararlas globales a la implementación.
  3. Darle un nombre en la creación y luego buscarlas con el método FindComponent.
Ejemplos con cada uno de los modos:

1.
Código Delphi [-]
...
procedure TForm1.Btn_TemaClick( Sender: TObject);
begin
  FEdt_Tema.Text := FCBox.Items[FCBox.ItemIndex];
2.
Código Delphi [-]
...
implementation

var
 GEdt: TEdit;
 GCBox: TComboBox;

procedure TForm1.Btn_TemaClick( Sender: TObject);
begin
  GEdt_Tema.Text := GCBox.Items[GCBox.ItemIndex];
3.
Código Delphi [-]
...
procedure TForm1.Btn_TemaClick(Sender: TObject);
var
  C1, C2: TComponent;
begin
  C1 := FindComponent('Edt_Tema');
  C2 := FindComponent('CBox');
  if Assigned(C1)and Assigned(C2) then
    TEdit(C1).Text := TComboBox(C2).Items[TComboBox(C2).ItemIndex];
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Btn_Tema: TButton;
  Edt_Tema: TEdit;
  CBox: TComboBox;
begin
  (*  ESTE CÓDIGO ES SOLO UN EJEMPLO DE PRUEBA *)
  Edt_Tema := TEdit.Create(Self);
  Edt_Tema.Parent := Self;
  Edt_Tema.Name := 'Edt_Tema';
  Edt_Tema.Top := 5;

  CBox := TComboBox.Create(Self);
  CBox.Parent := Self;
  CBox.Name := 'CBox';
  CBox.Items.Add('uno');
  CBox.Items.Add('dos');
  CBox.Items.Add('tres');
  CBox.Top := 50;

  Btn_Tema := TButton.Create(Self);
  Btn_Tema.Parent := Self;
  Btn_Tema.Name := 'Btn_Tema';
  Btn_Tema.Top := 100;
  Btn_Tema.OnClick := Btn_TemaClick;
end;

Saludos :)

bulc 25-02-2019 10:48:04

He probado con FindComponent
 
Y no he ha servido. Las variables no eran asignadas. No estaban accesibles...
Luego he declarado las variables componente: - Var Edt_Tema : TEdit, CBox : TComboBox ... como Private y ha ido perfectamente. Ya puedo acceder desde el evento del botón Btn_TemaClick a todos los componentes.
Y mira que le había dado vueltas a la cosa. Intentaba pasar los componentes Edi_Tema, CBox como parámetros. Iba muy perdido.
Maravillado de la sencillez de la respuesta te doy las gracias más efusivas.
Saludos.
Bulc

ecfisa 01-03-2019 15:38:27

Hola.

Si el nombre que le asignaste en la creación del componente (y fué creado) es el mismo que usas como argumento del método FindComponent funcionará, te lo aseguro.

Pero también coincido en que cualquiera de los dos primeros modos es mucho mas simple y más eficiente que ese, ya que sólo se trata de ampliar el ámbito de las variables en cuestión.

Saludos y me alegro mucho que lo solucionaras :)

bulc 01-03-2019 16:44:17

Sí, lo he solucionado
 
He puesto los componentes del Form dinámico dentro del apartado Private y ha funcionado a la primera.
De ese modo los componentes quedan accesibles al código del botón creado con ese Form dinámico.
No pongo código por haberlo puesto antes.
Saludos y muchas gracias al personal y foreros.
bulc


La franja horaria es GMT +2. Ahora son las 17:50:38.

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