vcl - delphi component with a collection of TPictures -


i'm trying create vcl component timage, lets me add variable amount of different sized tpictures. goal able assign number of tpictures through vcl editor in property list.

delphi component property: tobjectlist<tpicture> here came conclusion, tcollection tcollectionitems should used. i'm trying now, many times before end compiler error: "published property 'pictures' can not of type array" in line: property pictures[index: integer]: tpic read getpic write setpic;

unit imagemultistates;  interface  uses   vcl.graphics, vcl.stdctrls, system.sysutils, system.classes, vcl.controls, vcl.extctrls, forms, generics.collections;  type    tpic = class(tcollectionitem)   private     fpicture: tpicture;   public     procedure assign(source: tpersistent); override;     constructor create(collection: tcollection); override;     destructor destroy; override;   published     property picture: tpicture read fpicture write fpicture;   end;    tpictures = class(tcollection)   private     function getpic(index: integer): tpic;     procedure setpic(index: integer; apicture: tpic);   public     constructor create;   published     property pictures[index: integer]: tpic read getpic write setpic;   end;    timagemultistates = class(timage)   private     fpictures: tpictures;   public     constructor create(aowner: tcomponent); override;     destructor destroy; override;     procedure activate(index: integer);   end;  procedure register;  implementation  constructor tpic.create(collection: tcollection); begin   inherited create(collection); end;  destructor tpic.destroy; begin   fpicture.free;   inherited destroy; end;  procedure tpic.assign(source: tpersistent); begin   fpicture.assign(source); end;   constructor tpictures.create; begin   inherited create(tpic); end;  procedure tpictures.setpic(index: integer; apicture: tpic); begin   items[index].assign(apicture); end;  function tpictures.getpic(index: integer): tpic; begin   result := tpic(inherited items[index]); end;   constructor timagemultistates.create(aowner: tcomponent); begin   inherited create(aowner); end;  destructor timagemultistates.destroy; begin   fpictures.free;   inherited destroy; end;  procedure timagemultistates.activate(index: integer); begin   picture.assign(fpictures.items[index]); end;  procedure register; begin   registercomponents('standard', [timagemultistates]); end;  end. 

since noone seems expect error thrown, maybe it's related installed components? used internal getit package-manager install jedi code library 2.8, jedi visual component library , pngcomponents 1.0. guess that's far timage-related components concerned. maybe 1 of these overrides of timage contents funky stuff...

i experimented little , derived tpicturepanel tpanel. has pictures property, tpictures, descendant of townedcollection , contains tpics. each tpic has picture property. can install component, , allows me edit pictures collection using called collection editor, allows add or remove tpic instances. if select tpic in collection editor, can assign picture picture property, i.e. load file, etc.

here working code tpicturepanel. can model component after this:

unit picturepanels;  interface  uses   system.sysutils, system.classes, vcl.controls, vcl.extctrls, vcl.graphics;  type   tpic = class(tcollectionitem)   private     fpicture: tpicture;     procedure setpicture(const value: tpicture);   public     procedure assign(source: tpersistent); override;     constructor create(aowner: tcollection); override;     destructor destroy; override;   published     property picture: tpicture read fpicture write setpicture;   end;    tpictures = class(townedcollection)   private     function getitem(index: integer): tpic;     procedure setitem(index: integer; const value: tpic);   public     constructor create(aowner: tpersistent);     property items[index: integer]: tpic read getitem write setitem;   end;    tpicturepanel = class(tpanel)   private     fpictures: tpictures;     procedure setpictures(const value: tpictures);   published     constructor create(aowner: tcomponent); override;     destructor destroy; override;     property pictures: tpictures read fpictures write setpictures;   end;  procedure register;  implementation  procedure register; begin   registercomponents('samples', [tpicturepanel]); end;  { tpicturepanel }  constructor tpicturepanel.create(aowner: tcomponent); begin   inherited;   fpictures := tpictures.create(self); end;  destructor tpicturepanel.destroy; begin   fpictures.free;   inherited; end;  procedure tpicturepanel.setpictures(const value: tpictures); begin   fpictures.assign(value); end;  { tpic }  procedure tpic.assign(source: tpersistent); begin   inherited;   if source tpic     fpicture.assign(tpic(source).fpicture); end;  constructor tpic.create(aowner: tcollection); begin   inherited;   fpicture := tpicture.create; end;  destructor tpic.destroy; begin   fpicture.free;   inherited; end;  procedure tpic.setpicture(const value: tpicture); begin   fpicture.assign(value); end;  { tpictures }  constructor tpictures.create(aowner: tpersistent); begin   inherited create(aowner, tpic); end;  function tpictures.getitem(index: integer): tpic; begin   result := inherited getitem(index) tpic; end;  procedure tpictures.setitem(index: integer; const value: tpic); begin   inherited setitem(index, value); end;  end. 

Comments