database - Make Non-Windowed Component Data Aware -
i have non-windowed component date property. make component data aware read , write capabilities date field. (in other words, if change date @ runtime, write new date property value dataset.) have googled examples, haven't been able find any. found several read-only examples, e.g., tdblabel, none allow changes written dataset. if can point me example, grateful.
here generic code approach question
unit unit1; interface uses classes ,db ,dbctrls ; type tdataawarecomponent = class(tcomponent) private { private declarations } fdatalink : tfielddatalink; ffromdatechange : boolean; function getdatafield: string; function getdatasource: tdatasource; function getfield: tfield; function getreadonly: boolean; procedure setdatafield(const value: string); procedure setdatasource(const value: tdatasource); procedure setreadonly(const value: boolean); function getdateproperty: tdatetime; procedure setdateproperty(const value: tdatetime); protected { protected declarations } procedure datachange(sender : tobject); public { public declarations } constructor create(aowner : tcomponent);override; destructor destroy;override; public property field : tfield read getfield; property dateproperty : tdatetime read getdateproperty write setdateproperty; published { published declarations } property datasource : tdatasource read getdatasource write setdatasource; property datafield : string read getdatafield write setdatafield; property readonly : boolean read getreadonly write setreadonly; end; implementation { tdataawarecomponent } {------------------------------------------------------------------------------} constructor tdataawarecomponent.create(aowner: tcomponent); begin inherited create(aowner); fdatalink := tfielddatalink.create; fdatalink.control := self; fdatalink.ondatachange := datachange; end; {------------------------------------------------------------------------------} destructor tdataawarecomponent.destroy; begin fdatalink.free; fdatalink := nil; inherited; end; {------------------------------------------------------------------------------} procedure tdataawarecomponent.datachange(sender: tobject); begin // here visual object display underlying field value. // example if component tedit // code { if fdatalink.active self.text := field.asstring; , on exit event of tedit code reversed field can take value user entered. since not need ui interaction propably event useless you. } // of course there more issues should cover // have complete working solution. // demostration code. end; {------------------------------------------------------------------------------} function tdataawarecomponent.getdatafield: string; begin result := fdatalink.fieldname end; {------------------------------------------------------------------------------} function tdataawarecomponent.getdatasource: tdatasource; begin result := fdatalink.datasource; end; {------------------------------------------------------------------------------} function tdataawarecomponent.getdateproperty: tdatetime; begin //you not need separate property since can access directly field value. result := 0; if assigned(field) , (field.datatype in [fttime,ftdate,ftdatetime] result := field.asdatetime; end; {------------------------------------------------------------------------------} function tdataawarecomponent.getfield: tfield; begin result : fdatalink.field; end; {------------------------------------------------------------------------------} function tdataawarecomponent.getreadonly: boolean; begin result := fdatalink.readonly; end; {------------------------------------------------------------------------------} procedure tdataawarecomponent.setdatafield(const value: string); begin fdatalink.fieldname := value; end; {------------------------------------------------------------------------------} procedure tdataawarecomponent.setdatasource(const value: tdatasource); begin fdatalink.datasource := value; end; {------------------------------------------------------------------------------} procedure tdataawarecomponent.setdateproperty(const value: tdatetime); begin if assigned(field) begin ffromdatechange := true; try field.dataset.edit; field.value := value; ffromdatechange := false; end; end; end; {------------------------------------------------------------------------------} procedure tdataawarecomponent.setreadonly(const value: boolean); begin fdatalink.readonly := value; end; {------------------------------------------------------------------------------} end.
Comments
Post a Comment