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;
两次不同,有人能说出原因吗,如何解决?

解决方案 »

  1.   

    ShowMessage(s);//第一次显示为空,第二次显示为上一次单击时的标题,还没有赋值
    ShowMessage(s);//显示的是当前点击的弹出菜单的标题,调用赋值了实际上,你F8单步跟踪一下就知道为什么了。
      

  2.   

    PopupMenu1.Popup 弹出后,其实是相当于一个模式窗体。这时 s:='';当你点了菜单后,系统先关闭了这个弹出窗体,这时执行了第一个ShowMessage(s);
    然后系统执行菜单的事件,给S赋值。
    最后是ShowMessage(s);
      

  3.   

    正确
    执行顺序是: 弹出 第一个showmessage 点击菜单 第二个showmessage
      

  4.   

    消息处理的问题
    最重要的是,ShowMessage是Delphi窗体,如果用API  MessageBox就不会这样了
      

  5.   

    实际应该同一过程内是顺序执行的,本来第一句Popup后执行第二句ShowMessage时,菜单事件并未执行,而ShowMessage窗体是DELPHI的,Show的同时还会处理其它事件,它给了菜单消息事件执行的机会,就造成了菜单事件过程插入了两个ShowMessage语句之间这种诡异的事情...
      

  6.   

    谢谢大家,问题解决(群里的朋友给的答案): DELPHI 共和国QQ群: 9613541//DELPHI 共和国QQ群: 9613541
    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;
      

  7.   

    ysai 说出了问题的所在,但是没有给出答案,所以我就平分了分了,谢谢各位!
      

  8.   

    修改一下,执行顺序是: 
    1、弹出 
    2、点击菜单
    3、关闭弹出菜单
    4、第一个showmessage
    5、执行菜单点击事件函数,即S的赋值语句
    6、第二个showmessage
    S两次显示的值不一样,原因是第一个ShowMessage是在菜单点击事件处理函数之前执行,而第二个则是之后确是消息处理顺序问题,但和ShowMessage框是Delphi窗体没有关系,换成API MessageBox结果相同,实际上换成ShowMessBox、Application.MessageBox、MessageDlg、MessageBox都一样
      

  9.   

    错了实际上应为:
    1、弹出
    2、点击菜单
    3、执行菜单点击事件函数,即S的赋值语句
    4关闭弹出菜单
    5、第一个showmessage,但是由于这此之前没有与别的进程通讯的机会,所以程序在运行到这儿时,变不知道S的值已经改变.
    6、第二个showmessage,由于第一个 showmessage时得到了一次通讯的机会,过程内部更新了S的值,也就是点击过后的新值,出现值不一样也是这个原因!