Forms 将变量传递给不同的形式/单位

Forms 将变量传递给不同的形式/单位,forms,delphi,variables,Forms,Delphi,Variables,我想在另一种形式中使用主形式的变量,每个形式都有自己的单位 我想在结果中使用登录的iUser 我发现了一篇文章,他们说我应该把变量放在公共声明中,并在实现中“使用然后是想要访问变量的单元”。另外,在要访问实现中的变量的单元中,使用,然后是要从中获取变量的单元名称 unit Login_u; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs,

我想在另一种形式中使用主形式的变量,每个形式都有自己的单位

我想在结果中使用登录的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. 
在我的结果单元中,我得到了未声明的错误标识符,我使用了激活过程和显示消息作为测试

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.

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

按照您的意愿使用该变量的最简单方法是将其声明移出表单类,这样它将是全局的,始终可用(无需创建和处理表单实例)

现在您可以在Result_中使用它,正如您已经尝试过的那样


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

按照您的意愿使用该变量的最简单方法是将其声明移出表单类,这样它将是全局的,始终可用(无需创建和处理表单实例)

现在您可以在Result_中使用它,正如您已经尝试过的那样


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

通常不应使用全局变量。IDE在创建表单时添加全局表单变量,并在启动时自动创建它们

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

登录表单应该是一个模式对话框。将
btnLogin
按钮的值指定为
mrOk
。这意味着当按下按钮时,登录表单将关闭并显示此结果。注意,
使用Result\uTfrmLogin
中的代码>声明

下面演示如何创建登录表单,以及如何通过
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.

通常不应该使用全局变量。IDE在创建表单时添加全局表单变量,并在启动时自动创建它们

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

登录表单应该是一个模式对话框。将
btnLogin
按钮的值指定为
mrOk
。这意味着当按下按钮时,登录表单将关闭并显示此结果。注意,
使用Result\uTfrmLogin
中的代码>声明

下面演示如何创建登录表单,以及如何通过
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.

您需要在某个地方创建
TFrmLogin
的实例。然后可以通过该实例获得
iUser
frmLoginInstance.iUser
。通常,您不应该使用全局
frmLogin
变量(将其删除)并在需要时在本地声明它。可能在
TFrmResult
声明中。并且从
Login\u
中删除
uses Result\u
“他们说我应该把变量放在公共声明中”-没关系“在实现下‘使用然后是想要访问变量的单元’”——这是不必要的,删除
使用结果来自“登录”“同样在要访问实现下的变量的单元中使用,然后是单元名称”-没关系。--您缺少的是限定字段->
ShowMessage(frmLogin.iUser)
(当然会失败,因为iUser是一个整数)。您需要在某处创建
TFrmLogin
的实例。然后可以通过该实例获得
iUser
frmLoginInstance.iUser
。通常,您不应该使用全局
frmLogin
变量(将其删除)并在需要时在本地声明它。可能在
TFrmResult
声明中。并且从
Login\u
中删除
uses Result\u
“他们说我应该把变量放在公共声明中”-没关系“在实现下‘使用然后是想要访问变量的单元’”——这是不必要的,删除
使用结果来自“登录”“同样在要访问实现下的变量的单元中使用,然后是单元名称”-没关系。--您缺少的是限定字段->
ShowMessage(frmLogin.iUser)(当然会失败,因为iUser是整数)。公共全局变量通常不是个好主意。为什么要提出这个呢?我之所以提出这个,是因为它最容易理解。他对非常基本的东西迷茫了,所以在尝试处理类和实例之前,也许他应该更加熟悉基本的非OO编程。这些类和实例是自动创建的,根据他的评论,他可能不知道如何管理它们。试图避免学习这些是徒劳的。最好尽快面对它,否则坏习惯将根深蒂固。公共全球VAR通常是个坏主意。为什么要提出这个呢?我之所以提出这个,是因为它最容易理解。他对非常基本的东西迷茫了,所以在尝试处理类和实例之前,也许他应该更熟悉基本的非OO编程。这些类和实例是自动创建的,他可能不知道如何管理它们。试图避免学习是徒劳的