右键单击TPaintBox时,我需要能够弹出TForm(表单的内容取决于我单击的位置)。如果用户单击其他任何位置,我希望原始表单被销毁(或至少消失)。如果新的碰巧恰好是在TPaintBox上的另一次右键单击,则必须出现一个新的TForm。基本上,这是右键单击属性查询类型的操作,即右键单击以获取TPaintBox区域的属性。
这似乎比我想象的要难。我首先尝试使用OnDeactivate事件禁用弹出窗口时销毁弹出窗口。这导致不显示弹出窗口。
最佳答案
这是我的解决方案(经过测试并可以正常工作)...
type
TForm1 = class(TForm)
...
private
ContextForm: TfrmContext;
end;
...
implementation
procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if ContextForm <> nil then
FreeAndNil(ContextForm);
if Button = mbRight then
begin
ContextForm := TfrmContext.Create(Application);
ContextForm.SetParentComponent(Application);
ContextForm.Left := Mouse.CursorPos.X;
ContextForm.Top := Mouse.CursorPos.Y;
ContextForm.Show;
end;
end;
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if ContextForm <> nil then
FreeAndNil(ContextForm);
end;
在此演示中,右键单击Button1将创建您的“上下文表单”(它是TForm)并设置其位置,以便“上下文表单”的左上角恰好位于鼠标光标所在的位置。
在表单上的任何其他位置单击都会破坏上下文表单。
请享用!