右键单击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)并设置其位置,以便“上下文表单”的左上角恰好位于鼠标光标所在的位置。

在表单上的任何其他位置单击都会破坏上下文表单。

请享用!

10-07 17:43