C++BUILDER OnVirtualKeyboardShown 和 OnVirtualKeyboardHidden 从另一种形式触发
C++BUILDER OnVirtualKeyboardShown and OnVirtualKeyboardHidden firing from another form
我在 C++Builder Tokyo 10.2 中有一个移动项目(Android 和 IOS)。
它有 3 种形式(还),并且它们都有一些 TEdits。
每个表单都有自己的 'FormVirtualKeyboardShown' 和 'FormVirtualKeyboardHidden' 函数。
我在每个(FormVirtualKeyboardShown 函数)中都有一个 'Focused->GetObject()' 来获取哪个 TEdit 是焦点。
问题是:所有 'FormVirtualKeyboardShown' 函数都在触发,无论调用哪个表单。
我尝试更改 .CPP、.H 和 .FMX 文件中的函数名称,使函数名称对我的所有项目都是唯一的。
但仍然没有工作。它以所有形式调用所有函数。
因此,我在包含 dynamic_cast 代码的行中收到一条错误消息。
---------------------------
Debugger Exception Notification
---------------------------
Project Project1.apk raised exception class Segmentation fault (11).
它试图从另一个表单获取 TEdit,然后出现错误。
我是 FMX 的新手,我从来没有见过这样的东西。
这是我的部分代码:
Unit1.cpp
void __fastcall TForm1::FormVirtualKeyboardShown(TObject *Sender, bool KeyboardVisible,const TRect &Bounds)
{
int num;
TControl * LFocused = dynamic_cast<TControl*>(Focused->GetObject());
num = LFocused->ComponentIndex;
ShowMessage("Index of TEdit from Form ONE is "+ IntToStr(num));
}
Unit2.cpp
void __fastcall TForm2::FormVirtualKeyboardShown(TObject *Sender, bool KeyboardVisible,const TRect &Bounds)
{
int num;
TControl * LFocused = dynamic_cast<TControl*>(Focused->GetObject());
num = LFocused->ComponentIndex;
ShowMessage("Index of TEdit from Form TWO is "+ IntToStr(num));
}
Unit3.cpp
void __fastcall TForm3::FormVirtualKeyboardShown(TObject *Sender, bool KeyboardVisible,const TRect &Bounds)
{
int num;
TControl * LFocused = dynamic_cast<TControl*>(Focused->GetObject());
num = LFocused->ComponentIndex;
ShowMessage("Index of TEdit from Form THREE is "+ IntToStr(num));
}
我的观点是:我需要确切地知道哪个 TEdit 是 Focus。所以我可以正确地采取行动。
我是否只需要在 Unit1.cpp (Form1) 中创建这些功能(FormVirtualKeyboardShown 和 FormVirtualKeyboardHidden)?
因此,所有其他形式的 TEdits 都会触发 Form1 中的这些功能。
如果是这样...我如何确定哪个 TEdit 具有焦点?来自任何表格???
我正在使用 C++Builder 10.2 Tokyo 25.0.26309.314
请大家帮帮我!
谢谢!
我无法评论为什么多个表单会同时触发相同的 VirtualKeyboard 事件。对我来说,这听起来像是 FireMonkey 中的一个错误。除非 KeyboardVisible
参数仅在一个事件中为 true
而在其他两个事件中为 false
,这将是一个奇怪的设计选择。
但即便如此,这应该很容易解决,例如:
Unit1.cpp
void __fastcall TForm1::FormVirtualKeyboardShown(TObject *Sender, bool KeyboardVisible, const TRect &Bounds)
{
if (!KeyboardVisible) return;
_di_IControl ctrl = Focused;
if (!ctrl) return;
if (Screen->FocusControl != ctrl) return;
TControl * LFocused = static_cast<TControl*>(ctrl->GetObject());
int num = LFocused->ComponentIndex;
ShowMessage("Index of TEdit from Form ONE is " + IntToStr(num));
}
Unit2.cpp
void __fastcall TForm2::FormVirtualKeyboardShown(TObject *Sender, bool KeyboardVisible,const TRect &Bounds)
{
if (!KeyboardVisible) return;
_di_IControl ctrl = Focused;
if (!ctrl) return;
if (Screen->FocusControl != ctrl) return;
TControl * LFocused = static_cast<TControl*>(ctrl->GetObject());
int num = LFocused->ComponentIndex;
ShowMessage("Index of TEdit from Form TWO is " + IntToStr(num));
}
Unit3.cpp
void __fastcall TForm3::FormVirtualKeyboardShown(TObject *Sender, bool KeyboardVisible,const TRect &Bounds)
{
if (!KeyboardVisible) return;
_di_IControl ctrl = Focused;
if (!ctrl) return;
if (Screen->FocusControl != ctrl) return;
TControl * LFocused = static_cast<TControl*>(ctrl->GetObject());
int num = LFocused->ComponentIndex;
ShowMessage("Index of TEdit from Form THREE is " + IntToStr(num));
}
我在 C++Builder Tokyo 10.2 中有一个移动项目(Android 和 IOS)。 它有 3 种形式(还),并且它们都有一些 TEdits。 每个表单都有自己的 'FormVirtualKeyboardShown' 和 'FormVirtualKeyboardHidden' 函数。 我在每个(FormVirtualKeyboardShown 函数)中都有一个 'Focused->GetObject()' 来获取哪个 TEdit 是焦点。
问题是:所有 'FormVirtualKeyboardShown' 函数都在触发,无论调用哪个表单。 我尝试更改 .CPP、.H 和 .FMX 文件中的函数名称,使函数名称对我的所有项目都是唯一的。 但仍然没有工作。它以所有形式调用所有函数。
因此,我在包含 dynamic_cast 代码的行中收到一条错误消息。
---------------------------
Debugger Exception Notification
---------------------------
Project Project1.apk raised exception class Segmentation fault (11).
它试图从另一个表单获取 TEdit,然后出现错误。 我是 FMX 的新手,我从来没有见过这样的东西。 这是我的部分代码:
Unit1.cpp
void __fastcall TForm1::FormVirtualKeyboardShown(TObject *Sender, bool KeyboardVisible,const TRect &Bounds)
{
int num;
TControl * LFocused = dynamic_cast<TControl*>(Focused->GetObject());
num = LFocused->ComponentIndex;
ShowMessage("Index of TEdit from Form ONE is "+ IntToStr(num));
}
Unit2.cpp
void __fastcall TForm2::FormVirtualKeyboardShown(TObject *Sender, bool KeyboardVisible,const TRect &Bounds)
{
int num;
TControl * LFocused = dynamic_cast<TControl*>(Focused->GetObject());
num = LFocused->ComponentIndex;
ShowMessage("Index of TEdit from Form TWO is "+ IntToStr(num));
}
Unit3.cpp
void __fastcall TForm3::FormVirtualKeyboardShown(TObject *Sender, bool KeyboardVisible,const TRect &Bounds)
{
int num;
TControl * LFocused = dynamic_cast<TControl*>(Focused->GetObject());
num = LFocused->ComponentIndex;
ShowMessage("Index of TEdit from Form THREE is "+ IntToStr(num));
}
我的观点是:我需要确切地知道哪个 TEdit 是 Focus。所以我可以正确地采取行动。
我是否只需要在 Unit1.cpp (Form1) 中创建这些功能(FormVirtualKeyboardShown 和 FormVirtualKeyboardHidden)? 因此,所有其他形式的 TEdits 都会触发 Form1 中的这些功能。 如果是这样...我如何确定哪个 TEdit 具有焦点?来自任何表格???
我正在使用 C++Builder 10.2 Tokyo 25.0.26309.314
请大家帮帮我! 谢谢!
我无法评论为什么多个表单会同时触发相同的 VirtualKeyboard 事件。对我来说,这听起来像是 FireMonkey 中的一个错误。除非 KeyboardVisible
参数仅在一个事件中为 true
而在其他两个事件中为 false
,这将是一个奇怪的设计选择。
但即便如此,这应该很容易解决,例如:
Unit1.cpp
void __fastcall TForm1::FormVirtualKeyboardShown(TObject *Sender, bool KeyboardVisible, const TRect &Bounds)
{
if (!KeyboardVisible) return;
_di_IControl ctrl = Focused;
if (!ctrl) return;
if (Screen->FocusControl != ctrl) return;
TControl * LFocused = static_cast<TControl*>(ctrl->GetObject());
int num = LFocused->ComponentIndex;
ShowMessage("Index of TEdit from Form ONE is " + IntToStr(num));
}
Unit2.cpp
void __fastcall TForm2::FormVirtualKeyboardShown(TObject *Sender, bool KeyboardVisible,const TRect &Bounds)
{
if (!KeyboardVisible) return;
_di_IControl ctrl = Focused;
if (!ctrl) return;
if (Screen->FocusControl != ctrl) return;
TControl * LFocused = static_cast<TControl*>(ctrl->GetObject());
int num = LFocused->ComponentIndex;
ShowMessage("Index of TEdit from Form TWO is " + IntToStr(num));
}
Unit3.cpp
void __fastcall TForm3::FormVirtualKeyboardShown(TObject *Sender, bool KeyboardVisible,const TRect &Bounds)
{
if (!KeyboardVisible) return;
_di_IControl ctrl = Focused;
if (!ctrl) return;
if (Screen->FocusControl != ctrl) return;
TControl * LFocused = static_cast<TControl*>(ctrl->GetObject());
int num = LFocused->ComponentIndex;
ShowMessage("Index of TEdit from Form THREE is " + IntToStr(num));
}