要求多个label同时显示相同内容,也就是说如何让多个label的caption属性指向同一个内存地址,当这个地址内容改变时这些label的caption将自动变更

解决方案 »

  1.   

    不如这样更实在,省得去绞尽脑汁。
    procedure TForm1.Button1Click(Sender: TObject);
    const
      LabelCaption = 'Test';
    var
      i :integer;
    begin
      for i := 0 to ComponentCount-1 do
        if Components[i] is TLabel then
          TLabel(Components[i]).Caption := LabelCaption;
    end;
      

  2.   

    我自己用消息的方法变通后达到目的了,谢谢各位!
    这个需求有一定的特殊性,因为这些label在不同的窗体中,我在每个窗体中定义了消息,然后通过设置全局变量给这些窗体发送消息
    帖子过几天结,希望还有高人出现。
      

  3.   

    即使指向了同一块区域,还是得通知内容更改了,刷新才能显示,这是其一,最大的问题,是Label释放的时候,他所指向的文本的区域也要释放,如果你指向了同一个地址,那么释放肯定会出问题,第一个Label释放没问题,但是后面的就不行了,是要出错的,除非HOOK,SysFreeMem,那样就没意义了Type
      TMyLabel=Class(TLabel);
    var
      ps : PChar;procedure TForm1.FormCreate(Sender: TObject);
    begin
      ps := StrAlloc(30);
      ZeroMemory(ps , 30);
      StrCopy(ps , PChar(DateTimeToStr(Now())));  //让Lebel要显示的内容指向了ps这个指针
      TMyLabel(Label1).WindowText := ps;
      //调整一下,AutoSize等操作
      TMyLabel(Label1).AdjustBounds;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      //修改指针处的值
      ZeroMemory(ps , 30);
      StrCopy(ps , PChar(DateTimeToStr(Now())));
      //必须调用这句,或者相关的刷新操作才能马上显示
      Label1.Refresh; //或者 Self.Refresh;
    end;
    因此,还是用消息通知,逐个赋值得了.
      

  4.   

    释放问题,刚想起,
    可以在Form.OnClose中

    TMyLabel(Label1).WindowText := NIL;
    来去掉,但是通知更新必须的作,
      

  5.   

    设置一个全局的TList一个全局的函数用于向TList添加Label控件,一个全局函数用于从Tlist中移除Label控件,一个全局函数用于改变Tlist中所有Label控件内容(一个简单的循环就可以)每当一个窗体创建后,就调用添加函数,向全局TList添加相应的Label,窗口关闭时调用移除函数。要改变内容时,调用一次改变内容的函数就行了。
      

  6.   


    procedure TForm1.Button1Click(Sender: TObject);
    const
      LabelCaption = 'Test';
    var
      i :integer;
    begin
      for i := 0 to ComponentCount-1 do
      if Components[i] is TLabel then
      TLabel(Components[i]).Caption := LabelCaption;
    end;
    另外 可以通过sendmessage 的形式触发该事件