2011-12-18 2 views
3

Здравствуйте, я получил Form1 с некоторыми переменными, и я хочу передать его другому Form3, где я его буду использовать. Поэтому у меня есть два вопроса.Передача переменной в другую Форма

  • Как я могу получить доступ к переменной в другой форме? Я предполагаю, что это будет быть похож на

    var newIdList:= Form1.idList

  • Когда вар список_идентификаторов получить значение в

    procedure TForm1.Button1Click(Sender: TObject);begin idList:=strtoint(edit1.text); end

    и я показать новую форму в другой может я все еще получаю значение в idList?

    procedure TForm1.Button2Click(Sender: TObject); begin form1.hide; form3.show; end


unit Unit1; 

    interface 

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

    type 
     TForm1 = class(TForm) 
     PageControl1: TPageControl; 
     TabSheet1: TTabSheet; 
     TabSheet2: TTabSheet; 
     TabSheet3: TTabSheet; 
     Label5: TLabel; 
     Edit3: TEdit; 
     Edit2: TEdit; 
     Button3: TButton; 
     Edit4: TEdit; 
     Button2: TButton; 
     Button1: TButton; 
     Edit1: TEdit; 
     Label1: TLabel; 
     Label3: TLabel; 
     Label2: TLabel; 
     Edit5: TEdit; 
     Label7: TLabel; 
     Label6: TLabel; 
     Button4: TButton; 
     ListBox1: TListBox; 
     procedure FormCreate(Sender: TObject); 
     procedure Button1Click(Sender: TObject); 
     procedure Button2Click(Sender: TObject); 
     procedure Edit4Click(Sender: TObject); 
     procedure Button3Click(Sender: TObject); 
     procedure Edit1Click(Sender: TObject); 
     procedure Button4Click(Sender: TObject); 

     private 
     { Private declarations } 
     public 
     { Public declarations } 
     idList,imieList,nazwiskoList,adresList: TStringList; 
     end; 

    var 
     Form1: TForm1; 
     plik:TStringList; 
     tempPlik:TextFile; 
     st:string; 
     linia_klient,linia_video:array[0..20] of string; 
     id:integer; 

    implementation 

    uses Unit3; 

    {$R *.dfm} 

    . 
    . 
    . 

    procedure TForm1.FormCreate(Sender: TObject); 
    var i:integer; 
    begin 
    Edit1.Text:='Witaj, Podaj ID klienta'; 
    Label1.Caption:='ID Klienta'; 
    idList:=TStringList.Create; 
    imieList:=TStringList.Create; 
    nazwiskoList:=TStringList.Create; 
    adresList:=TStringList.Create; 

    if (FileExists('idList.txt')=true) then idList.LoadFromFile('idList.txt') else idList.SaveToFile('idList.txt'); 
    if (FileExists('imieList.txt')=true) then imieList.LoadFromFile('imieList.txt') else imieList.SaveToFile('imieList.txt'); 
    if (FileExists('nazwiskoList.txt')=true) then nazwiskoList.LoadFromFile('nazwiskoList.txt') else nazwiskoList.SaveToFile('nazwiskoList.txt'); 
    if (FileExists('adresList.txt')=true) then adresList.LoadFromFile('adresList.txt') else adresList.SaveToFile('adresList.txt'); 

    AssignFile(tempPlik,'video.txt'); 
    Reset(tempPlik); 
    i:=0; 
    While Not Eof(tempPlik) do 
     begin 
     Readln(tempPlik,linia_video[i]); 
     inc(i); 
     end; 

    CloseFile(tempPlik); 
    end; 



    procedure TForm1.Button4Click(Sender: TObject); 
    begin 
     //Form1.Hide; 
     Form3.Show; 
    end; 

    end. 



unit Unit3; 

interface 

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

type 
    TForm3 = class(TForm) 
    Button1: TButton; 
    Edit1: TEdit; 
    Edit2: TEdit; 
    Edit3: TEdit; 
    Label1: TLabel; 
    Label2: TLabel; 
    Label3: TLabel; 
    Label4: TLabel; 
    procedure Button1Click(Sender: TObject); 
    procedure FormShow(Sender: TObject); 


    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    Form3: TForm3; 

implementation 

uses Unit1; 

{$R *.dfm} 

procedure TForm3.Button1Click(Sender: TObject); 
begin 
Form3.Hide; 
//Form1.Show; 
end; 



procedure TForm3.FormShow(Sender: TObject); 
begin 

Label4.Caption:= intToStr(idList.Count); 
end; 

end. 
+0

Вы не последовать моему примеру! Вам нужно 'Form1.idList.Count' вместо' idList.Count' в вашей 'последней' строке кода. (Потому что 'idList' является членом класса' TForm1'.) –

+0

Черт ... из. извините –

+0

@Dudi: Найдите статью, опубликованную Марко Кэнто в выпуске журнала Delphi Magazine, выпущенную в июле 1999 года под названием «20 правил для ООП в Дельфах». Вы не пожалеете об этом. – menjaraz

ответ

7

(Я буду считать, что каждая форма находится в своем собственном блоке.) Во-первых, вы должны убедиться, что idList доступен для других устройств. Например,

unit Unit1; 

interface 

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

type 
    TForm1 = class(TForm) 
    private 
    { Private declarations } 
    idList: integer; 
    public 
    { Public declarations } 
    end; 

не будет делать, но

unit Unit1; 

interface 

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

type 
    TForm1 = class(TForm) 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    idList: integer; 
    end; 

ОК. В этом случае все, что вам нужно сделать в Unit2, состоит в том, чтобы добавить Unit1 в свой список 'uses' (нажмите Alt + F11 или используйте File/'Use Unit ...', в то время как в Unit2 или при редактировании Form2). Затем вы можете использовать Form1.idList для доступа к переменной в любом месте внутри Unit2. (Form1 - глобальная переменная экземпляра TForm1 в Unit1).

Например,

unit Unit2; 

interface 

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

type 
    TForm2 = class(TForm) 
    Button1: TButton; 
    procedure Button1Click(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    Form2: TForm2; 

implementation 

uses Unit1;  // <-- Add manually, or press Alt+F11 (or use File/'Use Unit...') 

{$R *.dfm} 

procedure TForm2.Button1Click(Sender: TObject); 
begin 
    ShowMessage(IntToStr(Form1.idList)); 
end; 

end. 
+0

Хорошо, я опубликовал переменную, у меня уже было добавлено использование Unit1. Но все равно это не работает. Я обновляю свой вопрос по поводу кода Unit1 и Unit3. Не работает означает Undeeclared 'identifier:" idList "' –

+1

@Dudi: Обратите внимание, что в моем примере используется 'Form1.idList', а не' idList' в отдельности ... –

1

'Как я могу получить доступ к переменной в другой форме? - да, до тех пор, пока переменная является публичным или опубликованным членом, и у вас есть доступ к переменной экземпляра, вы можете получить к ней доступ так же, как любая другая переменная экземпляра класса. Обычно это означает добавление блока, содержащего класс Form1, в раздел uses, где требуется доступ.

«И я покажу новую форму в другой, могу ли я получить значение в idList?» - конечно, если форма существует, у вас есть доступ к переменной экземпляра формы, а 'idList' является общедоступной или публичной.

+0

общедоступное или публичное средство означает глобальное? –

Смежные вопросы