Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Pasar datos de un form a otro. (https://www.clubdelphi.com/foros/showthread.php?t=81915)

cenriquet 03-01-2013 11:53:25

Pasar datos de un form a otro.
 
Buenos días y Feliz 2013 a todo el mundo. Este es un tema recurrente, y aunque he probado la solución que se ha dado en otras consultas (crear una variable pública) hay algo que no he debido entender, por lo que os pido perdón.

Para visualizar mi problema me he creado dos formas: Triangulo_MainForm

Código Delphi [-]
unit Triangulo_MainUnit;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Buttons, Triangulo_InputData;

type
  TTriangulo_MainForm = class(TForm)
    Input: TButton;
    Output: TBitBtn;
    Results: TMemo;
    procedure InputClick(Sender: TObject);
    procedure OutputClick(Sender: TObject);
  private
    { Private declarations }
  public
(*
    myData : TData;    { Public declarations }
*)
  end;

var
  Triangulo_MainForm: TTriangulo_MainForm;

implementation


{$R *.DFM}

procedure TTriangulo_MainForm.InputClick(Sender: TObject);
begin
  InputDataForm.ShowModal()      // Se llama a la segunda unidad
end;

procedure TTriangulo_MainForm.OutputClick(Sender: TObject);
begin             
  with myData do                           // aquí es donde da el error "Undeclared
                                                   // identifier
    begin                                       
      Results.Lines.Add(' ');              // Se escriben los datos de myData 
      Results.Lines.Add(valor1);        // en el Memo
      Results.Lines.Add(valor2);
      Results.Lines.Add(valor3);
    end;
end;

end.

que, al pulsar el botón Input, llama a otra forma llamada Triangulo_InputData

Código Delphi [-]
unit Triangulo_InputData;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TData = record
            valor1 : string;
            valor2 : string;
            valor3 : string;
          end;
  TInputDataForm = class(TForm)
    SendData: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    procedure SendDataClick(Sender: TObject);
  private
    { Private declarations }
  public
    myData : TData;    { Public declarations }
  end;
var
  InputDataForm: TInputDataForm;

implementation

{$R *.DFM}

procedure TInputDataForm.SendDataClick(Sender: TObject);

begin
  with myData do
  begin
    valor1 := Edit1.text;
    valor2 := Edit2.text;
    valor3 := Edit3.text;
  end;
  Close;
end;

end.


En esta form se introducen tres datos, en principio es texto, La idea es que al pulsar el botón Send Data estos tres datos combinen en un registro (record) llamado myData que pueda ser accesible desde la primera unidad (Triangulo_MainForm). En esta unidad al pulsar el botón Output, los datos contenidos en myData aparecían en una ventana tipo Memo.

Por lo que he entendido de otras consultas similares, si no iguales, la solución pasaría por

1. Declarar en la cláusula uses de la unit Triangulo_MainUnit, la segunda unidad (Triangulo_InputData). (hecho)

2, Declarar en la segunda unidad (Triangulo_InputData) myData como variable pública. (hecho)

La cosa es que haciéndolo así no me funciona, por lo que deduzco que se me he perdido algo en el camino.

También he probado a declarar myData como variable pública en la primera unidad y la cosa tampoco funciona.

Gracias por vuestra ayuda y que los Reyes Magos sean generosos con todos.

Neftali [Germán.Estévez] 03-01-2013 12:42:42

En el segundo form:

Antes del close:
Código Delphi [-]
  Triangulo_MainForm.myData := myData;

Y opcionalmente:

Código Delphi [-]
  Triangulo_MainForm.btnOutputClick(nil);

En el uses del segundo form tendrás que añadir:
Código Delphi [-]
uses
  Triangulo_MainUnit;

Y en el primer form descomentar el MyData.

Diría que con eso te va a funcionar.
Si necesitas alguna aclaración, ya dirás.

Básicamente lo único que te falta es asignar lo que has hecho en el segundo form, al primero.

cenriquet 03-01-2013 13:25:33

Así es como me quedan las dos forms (Por si sirviese de ejemplo para otros)

Form Principal

Código Delphi [-]
unit Triangulo_MainUnit;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Buttons;

type
  TData = record
            valor1 : string;
            valor2 : string;
            valor3 : string;
          end;

  TTriangulo_MainForm = class(TForm)
    Input: TButton;
    Output: TBitBtn;
    Results: TMemo;
    procedure InputClick(Sender: TObject);
    procedure OutputClick(Sender: TObject);
  private
    { Private declarations }
  public

    myData : TData;    { Public declarations }

  end;

var
  Triangulo_MainForm: TTriangulo_MainForm;

implementation

uses Triangulo_InputData;


{$R *.DFM}

procedure TTriangulo_MainForm.InputClick(Sender: TObject);
begin
  InputDataForm.ShowModal()
end;

procedure TTriangulo_MainForm.OutputClick(Sender: TObject);
begin
  with myData do
    begin
      Results.Lines.Add(' ');
      Results.Lines.Add(valor1);
      Results.Lines.Add(valor2);
      Results.Lines.Add(valor3);
    end;
end;

end.



Form Secundaria


Código Delphi [-]
unit Triangulo_InputData;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Triangulo_MainUnit;

type
  TInputDataForm = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  InputDataForm: TInputDataForm;

implementation

{$R *.DFM}

procedure TInputDataForm.Button1Click(Sender: TObject);
var
  myDataIn: TData;

begin
  with myDataIn do
  begin
    valor1 := Edit1.text;
    valor2 := Edit2.text;
    valor3 := Edit3.text;
  end;
  Triangulo_MainForm.myData := myDataIn;
  Close;
end;

end.

Lo mejor de todo es que ¡¡¡¡¡¡¡¡¡FUNCIONA!!!!!!!!!!

Me ha surgido una duda. La instrucción:

Triangulo_MainForm.btnOutputClick(nil);

¿qué hace exactamente?

Muchas gracias.

Neftali [Germán.Estévez] 03-01-2013 13:57:06

Cita:

Empezado por cenriquet (Mensaje 452840)
Lo mejor de todo es que ¡¡¡¡¡¡¡¡¡FUNCIONA!!!!!!!!!!

Bueno, de eso se trataba, ¿no? ;)

Cita:

Empezado por cenriquet (Mensaje 452840)
Me ha surgido una duda. La instrucción:
Triangulo_MainForm.btnOutputClick(nil);
¿qué hace exactamente?

Si te fijas, en el primer formulario tienes un procedimiento definido así:
Código Delphi [-]
procedure TTriangulo_MainForm.OutputClick(Sender: TObject);
begin
  with myData do
    begin
      Results.Lines.Add(' ');
      Results.Lines.Add(valor1);
      Results.Lines.Add(valor2);
      Results.Lines.Add(valor3);
    end;
end;

Es el procedimiento que tienes asignado al botón Output al hacer un Click. En realidad es un procedimiento como cualquier otro que se asigna a ese evento del botón.
A este procedimiento también puedes llamarlo de forma "manual", además de que esté asignado al evento.
Al llamarlo lo que consigues es el mismo efecto que si pulsaras el botón, ya que el resultado es el mismo:

1) O lo llama el botón de forma automática al ser pulsado.
2) O lo llamas de forma manual como he hecho yo.

Un saludo.

cenriquet 04-01-2013 17:29:14

Re: Pasar datos de un form a otro.
 
Muchas gracias por tu ayuda y a menos que alguien aporte una solución más elegante, creo que podemos dar el tema por cerrado.


La franja horaria es GMT +2. Ahora son las 01:38:39.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi