动态添加的可视控件比如TButton和TMenuitem无法自动的显示成xp效果。如果使用Active:=false;Active:=true如此的强制刷
新虽然可以,但是对于TMenuitem来说经常会出现异常,有时候还有其他错误,请看如下代码

procedure TForm1.T1Click(Sender: TObject);//T1是Mainmenu的MenuItem
var
sub:tmenuitem;
i:integer;
begin
  for i:=t1.Count-1 downto 0 do
  begin
    if t1.Items[i].Visible then
      t1.Delete(i);
  end;
  sub:=tmenuitem.Create(self);
  t1.Add(sub);//之所以要动态的添加子菜单项是因为有特殊的需要,比如在弹出子菜单的时候列出当前目录中的文件。(文件个数是不断变化的)
  sub.Caption:='test';
  xpmenu1.Active:=false;
  xpmenu1.Active:=true;
end;procedure TForm1.FormCreate(Sender: TObject);
var
hiddensub:tmenuitem;
begin
  T1.caption:='T';
  sss1.caption:='sss';  hiddensub:=tmenuitem.Create(self);
  hiddensub.Visible:=false;
  sss1.add(hiddensub);  hiddensub:=tmenuitem.Create(self);
  hiddensub.Visible:=false;
  t1.Add(hiddensub);
  {添加一个不可见子菜单,为的是在T1和sss1被显示出来的时候始终有子菜单的小三角箭头,以便鼠标移动道上面的时候触发T1Click事件。}
end;procedure TForm1.sss1Click(Sender: TObject);//sss1是Popupmenu的Item
var
sub:tmenuitem;
i:integer;
begin
  for i:=sss1.Count-1 downto 0 do
  begin
    if sss1.Items[i].Visible then
      sss1.Delete(i);
  end;
  sub:=tmenuitem.Create(self);
  sss1.Add(sub);//之所以要动态的添加子菜单项是因为有特殊的需要,比如在弹出子菜单的时候列出当前目录中的文件。(文件个数是不断变化的)
  sub.Caption:='PopupMenuItem';
  xpmenu1.Active:=false;
  xpmenu1.Active:=true;
end;
////////////////////////////////////////////////////
问题在于:
如果T1是tPopupmenu的项目,有时候会在xpmenu.pas单元的“procedure TControlSubClass.
ControlSubClass(var Message: TMessage);”方法的“  if (not XPMenu.FActive)  then”
这行出现异常;如果T1是tMainMenu的项目,那么T1的caption会成空或者缩短很多。并且永远不能弹出子菜单,总是在闪动。我在几乎见过的很多版本中都遇到这样的问题,哪位知道怎样解决?

解决方案 »

  1.   

    我觉得这个按件有问题
    BUG多多!!!!!!!!!!!
      

  2.   

    我也遇到XPMenu控件在Delphi7下无法将Toolbar中的按钮转为XP风格的。看来这套控件问题确实比较多。
      

  3.   

    不光是动态创建的。。我的程序中一个frame用道的popup菜单可以使用xp效果,但是窗体里面的popup却不可以
      

  4.   

    好像改不了吧
    xpmenu的机制是在创建的时候寻找所有已经存在的他支持的控件,
    然后重画他们,
    你动态生成的东西它怎么找得到。解决办法你让xpmenu那个话的函数重新话一下,要不只能重写xpmenu的机制
    不是找控件而是截获消息。这样才有可能
      

  5.   

    呵呵,想到一个办法,动态创建控件的时候同时在创建一个xpmenu然后把原来的xpmenu释放
    不知行不行