2016-09-28 2 views
0

메인 폼의 변수를 다른 폼에서 사용하고 싶습니다. 각 폼에는 자체 단위가 있습니다.다른 폼/유닛에 변수 전달하기

은 내가 '변수에 액세스하려고 사용하고 단위'그들은 내가 구현 공공 선언하고 아래에있는 변수를 넣어해야한다고 말했다 기사를 발견 Result_u

에 Login_u에서 IUSER를 사용하고 싶습니다. 또한 그것은 내가 오류 선언되지 않은 identififier을 얻을 내 결과 단위에서 변수

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. 

을하고 싶어 곳에서 구현 용도에 따라 그 변수 다음 단위 이름에 액세스하려고 단위로, 나는 활성화 절차를 사용 단지 시험과 쇼 메시지가

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. 

나는 이것에 대해 몇 가지 기사를 읽고 그러나 나는 복잡한 코드 할 필요가 나던 그래서 나는 고등학교 학생이야, 잃어버린 유지한다.

+0

어딘가에 당신은 TFrmLogin' '의 인스턴스를 만들 필요가 : 여기

는 로그인 양식을 만드는 방법 TFrmLogin의 인스턴스를 통해 iUser 값을 얻을하는 방법을 데모입니다. 그러면 그 인스턴스를 통해'iUser'를 얻을 수 있습니다 :'frmLoginInstance.iUser'. 일반적으로 전역 변수'frmLogin'을 사용해서는 안됩니다. 아마도'TFrmResult' 선언 안에서. 또한'Login_u'에서'Result_u'를 제거합니다. –

+0

* "그들은 변수를 public 선언에 넣어야한다고 말했습니다."* - 괜찮습니다. - "* and under implementation"에서 변수 '*'에 액세스하고자하는 유닛을 사용합니다. - 불필요한 경우 'Login_u'에서'Result_u uses '를 제거하십시오. - * "구현 용도에서 해당 변수에 액세스하려는 단위에서 또한 단위 이름"* - 그렇습니다. 괜찮습니다. --- 당신이 누락 된 부분은 ->'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에서 사용할 수 있습니다.

참고 : 폼의 모든 인스턴스에서 변수가 다른 값을 유지해야하는 경우 (코드에서와 마찬가지로) 폼 클래스의 public 섹션 내에 변수를 선언합니다.

+1

공개 된 글로벌 vars는 일반적으로 좋지 않습니다. 왜 이것을 제안할까요? –

+0

이해하기 쉽기 때문에 제안했습니다.그는 매우 기본적인 것들로 길을 잃어 가고 있기 때문에 클래스와 인스턴스를 다루기 전에 기본 OO가 아닌 프로그래밍에 익숙해 져야합니다. –

+0

그는 바로 거기에 클래스와 인스턴스가 있습니다. –

2

일반적으로 전역 변수를 사용하면 안됩니다. IDE는 양식을 작성할 때 전역 양식 변수를 추가하고 양식을 시작할 때 자동으로 작성합니다.

이러한 변수를 삭제하고 시작할 때 생성하지 않도록하십시오. 일반적으로 시작시 주 메뉴로 충분합니다.

로그인 양식은 모달 대화 상자 여야합니다. btnLogin 버튼 ModalResult의 값을 mrOk으로 지정하십시오. 즉, 버튼을 누를 때이 결과로 로그인 양식이 닫힙니다. uses Result_u; 선언을 TfrmLogin 단위로 제거해야합니다.

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. 
관련 문제