Delphi 如何在右键单击时弹出表单?

Delphi 如何在右键单击时弹出表单?,delphi,Delphi,当我右键单击TPaintBox时,我需要能够弹出一个TForm(表单的内容将取决于我单击的位置)。如果用户单击其他任何地方,我希望原始表单被销毁(或至少消失)。如果新的单击恰好是TPaintBox上的另一次右键单击,则必须显示新的TForm。基本上,这是一种右键单击属性查询类型的操作,即右键单击以获取TPaintBox区域的属性 这似乎比我想象的要困难。我第一次尝试销毁弹出表单是在使用OnDeactivate事件停用弹出表单时。这导致弹出窗口未显示。这是我的解决方案(已测试并正在运行) 类型 T

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

这似乎比我想象的要困难。我第一次尝试销毁弹出表单是在使用OnDeactivate事件停用弹出表单时。这导致弹出窗口未显示。

这是我的解决方案(已测试并正在运行)

类型
TForm1=类(TForm)
...
私有的
ContextForm:TfrmContext;
终止
...
实施
程序t用于m1.按钮1鼠标向下(发送方:ToObject;按钮:TMouseButton;Shift:tShift状态;X,Y:整数);
开始
如果ContextForm为零,则
FreeAndNil(上下文形式);
如果按钮=mbRight,则
开始
ContextForm:=TfrmContext.Create(应用程序);
SetParentComponent(应用程序);
ContextForm.Left:=Mouse.CursorPos.X;
ContextForm.Top:=Mouse.CursorPos.Y;
ContextForm.Show;
终止
终止
过程TForm1.FormMouseDown(发送方:TObject;按钮:TMouseButton;Shift:TShiftState;X,Y:整数);
开始
如果ContextForm为零,则
FreeAndNil(上下文形式);
终止
在本演示中,右键单击按钮1将创建“上下文表单”(这是一个TForm),并设置其位置,使“上下文表单”的左上角正好位于鼠标光标所在的位置

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

享受吧

这是我的解决方案(经过测试并正在运行)

类型
TForm1=类(TForm)
...
私有的
ContextForm:TfrmContext;
终止
...
实施
程序t用于m1.按钮1鼠标向下(发送方:ToObject;按钮:TMouseButton;Shift:tShift状态;X,Y:整数);
开始
如果ContextForm为零,则
FreeAndNil(上下文形式);
如果按钮=mbRight,则
开始
ContextForm:=TfrmContext.Create(应用程序);
SetParentComponent(应用程序);
ContextForm.Left:=Mouse.CursorPos.X;
ContextForm.Top:=Mouse.CursorPos.Y;
ContextForm.Show;
终止
终止
过程TForm1.FormMouseDown(发送方:TObject;按钮:TMouseButton;Shift:TShiftState;X,Y:整数);
开始
如果ContextForm为零,则
FreeAndNil(上下文形式);
终止
在本演示中,右键单击按钮1将创建“上下文表单”(这是一个TForm),并设置其位置,使“上下文表单”的左上角正好位于鼠标光标所在的位置

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

享受吧

很遗憾史蒂夫“问了又跑”(当然他的统计数据会显示这一点)意味着这个问题可能永远不会被标记为已回答(即使是):(很遗憾史蒂夫“问了又跑”(当然他的统计数据会显示这一点)意味着这个问题可能永远不会被标记为已回答(即使是):(
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;