PDA

Ver la Versión Completa : Uso de la función FindComponent


jessie
21-06-2005, 04:18:14
hola a todos, la verdad es que me urge su ayuda para poder saber como se usa la función findcomponent, lo que pasa es que estoy creando una aplicación en la cual creo objetos dinámicamente, creo Edits y Labels, entonces ahora quiero apropiarme de esos objetos para poder usarlos y liberarlos despues de su uso, he visto que se hace con esta función, sin embargo lo he probado y no me resulta... ojalá pudiera ayudarme alguien por favor, es que me interesa muchisimo, gracias por su ayuda y espero ansiosamente su respuesta....

roman
21-06-2005, 05:05:45
Sería útil que dijeras algo más específico que "no me resulta". Por otra parte creo que usar FindComponent es innecesario. Si creas una componente en código que luego quieres liberar simplemente guarda una referencia a la componente creada y úsala para liberarla:


Edit := TEdit.Create(...);

...

// más adelante

Edit.Free;


// Saludos

Neftali [Germán.Estévez]
21-06-2005, 09:37:01
Supongo que te refieres a que creas varios componentes utilizando la misma referencia (si no así Roman tiene razón...):


var
Edit:tEdit;
begin
...
for i := 0 to 10 do begin
Edit := TEdit.Create(...);
...
Edit.Name := '???';

end;


Para obtener componentes con FindComponent necesitas tener el nombre y como comprobación adicional utilizar el operador IS. Algo así podría ser un ejemplo:


var
Edit:tEdit;
i:Integer;
comp:TComponent;
begin
...
for i := 0 to 10 do begin
Name := 'Edit' + IntToStr(i); // para ir cambiando el nombre
// Buscamos el componente
comp := FindComponent(Name);
// Lo ha encontrado?
if Assigned(comp) then begin
// Asegurarnos de que es un Edit (tal vez no haría falta.)
if (comp is TEdit) then begin
TEdit(comp).Text := 'Encontrado';
TEdit(comp).Color := clGray;
end;
end;
end;


NOTA: En la ayuda de Delphi tienes algun eemplo más del FindComponent:
NOTA: Te he puesto el código de memoria (no lo he compilado), así que tal vez tenga algun error de sintaxis.:(

memoferprof
27-02-2013, 18:26:49
Supongo que te refieres a que creas varios componentes utilizando la misma referencia (si no así Roman tiene razón...):

Código Delphi [-] (http://www.clubdelphi.com/foros/#) var Edit:tEdit; begin ... for i := 0 to 10 do begin Edit := TEdit.Create(...); ... Edit.Name := '???'; end;


Para obtener componentes con FindComponent necesitas tener el nombre y como comprobación adicional utilizar el operador IS. Algo así podría ser un ejemplo:

Código Delphi [-] (http://www.clubdelphi.com/foros/#) var Edit:tEdit; i:Integer; comp:TComponent; begin ... for i := 0 to 10 do begin Name := 'Edit' + IntToStr(i); // para ir cambiando el nombre // Buscamos el componente comp := FindComponent(Name); // Lo ha encontrado? if Assigned(comp) then begin // Asegurarnos de que es un Edit (tal vez no haría falta.) if (comp is TEdit) then begin TEdit(comp).Text := 'Encontrado'; TEdit(comp).Color := clGray; end; end; end;


NOTA: En la ayuda de Delphi tienes algun eemplo más del FindComponent:
NOTA: Te he puesto el código de memoria (no lo he compilado), así que tal vez tenga algun error de sintaxis.:(


Saludos Deftali
Preguntando acerca de el FindComponent, este mismo puede encontrar o reconocer componentes de otro Form?
Osea algo asi como
with TUniPanel(FindComponent('Main.MainForm.PDomi1')) do
begin
Left := PDomi.Left;
Top := PDomi.Top;
width := PDomi.Width;
Height:= PDomi.Height;
Color := Random(MaxInt) and $FFFFFF;
Visible := True;
Caption := Main.MainForm.DBEditRolGuia.Text;
end;
Es que en mi caso quiero heredar esos valores de ancho, alto, izquierda, arriba de PDomi a otro Panel de otro Form.
Se que no lo estoy haciendo bien, porque al ejecutar eso me devuelve errores, no se podrias orientarme.
Gracias.

ecfisa
27-02-2013, 18:54:11
Saludos Deftali
... este mismo puede encontrar o reconocer componentes de otro Form?

Hola memoferprof.

Por supuesto que si. Claro que debes especificar el form.

Un ejemplo bien simple:

...
uses Unit2;

procedure TForm1.Button1Click(Sender: TObject);
begin
...
Caption:= TEdit(Form2.FindComponent('Edit1')).Text
end;
...


Saludos.

memoferprof
27-02-2013, 19:32:46
Hola memoferprof.

Por supuesto que si. Claro que debes especificar el form.

Un ejemplo bien simple:
Código Delphi [-] (http://www.clubdelphi.com/foros/#)... uses Unit2; procedure TForm1.Button1Click(Sender: TObject); begin ... Caption:= TEdit(Form2.FindComponent('Edit1')).Text end; ...


Saludos.

Wow!!
Gracias eficsa
Sin probarlo, estoy seguro que esa es mi solucion al problema que tengo, no lo habia pensado de esa manera jeje o tal vez no alcanzaba mi mente a entenderlo asi o simplemente no sabia que se podia asi. Pero gracias, gracias.

ecfisa
27-02-2013, 19:49:37
Hola memoferprof.

Como dato adicional, en el código anterior (msg #5) donde están los "...", es conveniente que verifiques que el componente contenedor (form) haya sido creado para evitar una excepción:

...
if Assigned(Form2) then // verificar
Caption:= TEdit(Form2.FindComponent('Edit1')).Text;
...


Saludos. :)

memoferprof
27-02-2013, 19:58:50
Hola memoferprof.

Como dato adicional, en el código anterior (msg #5) donde están los "...", es conveniente que verifiques que el componente contenedor (form) haya sido creado para evitar una excepción:
Código Delphi [-] (http://www.clubdelphi.com/foros/#) ... if Assigned(Form2) then // verificar Caption:= TEdit(Form2.FindComponent('Edit1')).Text; ...


Saludos. :)

Lo hare de esa manera, solo quiero agregar mi comentario para explicar mi entendimiento:
estaba haciendo mal uso de la funcion FindComponent, lo que yo hacia era decirle a la funcion FindComponent que fuera a
with TUniPanel(FindComponent('Main.MainForm.PDomi1')) do
y por lo que me has enseñado, lo que debo hacer es ir a la MainForm y decirle que use la funcion FindComponent para que ahi ya busque el componente que deseo, osea que algo asi:
with TUniPanel(Main.MainForm.FindComponent('PDomi1')) do
Gracias nuevamente.