//以下是核心代码.
type
  PRSActionList=^TRSActionList;
  TRSActionList=array of TAction;procedure TMainform.Button1Click(Sender: TObject);
var
  RSActionList:TRSActionList;
begin
  SetLength(RSActionList,4);
  RSActionList[0]:=acOpen;
  RSActionList[1]:=acEdit;
  RSActionList[2]:=acSave;
  RSActionList[3]:=acCancel;
  //ShowMessage('Low='+IntToStr(Low(RSActionList))+ 'High='+IntToStr(High(rsActionList)));
  PostMessage(Application.Handle,rsMsg,rs_ToolCaption,Integer(@RSActionList));
end;procedure TMainform.apevt1Message(var Msg: tagMSG; var Handled: Boolean);begin
  if Msg.message=rsMsg then
    case Msg.wParam of
      rs_ToolCaption:begin
        SetToolBar(PRSActionList(Msg.lParam)^);
        Handled:=True;
      end;
    end;
end;
procedure TMainform.SetToolBar(RSActionList:TRSActionList);
{功能:这个过程用来设置 Toobar
}
var
  SI:SmallInt;
  strTB:string;
  Comp:TComponent;
begin
  Comp:=nil;
  ShowMessage('Low='+IntToStr(Low(RSActionList))+ ' High='+IntToStr(High(rsActionList)));
  //显示Low=0,High=-1为什么???????????
  for SI:=Low(RSActionList) to High(rsActionList) do begin
    strTB:='tb'+trim(IntToStr(SI+1));
    Comp:=FindComponent(strTB);
    if Comp<>nil then begin
      (Comp as TToolButton).Action:=rsActionList[SI];
      (Comp as TToolButton).Visible:=True;
    end;
  end;end;

解决方案 »

  1.   

    一个上午csdn\delphibox\delphibbs
    都没有得到答案,就连回复的人都没有,晕了.
      

  2.   

    1 建议将TRSActionList=array of TAction;改为TList类这样更简单.
    2 PostMessage(Application.Handle,rsMsg,rs_ToolCaption,Integer(@RSActionList));
    中的Application.Handle是否应该改为Handle,因为你要向主窗体发送消息而不是向应用程序窗体发送消息.3 你的错误发生在哪一行给多点信息吗.
      

  3.   

    消息是没有错误的,我追踪过的
    //显示Low=0,High=-1为什么???????????
      for SI:=Low(RSActionList) to High(rsActionList) do begin
    这里来就不错了.
      

  4.   

    linzhengqun(风。愿我能) 的回复,
    我的目的每一个Toolbar上的btn都动态的对一个Action,因此我
    觉得我的思路是没有问题的.
      

  5.   

    var
      RSActionList:TRSActionList;我想这里
    当Button1Click(Sender: TObject);
    RSActionList为一局部变量
    当它离开作用域,就被释放
    而PostMessage是发送完消息就返回而apevt1Message
    取得的只是那个被释放的局部变量1.
    把你的RSActionList声明为TMainForm的成员变量2.或者用SendMessage
    但就不能用OnMessage;直接写消息处理句柄
    procedure OnRsMessage(var Msg: TMessage); message rsMessage;很久不用delphi了,错了别怪我,呵
      

  6.   

    不好意思,写错
    procedure OnRsMessage(var Msg: TMessage); message rsMsg;
      

  7.   

    procedure TMainform.Button1Click(Sender: TObject);
    var
      RSActionList:TRSActionList;
    begin
      SetLength(RSActionList,4);
      RSActionList[0]:=acOpen;
      RSActionList[1]:=acEdit;
      RSActionList[2]:=acSave;
      RSActionList[3]:=acCancel;
      //ShowMessage('Low='+IntToStr(Low(RSActionList))+ 'High='+IntToStr(High(rsActionList)));
      PostMessage(Application.Handle,rsMsg,rs_ToolCaption,Integer(@RSActionList));
      ShowMessage('Low='+IntToStr(Low(RSActionList))+ 'High='+IntToStr(High(rsActionList)));
      //加上這個看看結果
    end;
      

  8.   

    type
      PRSActionList=^TRSActionList;
      TRSActionList=array of TAction;是全局的,要不都编译不过.
      

  9.   

    非常感谢 Randomize() 照你的方法终于搞定,为什么这样呢,
    PostMessage(Application.Handle,rsMsg,rs_ToolCaption,Integer(@RSActionList));
    加上这一句 ShowMessage('Low='+IntToStr(Low(RSActionList))+ 'High='+IntToStr(High(rsActionList)));
    就OK了,再照你的
    var
      RSActionList:TRSActionList;我想这里
    当Button1Click(Sender: TObject);
    RSActionList为一局部变量
    当它离开作用域,就被释放
    而PostMessage是发送完消息就返回而apevt1Message
    取得的只是那个被释放的局部变量1.
    把你的RSActionList声明为TMainForm的成员变量就完全OK了,看你对消息还是有很消息的理解的,非常大哥马上埋单
    只是还一问题Toolbar上的btn可以显示图标不能显示Caption而我已把
    Toolbar.ShowCaption:=true;设计期间是可以看得的Caption的.
      

  10.   

    老DM說的對,在ONCLICK過程後釋放已經吧RSActionList釋放了,SHOWMESSAGE在POST以後仍執行消息,直到循環倒SHOWMESSAGE(我加的哪個),這個過程種代表ONCLICK沒有執行完畢,所以顯示的是3就不是-1了.改為TFORM變量就可
      

  11.   

    怪事,如果在设计期间把其中一个设为可视那么运行以上代码就所有都可以
    显示Caption,晕……
      

  12.   

    ShowCaption屬性是TOOLBAR的屬性,不是TOOLBUTTON的屬性
      

  13.   

    (Comp as TToolButton).Caption:=RSActionList[SI].caption也都不行.
      

  14.   

    (Comp as TToolButton).Action:=rsActionList[SI];
    這就已經直接復制過去了,如果再(Comp as TToolButton).Caption:=RSActionList[SI].caption屬於多余操作.
      

  15.   

    我也是这么想原始代码中是没有只是测试,为什么出现这样的原因呢,
    非常 Randomize() 顶力支持.