我正在尝试创建一个过程,如果输入与条件不匹配,则显示错误消息。
下面是我的代码:
procedure TForm_Main.Input(Edit: TEdit; I: Integer);
var
Error_Text: TLabel;
begin
if (Assigned(Error_Text)) then
begin
Error_Text.Text := '';
Error_Text.Visible := False;
end
else
begin
Error_Text := TLabel.Create(Edit);
Error_Text.Parent := Edit;
Error_Text.TextSettings.FontColor := TAlphaColors.Red;
Error_Text.Position.Y := 25;
Error_Text.AutoSize := True;
Error_Text.Visible := False;
end;
if Edit.Text.IsEmpty then
begin
Error_Text.Text := '';
Error_Text.Visible := False;
end
else
begin
case I of
1:
begin
if not TRegEx.IsMatch(Edit.Text, '^\d+$') then
begin
Error_Text.Text := 'Error: Input must contain only numbers.';
Error_Text.Visible := True;
end
else
begin
Error_Text.Text := '';
Error_Text.Visible := False;
end;
end;
2:
begin
if not TRegEx.IsMatch(Edit.Text, '^[A-Za-z]+$') then
begin
Error_Text.Text := 'Error: Input must contain only characters.';
Error_Text.Visible := True;
end
else
begin
Error_Text.Text := '';
Error_Text.Visible := False;
end;
end;
3:
begin
if not TRegEx.IsMatch(Edit.Text, '^[A-Za-z0-9]+$') then
begin
Error_Text.Text := 'Error: Input must contain only characters and numbers.';
Error_Text.Visible := True;
end
else
begin
Error_Text.Text := '';
Error_Text.Visible := False;
end;
end;
end;
end;
我把它叫做ontyping事件:
procedure TForm_Main.Edit_Code_TypeTyping(Sender: TObject);
begin
Input(Edit_Code_Type, 1)
end;
这是预期的结果:
enter image description here
这是我得到的结果:
enter image description here
我尝试了我所知道的一切,但到目前为止,我要么得到错误消息,要么它开始无限地创建标签。
1条答案
按热度按时间lzfw57am1#
你有
Error_Text
作为方法中的局部变量。局部变量在方法调用之间不保留,它们的值也不设置为任何默认值。因此,Error_Text
可能在每次调用方法时都是nil,在这种情况下,每次对其分配的测试都会导致一个新的标签,或者它可能是一些随机值,在这种情况下,您将尝试设置无效的控件的文本。为什么要在运行时创建标签?为什么不在设计时创建标签?你也有很多不必要的代码。隐藏空标签没有什么意义,因为您在任何情况下都不会看到它。
我会在设计时创建标签,并将代码重写为如下内容: