为全局变量赋值

时间:2014-02-06 22:34:28

标签: delphi variables global assign

我是Delphi的初学者,目前正在RAD XE5学生版中练习。

我已经制作了两个单元,在第一个中我在INTERFACE部分中指定了一个变量

像这样:

interface
var
Globalstring : integer;

然后我通过

为这个变量赋值
TextInput.Text = GlobalString

每当我尝试在我的第二个单元中调用globalstring时,我得到一个空白.. :(

2014年8月2日

好的伙计们,我很抱歉缺乏信息,我已经感到沮丧。它确实不是真正的代码,整数确实是一个字符串,所以这里遵循真正的代码来清除所有的混淆

unit Unit1;

interface
uses FMX.Effects, FMX.StdCtrls, FMX.Controls,
     System.Classes, System.SysUtils, System.Types, System.UITypes,  System.Variants,
     FMX.Types, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Edit, FMX.Filter.Effects, FMX.Objects, Unit2;

type
 TForm1 = class(TForm)
 EditUser: TEdit;
 EditPass: TEdit;
 btnLogin: TButton;
 Label1: TLabel;
 chkGuest: TCheckBox;
 Label2: TLabel;
 SlideTransitionEffect1: TSlideTransitionEffect;
 Image1: TImage;
 procedure btnLoginClick(Sender: TObject);
 procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public

end;

var
 Form1: TForm1;
 UserLogin : string;


implementation

{$R *.fmx}

uses Unit4,Unit3,Unit5;

procedure TForm1.btnLoginClick(Sender: TObject);

begin
  Unit2.UsernameJef:= 'Jef'; Unit2.UsernameDennis :='Dennis';
  Unit2.PasswordJef:= '123'; Unit2.PassWordDennis :='456';

if ((EditUser.text=Unit2.UsernameJef) and (EditPass.text=Unit2.PasswordJef))
  or ((EditUser.text=Unit2.UsernameDennis) and (EditPass.text=Unit2.PassWordDennis))
    then form4.Show
      else Label1.Visible := true;



if (EditUser.Text= 'Guest')
  or (chkGuest.IsChecked = true)
   then Form5.Show;

UserLogin := EditUser.Text;

end;

procedure TForm1.FormCreate(Sender: TObject);
begin

end;

end.

接下来是单元4,我实际上使用了这个“全局变量”。

我希望在用户登录后在我的应用程序中显示欢迎消息,在本例中为“Welcome Jef”或“Welcome Dennis”

procedure TForm4.FormCreate(Sender: TObject);
begin
lblWelkom.Text := Unit1.UserLogin

end ;

end.

3 个答案:

答案 0 :(得分:2)

我不知道你做错了什么,因为你没有发布必要的代码。但是,我会解释一些你似乎对编程有误解的事情,也许这会有所帮助。否则,请使用两个单元的相关信息更新您的问题(我们不是全部psychic)。

程序将代码作为一系列指令执行。一些指令调用其他指令。无论在第一个设置全局变量的单元中有什么代码,该变量在实际更改它的指令执行之前不会改变。

所以,请尝试以下方法:

  • 在单元1中设置全局的代码行上设置一个断点。
  • 另一个代码行,用于读取单元2中的全局。
  • 运行您的程序。
  • 你可能会发现程序停在单元1断点之前的单元2断点
  • 这意味着更改值的说明尚未执行
  • (并且不会执行直到另一行调用将导致它执行的相应指令。)

当然还有其他可能性(但如前所述,我们需要代码才能进行调试):

  • 在其他地方可能会有另一个指令清除您之前设置的值。
  • 虽然您在单元1全局变量中使用了变量,但您可能会发现单元2正在查看完全不同的值 - 恰好具有相同的名称。
  • 全局变量相对简单,但如果您使用的是对象,则还必须考虑两个引用是否都使用了同一个类的实例。
  • 编辑:PS:当然,如果您使用=期望设置值,您会发现它没有。 =是比较运算符。 :=分配运算符;当使用它时,右侧表达式的结果将被分配给 LEFT 上的变量(全局,本地,字段,参数)。

编辑:

所以,如果你遵循我之前的建议:在lblWelkom.Text := Unit1.UserLoginUserLogin := EditUser.Text;上放置一个断点。您会发现,在您分配之前,您正在阅读UserLogin 的值。 LU RD解释了为什么它不起作用,以及如何解决它。

答案 1 :(得分:0)

Delphi的基本基础之一是您必须明确指定兼容类型,尤其是在IntegerString之间。您的全局变量名为Globalstring,但它已声明为Integer。因此,当您尝试将此整数分配给编辑控件的text属性时,它将无法编译,因为类型不匹配。

IntToStr的简单调用可以解决问题。有许多类似的函数可以将各种类型转换为其他类型。

TextInput.Text:= IntToStr(GlobalString);

记住这些信息。您需要了解编译器为您提供的错误,警告和提示。这是标准做法,以确保没有。当然,在您甚至可以首先获得已编译的应用程序之前,显然需要注意错误。

但是你的设计存在重大缺陷。您不应声明Integer的名称引用String。这只会导致未来的维护问题。您应该始终使用描述性名称声明变量,以便您(和其他人)能够理解什么是。

答案 2 :(得分:0)

您的应用程序启动时会创建unit4中的表单,因此lblWelkom.Text将被分配一个空白值,因为Unit1.UserLoginTForm1.btnLoginClick结束前没有获得值。

进行此项工作的最小更改是在lblWelkom.Text事件中设置OnShow。 在调用UserLogin之前,还要定义全局Form4.Show

通常你应该避免使用全局值。您的Form4可能有一个属性UserName,您在调用Show之前设置了该属性。

TForm4 =
...
private
  FUserName: String;
public
  property UserName : String read FUserName write FUserName;
...
end;

OnShow事件中:

procedure TForm4.FormShow(Sender: TObject);
begin
  lblWelkom.Text := UserName;
end;