Błażej
Błażej

Reputation: 3635

Passing the variable to another Form

I got Form1 with some variables and I want to pass it to another Form3 where I'll use it. So I have two questions.


    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.

Upvotes: 3

Views: 27684

Answers (2)

Andreas Rejbrand
Andreas Rejbrand

Reputation: 109138

(I will assume that each form resides in its own unit.) First, you have to make sure that idList is accessible to other units. For example,

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;

will not do, but

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;

is OK. In such case, all you need to do in Unit2 is to add Unit1 to its 'uses list' (press Alt+F11, or use File/'Use Unit...', while in Unit2 or while editing Form2). Then you can use Form1.idList to access the variable anywhere inside Unit2. (Form1 is the global instance variable of TForm1 in Unit1).

For example,

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.

Upvotes: 9

Martin James
Martin James

Reputation: 24907

'How can I get access to variable in another form?' - yes, as long as the variable is a public or published member and you have acess to the instance variable, you can access it in the same way as any other class instance variable. Usually, this means adding the unit containing the 'Form1' class to the uses clause of the unit where access is desired.

'and I show new form in another can I still get value in idList?' - sure, as long as the form exists, you have access to the form instance variable and 'idList' is public or published.

Upvotes: 2

Related Questions