将用户保留在TEdit中

时间:2017-11-23 15:47:45

标签: firemonkey setfocus

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

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

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

2 个答案:

答案 0 :(得分:0)

我将在Delphi Firemonkey中提供解决方案。希望,相同的原则适用于C ++ Firemonkey。以下代码使用单词'无效'替换Edit1中的无效文本。并将焦点返回到Edit1,其中包含'无效'选择准备好过度打字。

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;

答案 1 :(得分:0)

我写了一个简单的程序:

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

使用线程,但没有Synchronize我有

Edit1 exit
Edit1->SetFocus()
Edit2 enter

那么,Synchronize()会与我不清楚的内容同步。