【问题标题】:Passing a Variable to different forms / units将变量传递给不同的形式/单位
【发布时间】:2016-09-28 20:33:56
【问题描述】:

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

我想在 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. 

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

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.

我已经阅读了一些关于此的文章,但我一直迷路,我是一名高中生,所以不需要复杂的代码。

【问题讨论】:

  • 您需要在某处创建TFrmLogin 的实例。然后您可以通过该实例获取iUserfrmLoginInstance.iUser。通常你不应该使用全局 frmLogin 变量(删除它)并在你需要的地方声明它。也许在您的TFrmResult 声明中。并从Login_u 中删除uses Result_u
  • " 他们说我应该将变量放在公共声明中" - 没关系。 - “并在实施中'使用然后想要访问变量的单元'” - 这是不必要的,从'Login_u'中删除uses Result_u;。 - “也在想要访问该变量的单元中使用,然后是单元名称” - 没关系。 --- 你缺少的是限定字段 -> ShowMessage(frmLogin.iUser); (当然它会失败,因为 iUser 是一个整数)。

标签: forms delphi variables


【解决方案1】:

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

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

登录表单应该是一个模式对话框。为btnLogin 按钮分配ModalResultmrOk。这意味着当按下按钮时,登录表单将关闭并显示此结果。请注意,必须删除单元 TfrmLogin 中的 uses 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.

【讨论】:

    【解决方案2】:

    按您的意图使用该变量的最简单方法是将其声明移出表单类,因此它将是全局的,始终可用(无需创建和寻址表单的实例)。

    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 中使用它,就像您已经尝试过的那样。

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

    【讨论】:

    • 公共全局变量通常是个坏主意。为什么要提出这个建议。
    • 我提出它是因为它最容易理解。他对非常基本的东西迷失了方向,所以在尝试处理类和实例之前,也许他应该更加熟悉基本的非 OO 编程。
    • 它们是自动创建的,他的 cmets 可能不知道如何管理它们。
    • 试图避免学习这一点是徒劳的。最好尽快正视,否则坏习惯会根深蒂固。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-10
    • 2021-06-14
    • 2019-05-15
    • 2016-04-03
    • 1970-01-01
    • 2018-09-28
    相关资源
    最近更新 更多