我正在尝试创建一个过程,如果输入与条件不匹配,则显示错误消息。
这是我的代码:
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;
这是预期的结果:
这是我得到的结果:
到目前为止,我尝试了我所知道的一切,但我要么收到错误消息,要么开始无限创建标签。
您将
Error_Text
作为方法中的局部变量。在方法调用之间不会保留局部变量,并且它们的值不会设置为任何默认值。因此,每次调用该方法时,Error_Text
可能是nil,在这种情况下,您对其分配的测试每次都会产生一个新标签,或者它可能是某个随机值,在这种情况下,您将尝试设置无效控件的文本。
为什么要在运行时创建标签?为什么不在设计时创建标签? 您还有很多不必要的代码。隐藏空标签没有什么意义,因为在任何情况下你都不会看到它。
我会在设计时创建标签,并将代码重写为如下所示:
procedure TForm_Main.Input(Edit: TEdit; I: Integer);
begin
Error_Text.Text := '';
if not Edit.Text.IsEmpty then
begin
case I of
1: if not TRegEx.IsMatch(Edit.Text, '^\d+$')
then Error_Text.Text := 'Error: Input must contain only numbers.';
2: if not TRegEx.IsMatch(Edit.Text, '^[A-Za-z]+$')
then Error_Text.Text := 'Error: Input must contain only characters.';
3: if not TRegEx.IsMatch(Edit.Text, '^[A-Za-z0-9]+$')
then Error_Text.Text := 'Error: Input must contain only characters and numbers.';
end; {case}
end; {if}
end;