Este es un ejemplo trivial, basicamente consiste de dos Forms, Form1 y Form2
El Form1 consiste de un memo y un boton, el cual en su evento OnClick, crea y visualiza de manera modal el Form2. Por lo tanto en su clausula uses encontramos la Unit2
El Form2 simplemente tiene un Edit y un boton; Form2 en su clausula uses contiene a Unit1, por lo tanto creamos una referencia circular
Unidad1 -> Usa a la Unidad2
Unidad2 -> Usa a la Unidad1
En el evento OnClick del Form2, se agrega al Memo del Form1 el contenido del Edit, y se cierra el formulario
El codigo seria el siguiente:
Código Delphi
[-]unit Unit1;
interface
uses
Windows,
Messages,
SysUtils,
Variants,
Classes,
Graphics,
Controls,
Forms,
Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
public
end;
var
Form1: TForm1;
implementation
uses
Unit2;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
Form2: TForm2;
begin
Form2 := TForm2.Create(NIL);
try
Form2.ShowModal;
finally
Form2.Free;
end;
end;
end.
Código Delphi
[-]
unit Unit2;
interface
uses
Windows,
Messages,
SysUtils,
Variants,
Classes,
Graphics,
Controls,
Forms,
Dialogs,
StdCtrls;
type
TForm2 = class(TForm)
Edit1: TEdit;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
public
end;
implementation
uses
Unit1;
{$R *.dfm}
procedure TForm2.Button1Click(Sender: TObject);
begin
Form1.Memo1.Lines.Add(Edit1.Text);
Close;
end;
end.
Y en efecto si lo ejecutamos, podria decirse que funciona bien. Pero obviamente, si a mi me interesa en otro proyecto usar solo uno de estos dos Form, no me queda otra alternativa que incluir a los dos
Una primera solucion podria ser, quitar del uses del Form2, a la Unit1; obviamente el codigo ahora no compilara ya que no se conoce a 'Form1'.
Asi que la unica alternativa es acceder desde el Form1 al valor del Edit, asi:
Código Delphi
[-]
procedure TForm1.Button1Click(Sender: TObject);
var
Form2: TForm2;
begin
Form2 := TForm2.Create(NIL);
try
Form2.ShowModal;
Memo1.Lines.Add(Form2.Edit1.Text);
finally
Form2.Free;
end;
end;
Pero no seria mas lindo poder hacer algo como esto?:
Código Delphi
[-]
procedure TForm1.Button1Click(Sender: TObject);
var
Form2: TForm2;
begin
Form2 := TForm2.Create(NIL);
try
Memo1.Lines.Add(Form2.GetString);
finally
Form2.Free;
end;
end;
function TForm2.GetString: string;
begin
ShowModal;
Result := Edit1.Text;
end;
Obviamente se puede ir mejorando mas y mas, pero eso te lo dejo para que experimentes vos mismo
Saludos