popupmenu的如何使用? (50分)

  • 主题发起人 主题发起人 kmyan
  • 开始时间 开始时间
K

kmyan

Unregistered / Unconfirmed
GUEST, unregistred user!
我现在动态生成弹出菜单,如何确定是单击了那一项?是在onchage还是在onpopup事件?
 
onpop表示弹出时的动作
 
在菜单项的OnClick里处理不就行了
 
to kang:popupmenu没有onclick事件
我的是动态生成的菜单项目,所以要先确定用户单击是哪个?
不知道单击了哪一项?
procedure TForm1.PopupMenu1Change(Sender: TObject; Source: TMenuItem;
Rebuild: Boolean);
var
imna:string;
begin
with Sender as TMenuItem do
begin
Imna:=Caption;
showmessage(imna);
end;
end;
//但结果不能实现
 
动态生成菜单项是可以加入OnClick事件啊.OnChange事件是菜单被修改后触发的。

AItem := TMenuItem.Create....
AItem.OnClick = .....
 
to delphi:
AItem := TMenuItem.Create....
AItem.OnClick =button2.onclick;
这样不能实现
 
错了,
首先创建时:
AItem := TMenuItem.Create....
AItem.OnClick =Menuclick;
AItem.hint:=index;//???
然后:
procedure TForm1.Menuclick(Sender: TObject);
begin
with Sender as TMenuItem do
begin
{if caption=your TMenuItem1 caption then do thing1
else
if caption=your TMenuItem2 caption then do thing2
........
}
{
case hint of
1:thing1;
2:thing2;
...
这是我个人的诀窍,利用hint变量,可以在创建多个控件时使用。
}
Imna:=Caption;
showmessage(imna);
end;
end;
 
给你一个例子,Delphi帮助里就有例子。

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Menus;

type
TForm1 = class(TForm)
pop: TPopupMenu;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
procedure MenuItemClick(Sender: TObject);
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
AItem: TMenuItem;
I: Integer;
begin
for I := 0 to 2 do
begin
AItem := TMenuItem.Create(pop.Items);
AItem.Caption := 'Item ' + IntToStr(I);
AItem.Tag := I;
AItem.OnClick := MenuItemClick;
pop.Items.Add(AItem);
end;
end;

procedure TForm1.MenuItemClick(Sender: TObject);
begin
showmessage(inttostr(TMenuItem(Sender).Tag));
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
pop.Popup(10, 10);
end;

end.
 
谢谢各位,脑筋锈那不开窍了
但还有个问题,pop的位置怎么控制,比方说放个按钮,要求在这个按钮的上方,就像输入法的那样
 
Popup后面的参数就是位置啊,不过是屏幕坐标,不是窗口坐标。
例如,要在当前鼠标位置弹出菜单,
var
P: TPoint;
begin
GetCursorPos(P);
pop.Poup(P.X, P.Y);
end;
 
delphi:
谢谢你,我又准备了50分给你,呵呵
但我那个问题不是获得鼠标位置,而是如何获得一个控件在屏幕上的坐标?
就像windows的选择输入法一样
 
可以利用ClientToScreen函数将窗口坐标转变成为屏幕坐标。
例如下面代码可以在button1的下面显示一个菜单。

procedure TForm1.Button1Click(Sender: TObject);
var
P: TPoint;
begin
P := ClientToScreen(Point(Button1.Left + Button1.Width div 2, Button1.Top + Button1.Height));
popupmenu1.Popup(P.X, P.y);
end;
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Db, Grids, DBGrids, DBTables, Menus;

type
TSave = procedure(Sender: TObject) of Object;

TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
procedure Save(Sender: TObject);
end;

var
Form1: TForm1;

implementation

{$R *.DFM}


procedure TForm1.Save(Sender: TObject);
var
OpenDlg: TOpenDialog;
begin
OpenDlg := TOpenDialog.Create(Self);
OpenDlg.Execute;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
myPopupMenu: TPopupMenu;
myMenuItem: TMenuItem;
i: integer;
p: TPoint;
begin
myPopupMenu := TPopupMenu.Create(Self);
for i := 1 to 3 do
begin
myMenuItem := TMenuItem.Create(myPopupMenu);
myMenuItem.Tag := i;
case i of
1: myMenuItem.Caption := '新建';
2: begin
myMenuItem.Caption := '保存';
myMenuItem.OnClick := Save;
end;
3: myMenuItem.Caption := '删除';
end;
myPopupMenu.Items.Add(myMenuItem);
end;
GetCursorPos(p);
myPopupMenu.Popup(p.x,p.y)
end;


end.
 
to delphi:
还有分等你拿
http://www.delphibbs.com/delphibbs/dispq.asp?lid=991892
 
谢谢各位!
 
后退
顶部