Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 当一个已经创建的动态组件被激活时,如何激活事件处理程序(如oneter/OnExit)来激发呢?_Delphi - Fatal编程技术网

Delphi 当一个已经创建的动态组件被激活时,如何激活事件处理程序(如oneter/OnExit)来激发呢?

Delphi 当一个已经创建的动态组件被激活时,如何激活事件处理程序(如oneter/OnExit)来激发呢?,delphi,Delphi,我目前正在编写一个学校项目。我为一个可能的问题提前道歉 我需要为一个虚构的NGO建立一个系统,我需要让所有用户在使用该程序时注册和登录 我使用editbox和maskedit来接收登录数据。登录屏幕有两个编辑框,一个用于用户名,一个用于密码。注册屏幕是相同的表单,大小已调整,并带有两个附加的动态编辑框:一个用于确认密码,另一个用于用户的电子邮件地址 现在,我让静态editbox包含一个默认值:如果用户输入editbox,那么默认值就会消失。如果用户随后退出编辑框而不输入任何值,则会重新显示默认值

我目前正在编写一个学校项目。我为一个可能的问题提前道歉

我需要为一个虚构的NGO建立一个系统,我需要让所有用户在使用该程序时注册和登录

我使用editbox和maskedit来接收登录数据。登录屏幕有两个编辑框,一个用于用户名,一个用于密码。注册屏幕是相同的表单,大小已调整,并带有两个附加的动态编辑框:一个用于确认密码,另一个用于用户的电子邮件地址

现在,我让静态editbox包含一个默认值:如果用户输入editbox,那么默认值就会消失。如果用户随后退出编辑框而不输入任何值,则会重新显示默认值。我还没有设法让动态编辑框也这么做


当一个已经创建的动态组件被激活时,如何激活事件处理程序(如oneter/OnExit)以激活它?

如果您使用的是一个支持XP+视觉样式的相对现代的Delphi版本,那么
TEdit
有一个
TextHint
属性,它完全满足您的需要,根本不需要使用任何事件

procedure TMyForm.FormCreate(Sender: TObject);
var
  Edit: TEdit;
begin
  Edit := TEdit.Create(Self);
  Edit.Parent := ...;
  ...
  Edit.TextHint := 'default text here';
end;
否则,如果确实要使用事件,则可以执行以下操作:

procedure TMyForm.FormCreate(Sender: TObject);
var
  Edit: TEdit;
begin
  Edit := TEdit.Create(Self);
  Edit.Parent := ...;
  ...
  Edit.Text := 'default text here';
  Edit.OnEnter := EditEnter;
  Edit.OnExit := EditExit;
end;

procedure TMyForm.EditEnter(Sender: TObject);
begin
  if TEdit(Sender).Text = 'default text here' then
    TEdit(Sender).Text := '';
end;

procedure TMyForm.EditExit(Sender: TObject);
begin
  if TEdit(Sender).Text = '' then
    TEdit(Sender).Text := 'default text here';
end;

如果您使用的是支持XP+视觉样式的相对现代的Delphi版本,那么
TEdit
有一个
TextHint
属性,它完全满足您的需要,而不需要使用任何事件

procedure TMyForm.FormCreate(Sender: TObject);
var
  Edit: TEdit;
begin
  Edit := TEdit.Create(Self);
  Edit.Parent := ...;
  ...
  Edit.TextHint := 'default text here';
end;
否则,如果确实要使用事件,则可以执行以下操作:

procedure TMyForm.FormCreate(Sender: TObject);
var
  Edit: TEdit;
begin
  Edit := TEdit.Create(Self);
  Edit.Parent := ...;
  ...
  Edit.Text := 'default text here';
  Edit.OnEnter := EditEnter;
  Edit.OnExit := EditExit;
end;

procedure TMyForm.EditEnter(Sender: TObject);
begin
  if TEdit(Sender).Text = 'default text here' then
    TEdit(Sender).Text := '';
end;

procedure TMyForm.EditExit(Sender: TObject);
begin
  if TEdit(Sender).Text = '' then
    TEdit(Sender).Text := 'default text here';
end;

您只需将要设置的事件属性指定给IDE在双击IDE中的事件时创建的过程,例如MyForm.OnShow:=FormShow。一开始可能会有点困惑…如中所示。虽然您可以在运行时分配事件,但您知道吗,如果不需要,您可以在设计时放置控件,并在运行时隐藏控件?您只需将要设置的事件属性指定给在IDE中双击事件时IDE创建的过程,例如MyForm.OnShow:=FormShow。一开始可能看起来有点混乱…如中所示。虽然您可以在运行时分配事件,但您是否知道,您可以在设计时放置控件,如果不需要,可以在运行时隐藏控件?