我正在我的 FMX 应用程序中开发类似于 Microsoft Teams 的标记功能。
它在 Teams 中的外观如下:
现在在我的版本中,我还想向弹出窗口添加编辑字段和其他内容。
我开始尝试使用TPopup
,但问题是,如果您单击弹出窗口TEdit
内的 ,弹出窗口将关闭。由于 中的WndProc
代码FMX.Platform.Win
:
WM_ACTIVATE:
begin
if not ((TFmxFormState.Recreating in LForm.FormState) or (LForm.FormStyle = TFormStyle.Popup) or
WindowHandleToPlatform(LForm.Handle).FDisableDeactivate) then
begin
if LoWord(wParam) <> 0 then
begin
if HiWord(wParam) = 0 then
LForm.Activate;
// If the window is minimized, then do nothing.
end
else
begin
PrepareClosePopups;
LForm.Deactivate;
ClosePopupList; // This is called when clicking on edit on popup
end;
end;
Result := 0;
end;
ClosePopupList
在单击弹出窗口内部时调用TEdit
,此函数关闭弹出窗口。
因此我改用TForm
并解决了该问题,但在显示带有我的备忘录的表格后Show
不再具有焦点。
我希望将焦点放在备忘录上,除非我们点击弹出窗口内的编辑,在这种情况下,编辑应该获得焦点,弹出窗口应该保持打开状态。如果我点击弹出窗口外,则弹出窗口应该关闭。
有办法解决这个问题吗?
这应该可行。
主窗体单元
弹出表单单元
注意:设置
PopupForm.FormStyle
为StayOnTop
。计时器
单击弹出窗口时,它会被激活,但主窗体的备忘录会首先失去焦点。因此,如果
TMainForm.MemoExit
直接隐藏弹出窗口,弹出窗口也会被隐藏。因此,我们启动一个计时器,计时器完成后会隐藏弹出窗口。为了避免在单击弹出窗口时隐藏它,我们取消了TPopupForm.FormActivate
计时器,因此只有在这种情况下,弹出窗口才会继续显示。在其他情况下,弹出窗口会关闭。备忘录失去焦点后会立即激活弹出窗口,因此计时器的间隔不需要很长。我将其设置为 10(毫秒),这对我来说没问题。
我把计时器放在主窗体上,但把它放在弹出窗体上应该也可以,这样就避免了弹出窗体单元引用主窗体单元的需要。