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

pdsfdshx  于 2023-10-18  发布在  其他
关注(0)|答案(1)|浏览(100)

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

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
我尝试了我所知道的一切,但到目前为止,我要么得到错误消息,要么它开始无限地创建标签。

lzfw57am

lzfw57am1#

你有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;

相关问题