首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >将变量传递给不同的形式/单元

将变量传递给不同的形式/单元
EN

Stack Overflow用户
提问于 2016-09-29 04:33:56
回答 2查看 1.6K关注 0票数 0

我想在另一个窗体中使用我的主窗体中的变量,每个窗体都有自己的单元。

我想在Result_u中使用Login_u中的iUser

我发现了一篇文章,他们说我应该把变量放在公共声明中,并在实现下‘使用,然后是想要访问变量的单元’。同样,在想要在实现下访问该变量的单元中使用,然后使用它想要从中获取变量的单元名称

代码语言:javascript
代码运行次数: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
  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. 

在我的结果单元中,我得到了错误未声明的标识符,我使用了激活过程和一条show消息作为测试

代码语言:javascript
代码运行次数:0
运行
复制
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.

我读过一些关于这方面的文章,但我总是迷路,我是一个高中生,所以它不需要复杂的代码。

EN

回答 2

Stack Overflow用户

发布于 2016-09-29 06:12:38

通常你不应该使用全局变量。IDE会在您创建窗体时添加全局窗体变量,并在启动时自动创建它们。

试着养成删除这些变量的习惯,并避免在启动时创建它们。正常情况下,只有主菜单在启动时是足够的。

登录表单应该是一个模式对话框。为btnLogin按钮指定ModalResultmrOk。这意味着当按钮被按下时,登录表单将关闭,并显示此结果。请注意,必须删除单元TfrmLogin中的uses Result_u;声明。

下面是如何创建登录表单以及如何通过TFrmLogin实例获取iUser值的演示:

代码语言:javascript
代码运行次数:0
运行
复制
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.
票数 2
EN

Stack Overflow用户

发布于 2016-09-29 04:58:07

使用该变量的最简单方法是将它的声明移出form类,这样它就是全局的、始终可用的(不需要创建和寻址form的实例)。

代码语言:javascript
代码运行次数: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中使用它,就像您已经尝试过的那样。

注意:当一个变量需要在窗体的每个实例中保存不同的值时,可以在窗体类的公共部分中声明该变量(就像您在代码中所做的那样)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39757159

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档