输入验证错误消息不起作用

问题描述 投票:0回答:1

我正在尝试创建一个过程,如果输入与条件不匹配,则显示错误消息。

这是我的代码:

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

到目前为止,我尝试了我所知道的一切,但我要么收到错误消息,要么开始无限创建标签。

delphi firemonkey delphi-11-alexandria
1个回答
0
投票

您将

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;
© www.soinside.com 2019 - 2024. All rights reserved.