我是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.
答案 0 :(得分:2)
我不知道你做错了什么,因为你没有发布必要的代码。但是,我会解释一些你似乎对编程有误解的事情,也许这会有所帮助。否则,请使用两个单元的相关信息更新您的问题(我们不是全部psychic)。
程序将代码作为一系列指令执行。一些指令调用其他指令。无论在第一个设置全局变量的单元中有什么代码,该变量在实际更改它的指令执行之前不会改变。
所以,请尝试以下方法:
当然还有其他可能性(但如前所述,我们需要代码才能进行调试):
=
期望设置值,您会发现它没有。 =
是比较运算符。 :=
是分配运算符;当使用它时,右侧表达式的结果将被分配给 LEFT 上的变量(全局,本地,字段,参数)。编辑:
所以,如果你遵循我之前的建议:在lblWelkom.Text := Unit1.UserLogin
和UserLogin := EditUser.Text;
上放置一个断点。您会发现,在您分配之前,您正在阅读UserLogin
的值。 LU RD解释了为什么它不起作用,以及如何解决它。
答案 1 :(得分:0)
Delphi的基本基础之一是您必须明确指定兼容类型,尤其是在Integer
和String
之间。您的全局变量名为Globalstring
,但它已声明为Integer
。因此,当您尝试将此整数分配给编辑控件的text属性时,它将无法编译,因为类型不匹配。
对IntToStr
的简单调用可以解决问题。有许多类似的函数可以将各种类型转换为其他类型。
TextInput.Text:= IntToStr(GlobalString);
记住这些信息。您需要了解编译器为您提供的错误,警告和提示。这是标准做法,以确保没有。当然,在您甚至可以首先获得已编译的应用程序之前,显然需要注意错误。
但是你的设计存在重大缺陷。您不应声明Integer
的名称引用String
。这只会导致未来的维护问题。您应该始终使用描述性名称声明变量,以便您(和其他人)能够理解什么是。
答案 2 :(得分:0)
您的应用程序启动时会创建unit4中的表单,因此lblWelkom.Text
将被分配一个空白值,因为Unit1.UserLogin
在TForm1.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;