2014-11-09 2 views
-1

У меня есть объект, созданный в Form1, и я хотел бы иметь доступ к одному из его полей в Form2. Я попытался это сделать, и никто не может дать ответ, который я могу понять. Пожалуйста, извините меня, но я новичок.Как передать объект во вторую новую форму Delphi

Form1

unit Unit1; 
interface 
uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs, StdCtrls; 
type 
    Ttest=class 
    public 
    sName:string; 
    end; 
type 
    TForm1 = class(TForm) 
    Button1: TButton; 
    procedure Button1Click(Sender: TObject); 
end; 
var 
    Form1: TForm1; 
implementation 

uses Unit2; 
{$R *.dfm} 
procedure TForm1.Button1Click(Sender: TObject); 
var 
    myObj:Ttest; 
begin 
    myObj.Create; 
    myObj.sName := 'Name'; 
    Form2.Show; 
end; 

end. 

Form2

unit Unit2; 
    interface 
    uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
     Dialogs, StdCtrls; 
type 
    TForm2 = class(TForm) 
    Button2: TButton; 
    procedure Button2Click(Sender: TObject); 
end; 

var 
Form2: TForm2; 
implementation 
uses Unit1; 
{$R *.dfm} 

procedure TForm2.Button2Click(Sender: TObject); 
begin 
ShowMessage(myObj.sName);//This is not working 
end; 

end. 
+2

Прежде всего вам нужно узнать о построении экземпляров объектов, вы не создаете экземпляр Ttest. Вы даже не создаете Form2, я считаю, что вы вставили какой-то поддельный код. Во-вторых, myObj не является полем Form1, это локальная переменная в некотором методе. Вы можете получить доступ к нему только тем же способом, который объявлена ​​переменной. –

+0

Хорошо, я отредактировал код, чтобы вытащить создание. Он компилируется и запускается, если я не пытаюсь показать ShowMessage myObj. Вместо этого покажите еще какую-нибудь «строку» ... Итак, я могу получить доступ только к myObj в Form1? – user3715962

+0

Только в Button1Нажмите, если вы не объявите myObj в 'интерфейсе' или не сделаете это поле TForm1. Вы создаете Ttest, например myObj: = Ttest.Create; –

ответ

4

У вас есть две формы, как использовать объект. Вы должны определить объект в отдельном модуле и перечислить его в предложении Uses в разделе Interface обеих форм. Попробуйте использовать то, что уже определено в основной библиотеке, например, TStringlist, так что вы не путаетесь с этой частью.

Из того, что вы показываете здесь, вы пытаетесь создать экземпляр этого объекта в одной форме и сделать что-то с ним в другой форме. Это обычная вещь: у вас может быть одно устройство, которое запрашивает имя файла и загружает файл в TStringList, а затем передает его другой форме или блоку.

Способ, которым вы это делаете, может быть улучшен, чтобы уменьшить сцепление между двумя формами.

То, что вы хотите сделать, это определить свойство, как это в TForm2:

TForm2 = class(TForm) 
. . . 
private 
    Ftestobj : TTest; // or TStringlist 

public 
    property testobj : TTest read Ftestobj write Ftestobj; 

Тогда в TForm1.OnButtonClick сделать что-то вроде этого:

form2.testobj := myobj; 
form2.Show; 

И тогда это становится:

procedure TForm2.Button2Click(Sender: TObject); 
begin 
ShowMessage(Ftestobj.sName); 
end; 

В последнее время я действительно провел целую сессию в CodeRage 9 по этой теме. Он имеет право: «Вы еще обняли своего водопроводчика?» и это все о перемещении данных в таких формах и из них. (Я называю это сантехникой.)

Искать «coderage 9» и смотреть видео. В конце есть ссылка, в которой вы можете скачать код примера. Это должно заставить вас заняться какое-то время. :)