unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, ComCtrls, ToolWin, StdCtrls, ActnList, ExtCtrls;type
TForm1 = class(TForm)
published
Button1: TButton;
PopupMenu1: TPopupMenu;
N11: TMenuItem;
N21: TMenuItem;
N31: TMenuItem;
procedure Button1Click(Sender: TObject);
procedure N11Click(Sender: TObject);
procedure N21Click(Sender: TObject);
procedure N31Click(Sender: TObject);
private
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
s:string;
implementation{$R *.dfm}
procedure TForm1.N11Click(Sender: TObject);
begin
s:=(Sender as TMenuItem).Caption ;
end;procedure TForm1.N21Click(Sender: TObject);
begin
s:=(Sender as TMenuItem).Caption ;
end;procedure TForm1.N31Click(Sender: TObject);
begin
s:=(Sender as TMenuItem).Caption ;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
PopupMenu1.Popup((Sender as TButton).Left +10,(Sender as TButton).Top+10 ) ;
ShowMessage(s);//第一次显示为空,第二次显示为上一次单击时的标题
ShowMessage(s);//显示的是当前点击的弹出菜单的标题
end;
end.procedure TForm1.Button1Click(Sender: TObject);
begin
PopupMenu1.Popup((Sender as TButton).Left +10,(Sender as TButton).Top+10 ) ;
ShowMessage(s);//第一次显示为空,第二次显示为上一次单击时的标题
ShowMessage(s);//显示的是当前点击的弹出菜单的标题
end;
两次不同,有人能说出原因吗,如何解决?
ShowMessage(s);//显示的是当前点击的弹出菜单的标题,调用赋值了实际上,你F8单步跟踪一下就知道为什么了。
然后系统执行菜单的事件,给S赋值。
最后是ShowMessage(s);
执行顺序是: 弹出 第一个showmessage 点击菜单 第二个showmessage
最重要的是,ShowMessage是Delphi窗体,如果用API MessageBox就不会这样了
procedure TForm1.Button1Click(Sender: TObject);
begin
PopupMenu1.Popup((Sender as TButton).Left +10,(Sender as TButton).Top+10 ) ;
Application.ProcessMessages
ShowMessage(s);
ShowMessage(s);
end;
1、弹出
2、点击菜单
3、关闭弹出菜单
4、第一个showmessage
5、执行菜单点击事件函数,即S的赋值语句
6、第二个showmessage
S两次显示的值不一样,原因是第一个ShowMessage是在菜单点击事件处理函数之前执行,而第二个则是之后确是消息处理顺序问题,但和ShowMessage框是Delphi窗体没有关系,换成API MessageBox结果相同,实际上换成ShowMessBox、Application.MessageBox、MessageDlg、MessageBox都一样
1、弹出
2、点击菜单
3、执行菜单点击事件函数,即S的赋值语句
4关闭弹出菜单
5、第一个showmessage,但是由于这此之前没有与别的进程通讯的机会,所以程序在运行到这儿时,变不知道S的值已经改变.
6、第二个showmessage,由于第一个 showmessage时得到了一次通讯的机会,过程内部更新了S的值,也就是点击过后的新值,出现值不一样也是这个原因!