当用户离开时,我必须检查TEdit-> Text的值,如果值错误,则将其返回到TEdit。下面的代码在VCL中运行良好,但在FMX中不起作用。所以它会发出哔哔声,但不会返回。
void __fastcall TForm1::Edit1Exit(TObject *Sender)
{
if (Edit1->Text != "123")
{
Beep();
Edit1->SetFocus();
}
}
它只是一个简单的形式,只有2个TEdits。我做错了什么,怎么做对了?
答案 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()会与我不清楚的内容同步。