自定义的TMsgBox继承TShape类
TMsgBox = class(TShape)
  private
  
  public
  
    constructor Create(AOwner: TComponent);override;
  这个类的功能是,当鼠标在一个ScrollBox上移动时,触发ScrollBox1MouseMove事件,该类将显示出一个消息框,我初始化是在ScrollBox1MouseMove中调用   
GDMsgbox :TMsgBox; 

GDMsgbox:=TMsgBox.Create(ScrollBox1);运行时显示错误:Control '' has no parent window
请问初始化时是不是不应该传入ScrollBox1作为父窗口?还是其他原因?

解决方案 »

  1.   

    GDMsgbox:=TMsgBox.Create(ScrollBox1);不对啦
    ScrollBox1不对的,使用ScrollBox1的父类
      

  2.   

    GDMsgbox:=TMsgBox.Create(ScrollBox1);
    GDMsgbox.Parent := ScrollBox1; //add如果还有错,就把你的Create的代码贴出来看看
      

  3.   

    代码如下:
    Type
    TKind = (stlt,strt,stlb,strb);
    TMsgBox = class(TShape)
      private
        FMsg:TStrings;
      protected
        Kind:TKind;
        procedure Paint; override;
        procedure SetMsg(value:TStrings);
      public
        X,Y:Integer;
        property Canvas;
        constructor Create(AOwner: TComponent);override;
        procedure Redraw;
      published
        property Msg:TStrings read FMsg write SetMsg;
       property Canvas:TCanvas read FCanvas write SetCanvas;
      end;
     procedure Register;constructor TMsgBox.Create(AOwner: TComponent);
    begin
      inherited Create(AOwner);
      Kind:=stlt;
      Height:=28;Width:=80;
      Font.Color:=clBlack;
      FMsg := TStringList.Create;
    end;procedure TMsgBox.SetMsg(value:TStrings);
    var
      SH,SW:integer;
      I:integer;
    begin
      Msg.Assign(Value);
      SW:=0;SH:=0;
      Canvas.Font.Name:='宋体';
      Canvas.Font.Size:=9;
      for I:=0 to Msg.Count - 1 do
       begin
        Msg.strings[I+1]:=Msg.Strings[I];
        if Canvas.TextWidth(Msg.Strings[I]) > SW then //单步调试时,错误是在这里显示
           SW:=Canvas.TextWidth(Msg.Strings[I]);
        SH:=SH + Canvas.TextHeight(Msg.Strings[I]);
       end;
    ...我又调试了一下,好像不是我TMsgBox的问题,似乎是Canvas的问题,错误还是Control '' has no parent window
      

  4.   

    不好意思,上面贴错了,定义部分是这样的:
    Type
    TKind = (stlt,strt,stlb,strb);
    TMsgBox = class(TShape)
      private
        FMsg:TStrings;
      protected
        Kind:TKind;
        procedure Paint; override;
        procedure SetMsg(value:TStrings);
      public
        X,Y:Integer;
        property Canvas;
        constructor Create(AOwner: TComponent);override;
        procedure Redraw;
      published
        property Msg:TStrings read FMsg write SetMsg;
       //这行注释掉的property Canvas:TCanvas read FCanvas write SetCanvas;
      end;
     procedure Register;不知是不是我Canvas属性定义的方式不对?
      

  5.   

    procedure TMsgBox.SetMsg(value:TStrings);
    var
      SH,SW:integer;
      I:integer;
    begin
      if not Assigned(Parent) then Exit; //做一个检查先//Canvas.TextWidth计算宽度需要容器
    ///....
    end;另外注意,我前面贴的:
    GDMsgbox.Parent := ScrollBox1; //add你创建了Msgbox后,要给他设置一个容器
      

  6.   

    谢谢楼上,确实是GDMsgbox的问题,加了GDMsgbox.Parent := ScrollBox1就没问题了,但我感到奇怪了,帮助里说create方法的参数就是给它设置父类,怎么后面还要再设置一遍?
      

  7.   

    Create 传递的参数叫Owner - 拥有者,负责释放自己的资源,并不是Parent - 容器
    你可以搜索一下以前的帖子Owner Parent 区别