type TxxCtl =class(TGraphicControl)
  private
 Fpic:TBitMap;
   public
 procedure SetPic(val:Tbitmap);
  published
  property Picture:TBitMap read GetPic write SetPic;
end;.....
.....
procedure TxxCtl.SetPic(val:Tbitmap);
var
 pic:Tbitmap;
begin
 if val<>0 then fpic:=val else
 if picOpen.Execute then
begin
pic:=Tbitmap.Create;
pic.LoadFromFile( picOpen.FileName);
fpic:=pic;
end;
end;当控件放进Form后,给Picture赋值时,picOpen会出来两次,请问应该覆盖哪个事件函数

解决方案 »

  1.   

    出现两次是因为“fpic:=pic;”
    改为:
    procedure TxxCtl.SetPic(val:Tbitmap);
    begin
      fpic := val;
      if (fpic = nil) and (picOpen.Execute) then
      begin
        fpic := Tbitmap.Create;
        fpic.LoadFromFile( picOpen.FileName);
      end;
    end;—————————————————————————————————
    宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
    —————————————————————————————————
      

  2.   


    初始化两次中一次是系统调用的,一次是你自己调用的,
    基本上所有控件被修改的属性在启动时都会初始化两次。解决办法:
     我觉得你的给属性赋值得方法 SetPic 很不合理,不应该在这里创建
     对象只有在组件外创建对象赋进来才对。要不干脆在组件本身的create
     函数中就个初始化了。
      

  3.   

    对不起大家,问题复杂化了:
    procedure TCard.SetPic(val:Tbitmap);
    begin
    if val<> nil then fpic.Assign(val) ;
    end;
    即可解决问题。