Como pasar el valor de un edit de una forma hija a otra forma hija
Hola a todos de nuevo estoy tratando de pasar valores de una forma1 hija a otra forma2 hija en delphi pero no lo he conseguido, ya que de una forma1 hija llamo a la otra forma2 cuando presiono un boton:
Tform2.create(application);
y desde la nueva forma2 hija quiero obtener el valor del edit de la forma1 hija para poder realizar una consulta mediante un query.
Agredeceria me puedan ayudar.
Tform2.create(application);
y desde la nueva forma2 hija quiero obtener el valor del edit de la forma1 hija para poder realizar una consulta mediante un query.
Agredeceria me puedan ayudar.
Facil en la forma hija 2 declara en le uses la unidad de forma 1 (forma padre) y podras accesar a todos sus componentes, variables , procedimientos y funciones publicas de las siguiente manera
Valor := Forma1.Edit1. text;
Forma1.procedimientohazalgo();
Saludos
Valor := Forma1.Edit1. text;
Forma1.procedimientohazalgo();
Saludos
Bueno, decir que las ventanas MDI Child se controlan por la propiedad "caption" de la form, es decir, que si quieres interactuar entre MDI Childs, tienes que identificarlas por la propiedad "caption", por eso es imprescindible que la propiedad caption de cada MDI Child sea unica.
Hay dos formas principales de interactuar entre ventanas MDI Child, la primera seria crear una MDI Child desde una form e interactuar desde la form donde se creo a la MDI Child. Por ejemplo: quieres abrir una MDI Child y cambiar la propiedad Edit1.Text de Edit1 que esta en esa MDI Child creada. Esta es la forma mas sencilla de interactuar y seria:
procedure TMain.Button1Click(Sender: TObject);
var
ChildWindow: TMDIWindow; //Clase de la MDI Child
begin
ChildWindow:=TMDIWindow.Create(Application); //Se crea y muestra la MDI Child ChildWindow.Caption:='Titulo que sea'; //Se le asigna un titulo
ChildWindow.SetFocus; //Se le pasa el foco
ChildWindow.Edit1.Text:='el texto que se le quiera asignar'; //Se cambia el texto del Edit1
end;
Esto no tiene ningun problema, ahora bien, si tienes dos MDI Child abiertas y quieres interactuar entre ellas... solo hay una forma de hacerlo, identificar la MDI Child en donde tienes que modificar propiedades de objetos por el caption que tiene. ¿Como se hace? Antes de esto explicar que hay dos propiedades imprescindibles para controlar las MDI Child que estan creadas dentro de un MDIForm.
1.- MDIChildCount //Numero de ventanas MDI Child abiertas
2.- MDIChildren[index].Caption //El caption de la MDI Child "index"
Se necesitan tres funciones básicas para controlar las MDI Child: una que cuente las ventanas que existen con un caption determinado, otra que calcule el "index" de una vantana partiendo del caption y otra que encuentre un componente de la ventana partiendo de un caption, son estas tres:
function CountMDIWindows(Title: String): Integer;
var
Counter,MDICount: Integer;
begin
MDICount:=0;
for Counter:=0 to MDIChildCount-1 do
begin
if Copy(MDIChildren[Counter].Caption,1,Length(Title))=Title then Inc(MDICount);
end;
Result:=MDICount;
end;
Es muy util para numerar las MDI Child iguales, por ejemplo
procedure TMain.Button1Click(Sender: TObject);
var
ChildWindow: TMDIWindow; //Clase de la MDI Child
begin
ChildWindow:=TMDIWindow.Create(Application); //Se crea y muestra la MDI Child ChildWindow.Caption:='Titulo que sea - Ventana '+IntToStr(CountMDIWindows('Titulo que sea - Ventana ')+1); //Se le asigna un titulo y el contador de la ventana
ChildWindow.SetFocus; //Se le pasa el foco
end;
La siguiente funcion es para identificar el "index" de una MDI Child abierta:
function FindMDIWindow(Title: String): Integer;
var
Counter: Integer;
begin
for Counter:=0 to MDIChildCount-1 do
begin
if MDIChildren[Counter].Caption=Title then
begin
Result:=Counter;
Exit;
end;
end;
Result:=-1;
end;
Y la ultima y para encontrar un componente:
function FindMDIComponent(MDIWindowIndex: Integer; ComponentName: String): Integer;
var
Counter: Integer;
begin
for Counter:=0 to MDIChildren[MDIWindowIndex].ComponentCount-1 do
begin
if MDIChildren[MDIWindowIndex].Components[Counter].Name=ComponentName then
begin
Result:=Counter;
Exit;
end;
end;
Result:=-1;
end;
Bueno, te pondre un ejemplo: Abres una MDI Child que su caption sea 'Socios - Ventana 1' y en esta ventana hay un TEdit (Edit1) y un TButton (Button1) que abre otra MDI Child donde hay un TEdit (Edit1). Bien, la MDI Child que se abre de segunda tendrÃa que llevar el caption 'Socios - Ventana 1 - Buscar' de forma que en su caption encapsulas tambien el nombre de la ventana que la abrio solo con un "StringReplace" del string ' - Buscar' ya tienes su caption y la puedes controlar. Hasta aqui bien, como se accederÃa al Edit1 de la primera MDI Child desde la segunda MDI child, pues de esta forma:
procedure procedimiento_que_sea(Sender: TObject);
var
EditObject: TEdit;
begin
{MDIForm seria el nombre del MainForm que fuera el MDIForm}
EditObject:=MDIForm.MDIChildren[FindMDIWindow(StringReplace(Caption,' - Buscar','',[rfReplaceAll]))].Components[FindMDIComponent(FindMDIWindow(StringReplace(Caption,' - Buscar','',[rfReplaceAll])),'Edit1')] as TEdit;
EditObject.Text:='lo que sea';
end;
Bueno, no se si te quedo claro, pero espero haberos ayudado, si teneis dudas sobre las aplicaciones MDI no dudeis en preguntarme ;) Saludos al foro
Hay dos formas principales de interactuar entre ventanas MDI Child, la primera seria crear una MDI Child desde una form e interactuar desde la form donde se creo a la MDI Child. Por ejemplo: quieres abrir una MDI Child y cambiar la propiedad Edit1.Text de Edit1 que esta en esa MDI Child creada. Esta es la forma mas sencilla de interactuar y seria:
procedure TMain.Button1Click(Sender: TObject);
var
ChildWindow: TMDIWindow; //Clase de la MDI Child
begin
ChildWindow:=TMDIWindow.Create(Application); //Se crea y muestra la MDI Child ChildWindow.Caption:='Titulo que sea'; //Se le asigna un titulo
ChildWindow.SetFocus; //Se le pasa el foco
ChildWindow.Edit1.Text:='el texto que se le quiera asignar'; //Se cambia el texto del Edit1
end;
Esto no tiene ningun problema, ahora bien, si tienes dos MDI Child abiertas y quieres interactuar entre ellas... solo hay una forma de hacerlo, identificar la MDI Child en donde tienes que modificar propiedades de objetos por el caption que tiene. ¿Como se hace? Antes de esto explicar que hay dos propiedades imprescindibles para controlar las MDI Child que estan creadas dentro de un MDIForm.
1.- MDIChildCount //Numero de ventanas MDI Child abiertas
2.- MDIChildren[index].Caption //El caption de la MDI Child "index"
Se necesitan tres funciones básicas para controlar las MDI Child: una que cuente las ventanas que existen con un caption determinado, otra que calcule el "index" de una vantana partiendo del caption y otra que encuentre un componente de la ventana partiendo de un caption, son estas tres:
function CountMDIWindows(Title: String): Integer;
var
Counter,MDICount: Integer;
begin
MDICount:=0;
for Counter:=0 to MDIChildCount-1 do
begin
if Copy(MDIChildren[Counter].Caption,1,Length(Title))=Title then Inc(MDICount);
end;
Result:=MDICount;
end;
Es muy util para numerar las MDI Child iguales, por ejemplo
procedure TMain.Button1Click(Sender: TObject);
var
ChildWindow: TMDIWindow; //Clase de la MDI Child
begin
ChildWindow:=TMDIWindow.Create(Application); //Se crea y muestra la MDI Child ChildWindow.Caption:='Titulo que sea - Ventana '+IntToStr(CountMDIWindows('Titulo que sea - Ventana ')+1); //Se le asigna un titulo y el contador de la ventana
ChildWindow.SetFocus; //Se le pasa el foco
end;
La siguiente funcion es para identificar el "index" de una MDI Child abierta:
function FindMDIWindow(Title: String): Integer;
var
Counter: Integer;
begin
for Counter:=0 to MDIChildCount-1 do
begin
if MDIChildren[Counter].Caption=Title then
begin
Result:=Counter;
Exit;
end;
end;
Result:=-1;
end;
Y la ultima y para encontrar un componente:
function FindMDIComponent(MDIWindowIndex: Integer; ComponentName: String): Integer;
var
Counter: Integer;
begin
for Counter:=0 to MDIChildren[MDIWindowIndex].ComponentCount-1 do
begin
if MDIChildren[MDIWindowIndex].Components[Counter].Name=ComponentName then
begin
Result:=Counter;
Exit;
end;
end;
Result:=-1;
end;
Bueno, te pondre un ejemplo: Abres una MDI Child que su caption sea 'Socios - Ventana 1' y en esta ventana hay un TEdit (Edit1) y un TButton (Button1) que abre otra MDI Child donde hay un TEdit (Edit1). Bien, la MDI Child que se abre de segunda tendrÃa que llevar el caption 'Socios - Ventana 1 - Buscar' de forma que en su caption encapsulas tambien el nombre de la ventana que la abrio solo con un "StringReplace" del string ' - Buscar' ya tienes su caption y la puedes controlar. Hasta aqui bien, como se accederÃa al Edit1 de la primera MDI Child desde la segunda MDI child, pues de esta forma:
procedure procedimiento_que_sea(Sender: TObject);
var
EditObject: TEdit;
begin
{MDIForm seria el nombre del MainForm que fuera el MDIForm}
EditObject:=MDIForm.MDIChildren[FindMDIWindow(StringReplace(Caption,' - Buscar','',[rfReplaceAll]))].Components[FindMDIComponent(FindMDIWindow(StringReplace(Caption,' - Buscar','',[rfReplaceAll])),'Edit1')] as TEdit;
EditObject.Text:='lo que sea';
end;
Bueno, no se si te quedo claro, pero espero haberos ayudado, si teneis dudas sobre las aplicaciones MDI no dudeis en preguntarme ;) Saludos al foro
