PDA

Ver la Versión Completa : Acceder a componentes creados en ejecución


bulc
24-02-2019, 16:44:27
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 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 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:

Declararlas como privadas de TForm1.
Declararlas globales a la implementación.
Darle un nombre en la creación y luego buscarlas con el método FindComponent.

Ejemplos con cada uno de los modos:

1.

...
procedure TForm1.Btn_TemaClick( Sender: TObject);
begin
FEdt_Tema.Text := FCBox.Items[FCBox.ItemIndex];

2.

...
implementation

var
GEdt: TEdit;
GCBox: TComboBox;

procedure TForm1.Btn_TemaClick( Sender: TObject);
begin
GEdt_Tema.Text := GCBox.Items[GCBox.ItemIndex];

3.

...
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
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
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