Ver Mensaje Individual
  #5  
Antiguo 01-12-2015
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Reputación: 17
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
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
    { Private declarations }
  public
    { Public declarations }
  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
    { Private declarations }
  public
    { Public declarations }
  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
Responder Con Cita