Delphi Component Creation.. Getting Beyond First Base -
i've used vbto starting point plus lot of study of delphi 6 user's guide. can make new component compile, can't figure way display can finish debugging it. , 50 years of programming experience isn't helping. here guts of component:
type tchangeevent = procedure(sender: tobject; v: string) of object; ttxtspnr = class(twincontrol) lbl: tlabel; txt: tedit; scrll: tscrollbar; private fonchange: tchangeevent; busy, tweaked: boolean; newvalue: string; protected procedure changed(v: string); dynamic; property onchange: tchangeevent read fonchange write fonchange; procedure scrllchange(sender: tobject); procedure scrllscroll(sender: tobject; scrollcode: tscrollcode; var scrollpos: integer); procedure txtenter(sender: tobject); procedure txtkeyup(sender: tobject; var key: word; shift: tshiftstate); procedure txtexit(sender: tobject); procedure txt_validate(var cancel: boolean); public function getcaption(): string; procedure setcaption(new_caption: string); function getmax(): smallint; procedure setmax(new_max: smallint); function maxof(a: double; b: longint): olevariant; function minof(a: olevariant; b: longint): olevariant; function getmin(): smallint; procedure setmin(new_min: smallint); function gettext(): string; procedure settext(new_text: string); constructor create(aowner: tcomponent); override; destructor destroy; override; published property caption: string read getcaption write setcaption; property enabled: boolean read getenabled write setenabled; property max: smallint read getmax write setmax; property min: smallint read getmin write setmin; property text: string read gettext write settext; end; var txtspnr: ttxtspnr; implementation uses math; {$r *.dfm} procedure ttxtspnr.changed(v: string); begin if assigned(fonchange) fonchange(self,v); end; constructor ttxtspnr.create(aowner: tcomponent); begin inherited create(aowner); lbl := tlabel.create(self); lbl begin parent := self; end; txt := tedit.create(self); txt begin parent := self; end; scrll := tscrollbar(self); scrll begin parent := self; end; end;
and here's test driver:
type tform1 = class(tform) ftxtspnr: ttxtspnr; procedure formcreate(sender: tobject); private { private declarations } public { public declarations } end; var form1: tform1; implementation {$r *.dfm} procedure tform1.formcreate(sender: tobject); begin ftxtspnr := ttxtspnr.create(self); ftxtspnr begin left:=10; top:=10; visible:=true; show; end; end;
but doesn't compile , says, in constructor, "an object can't own parent". take out parent settings, compiles doesn't display components. missing?
first,
scrll := tscrollbar(self);
should of course read
scrll := tscrollbar.create(self);
second,
ftxtspnr := ttxtspnr.create(self); ftxtspnr begin left:=10; top:=10; visible:=true; show; end;
should be
ftxtspnr := ttxtspnr.create(self); ftxtspnr begin parent := self; left := 10; top := 10; end;
you forgot set parent.
also, global variable
var txtspnr: ttxtspnr;
looks dangerous. if don't know why added 2 lines, should remove them.
Comments
Post a Comment