将用户保留在 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() 与我不清楚的同步。
我必须在用户离开时检查 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() 与我不清楚的同步。