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
Post a Comment