如何在右键单击弹出窗体?

时间:2010-07-19 11:00:56

标签: delphi

当我右键单击TPaintBox时,我需要能够弹出一个TForm(表单的内容将取决于我点击的位置)。如果用户点击其他任何地方,我希望原始表单被销毁(或至少消失)。如果新的点击恰好是另一个右键单击TPaintBox,则必须出现一个新的TForm。基本上,它是一个右键单击属性查询类型操作,即右键单击以获取TPaintBox区域的属性。

这似乎比我想象的更难。当使用OnDeactivate事件停用pop时,我首先尝试销毁弹出窗体。这导致弹出窗口没有显示。

1 个答案:

答案 0 :(得分:4)

这是我的解决方案(测试和工作)......

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

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

享受!