将用户保留在 TEdit 中

Keep a user in a TEdit

我必须在用户离开时检查 TEdit->Text 的值,如果值错误,则 return 他到 TEdit。下面的代码在 VCL 中运行良好,但在 FMX 中不起作用。所以它会发出哔哔声但不会 return.

void __fastcall TForm1::Edit1Exit(TObject *Sender)
{
if (Edit1->Text != "123")
    {
    Beep();
    Edit1->SetFocus();
    }
}

它是一个简单的形式,只有2个TEdits。我做错了什么以及如何做对?

我将在 Delphi Firemonkey 中提供解决方案。希望相同的原则适用于 C++ Firemonkey。以下代码将 Edit1 中的无效文本替换为单词 'Invalid' 并将焦点 returns 替换为 Edit1,并选择了 'Invalid' 准备好输入。

procedure TForm1.Edit1Validate(Sender: TObject; var Text: string);
begin
  if Text <> '123' then
  begin
    Text := 'Invalid';
    TThread.CreateAnonymousThread(
    procedure
      begin
        TThread.Synchronize(nil,
         procedure
          begin
            Edit1.SetFocus;
          end);
      end).Start;
  end;
end;

我写了一个简单的程序:

void __fastcall TForm1::Edit1Exit(TObject *Sender)
{
TThread::CreateAnonymousThread(
    [=]()
    {
    TThread::Synchronize (NULL, [=](){
        Memo1->Lines->Add("Edit1->SetFocus()");
        });
    })->Start();
Memo1->Lines->Add("Edit1 exit");
}
//--------------------------------------------------------------------------
void __fastcall TForm1::Edit2Enter(TObject *Sender)
{
Memo1->Lines->Add("Edit2 enter");
}

一个窗体上有三个控件:2 个 TEdits 和一个 TMemo1。当我运行它并从TEdit1跳转到TEdit2时,我在备忘录上有:

Edit1 exit
Edit2 enter
Edit1->SetFocus()

没有线程,我会

Edit1->SetFocus()
Edit1 exit
Edit2 enter

有线程,但没有同步我有

Edit1 exit
Edit1->SetFocus()
Edit2 enter

那么,什么 Synchronize() 与我不清楚的同步。