2016-09-28 1 views
0

私のメインフォームの変数を別のフォームで使用したいと思います。各フォームにはそれぞれ独自のユニットがあります。異なるフォーム/ユニットに変数を渡す

私は「を使用と変数にアクセスすることを望んでいるユニット」彼らは私が公共の宣言でと実装の下に変数を置くべきであると述べた記事を見つけたResult_u

にLogin_uからIUSERを使用したいです。また、それは私の結果ユニットで変数

unit Login_u; 

interface 

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

type 
TfrmLogin = class(TForm) 
btnLogin: TButton; 
cbxUser: TComboBox; 
procedure btnLoginClick(Sender: TObject); 
private 
{ Private declarations } 
public 
    iUser:Integer; 
{ Public declarations } 
end; 

var 
frmLogin: TfrmLogin; 
implementation 
uses Result_u; 
{$R *.dfm} 

procedure TfrmLogin.btnLoginClick(Sender: TObject); 
begin 
    iUser:= cbxUser.ItemIndex; 
    end; 
end; 
end. 

を取得したい場所から実装用途の下でその変数にアクセスしたいユニット、その後、ユニット名に私はエラー宣言されていないidentififierを取得し、私はアクティベート手順を使用し、単なるテストとして提示メッセージは

unit Result_u; 

interface 

uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs, StdCtrls, Grids, DBGrids, jpeg, ExtCtrls; 

type 
    TfrmResult = class(TForm) 
    procedure FormActivate(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    frmResult: TfrmUitslae; 

implementation 
uses Login_u; 
{$R *.dfm} 

procedure TfrmUitslae.FormActivate(Sender: TObject); 
begin 
    ShowMessage(iUser); 
end; 

end. 

私はこれについていくつかの記事を読みましたが、私はそれは複雑なコードである必要がdoes notのように、私は高校生だ、迷子に保ちます。

+0

あなたは 'TFrmLogin'のインスタンスを作成する必要がどこか。次に、そのインスタンスを通して 'iUser'を得ることができます:' frmLoginInstance.iUser'。通常、グローバルな 'frmLogin'変数(削除する)を使用して、それを必要な場所でローカルに宣言するべきではありません。おそらく 'TFrmResult'宣言の中にあります。また、 'Login_u'から' Result_u'を削除します。 –

+0

* "彼らは変数を公に宣言する必要があると言った" * - それはいいです。 - "* and under implementation"が、変数 '*'にアクセスしたいユニットを使用しています。これは不要です。 'Login_u'から 'Result_u use 'を削除してください。 - * "実装でその変数にアクセスしたいユニットの中で、ユニット名" * - でもOKです。 ---あなたが欠けているのは、 "ShowMessage(frmLogin.iUser);'フィールドを修飾することです(もちろん、iUserは整数なので失敗します)。 –

答えて

0

あなたが意図したとおりにその変数を使用する最も簡単な方法は、宣言をフォームクラスから移動するだけなので、常にグローバルに使用できます(フォームのインスタンスを作成およびアドレス指定する必要はありません)。

unit Login_u; 

interface 

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

type 
TfrmLogin = class(TForm) 
btnLogin: TButton; 
cbxUser: TComboBox; 
procedure btnLoginClick(Sender: TObject); 
private 
{ Private declarations } 
public 
{ Public declarations } 
end; 

var 
frmLogin: TfrmLogin; 
iUser:Integer; 

implementation 
uses Result_u; 
{$R *.dfm} 

procedure TfrmLogin.btnLoginClick(Sender: TObject); 
begin 
    iUser:= cbxUser.ItemIndex; 
    end; 
end; 
end. 

これで、すでに試したようにResult_uの中で使うことができます。

注:変数がフォームの各インスタンスで異なる値を保持する必要がある場合は、フォームクラスのパブリックセクション内で変数を宣言します(コードで行ったように)。

+1

公開されたグローバルバールは、通常、悪い考えです。なぜこれを提案するのですか? –

+0

私はそれが最も簡単なので、提案しました。彼は非常に基本的なもので失われているので、クラスやインスタンスを扱う前に、基本的な非OOプログラミングに精通している必要があります。 –

+0

彼はすぐそこにクラスとインスタンスを持っています –

2

通常、グローバル変数は使用しないでください。 IDEは、フォームを作成して起動時に自動的にフォームを作成するときに、グローバルフォーム変数を追加します。

これらの変数を削除し、起動時にこれらの変数を作成しないようにしてください。通常、起動時にはメインメニューで十分です。

ログインフォームはモーダルダイアログでなければなりません。 btnLoginボタンModalResultの値をmrOkに割り当てます。これは、ボタンが押されたときにこの結果でログインフォームが閉じられることを意味します。ユニットTfrmLoginuses Result_u;宣言は削除する必要があります。ここで

は、ログインフォームを作成する方法とTFrmLoginのインスタンスを通じてiUser値を取得する方法をデモンストレーションです:

unit Result_u; 

interface 

uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs, StdCtrls, Grids, DBGrids, jpeg, ExtCtrls; 

type 
    TfrmResult = class(TForm) 
    procedure TestLogin; 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

implementation 

uses Login_u; 

{$R *.dfm} 

procedure TfrmResult.TestLogin; 
var 
    frmLogin: TFrmLogin; 
begin 
    frmLogin := TFrmLogin.Create(Nil); 
    try 
    if frmLogin.ShowModal = mrOk then 
     ShowMessage('User login index is:'+IntToStr(frmLogin.iUser)); 
    finally 
    frmLogin.Free; 
    end; 
end; 

end. 
関連する問題