Ver Mensaje Individual
  #6  
Antiguo 01-12-2015
Avatar de Soa Pelaez
Soa Pelaez Soa Pelaez is offline
Miembro
 
Registrado: nov 2015
Posts: 133
Reputación: 11
Soa Pelaez Va por buen camino
Cita:
Empezado por AgustinOrtu Ver Mensaje
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
Lo que quiero realmente es hacer algo similar a esto.

{$IFDEF CLR}
System.ComponentModel.Design.Serialization, System.Security.Permissions, System.Security, // Esto lo usa solamente si es un equipo que tiene S.O Windows

{$ENDIF}
{$IFDEF LINUX}
WinUtils, libc, // Esto lo usa solamente si es un equipo que tien S.O Linux
{$ENDIF}


Alguien tiene un ejemplo de algo asi, pero especificando uses de Unit, poniendo en contexto el ejemplo que cito en mi inquietud
Responder Con Cita