FlatCtrdb.pas 112 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283
  1. unit FlatCtrdb;
  2. interface
  3. {$I FlatStyle.inc}
  4. uses
  5. Windows, Messages, Classes, Controls, Forms, Graphics, SysUtils,
  6. StdCtrls, ExtCtrls, DB, DBCtrls, Grids, DBGrids, FlatUtils,
  7. FlatCtrls;
  8. type
  9. { TDefineDBButton }
  10. TDefineDBButton = class;
  11. { TDefineDBBDataLink }
  12. TDefineDBBDataLink = class(TDataLink)
  13. private
  14. FDBBitBtn: TDefineDBButton;
  15. protected
  16. procedure EditingChanged; override;
  17. procedure DataSetChanged; override;
  18. procedure ActiveChanged; override;
  19. public
  20. constructor Create(ANav: TDefineDBButton);
  21. destructor Destroy; override;
  22. end;
  23. { TDefineDBButton }
  24. TDefineDBButton = class(TDefineButton)
  25. private
  26. FDBButton: TFlatDBBName;
  27. FBeforeAction: EFlatBroClick;
  28. FShowDialog: Boolean;
  29. FOnNavClick: EFlatBroClick;
  30. function GetDataSource: TDataSource;
  31. procedure SetDataSource(const Value: TDataSource);
  32. procedure SetDBButton(const Value: TFlatDBBName);
  33. protected
  34. FDataLink : TDefineDBBDataLink;
  35. procedure ActiveChanged;
  36. procedure DataChanged;
  37. procedure EditingChanged;
  38. procedure BtnClick(Index: TFlatDBBName);
  39. procedure Loaded; override;
  40. procedure LoadResourceData(Value: TFlatDBBName);
  41. procedure ClickHandler(Sender: TObject);
  42. procedure Notification(AComponent: TComponent; Operation: TOperation); override;
  43. procedure CMEnabledChanged(var Message: TMessage); message CM_ENABLEDCHANGED;
  44. procedure WMSetFocus(var Message: TWMSetFocus); message WM_SETFOCUS;
  45. procedure WMKillFocus(var Message: TWMKillFocus); message WM_KILLFOCUS;
  46. procedure WMGetDlgCode(var Message: TWMGetDlgCode); message WM_GETDLGCODE;
  47. procedure SetName(const Value: TComponentName); override;
  48. property DataSource : TDataSource read GetDataSource write SetDataSource;
  49. property DBButton : TFlatDBBName read FDBButton write SetDBButton default vbNew;
  50. property BeforeAction: EFlatBroClick read FBeforeAction write FBeforeAction;
  51. property ShowDialog : Boolean read FShowDialog write FShowDialog default true;
  52. public
  53. constructor Create(AOwner: TComponent); override;
  54. destructor Destroy; override;
  55. end;
  56. { TDefineDBNavigator }
  57. TDefineDBNavigator = class;
  58. TDefineDBNButton = class(TDefineButton)
  59. private
  60. FIndex: TFlatDBBName;
  61. FBroStyle: TFlatDBBStyle;
  62. FRepeatTimer: TTimer;
  63. procedure TimerExpired(Sender: TObject);
  64. protected
  65. procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
  66. X, Y: Integer); override;
  67. procedure MouseUp(Button: TMouseButton; Shift: TShiftState;
  68. X, Y: Integer); override;
  69. public
  70. destructor Destroy; override;
  71. property BroStyle: TFlatDBBStyle read FBroStyle write FBroStyle;
  72. property Index : TFlatDBBName read FIndex write FIndex;
  73. end;
  74. { TDefineDBNDataLink }
  75. TDefineDBNDataLink = class(TDataLink)
  76. private
  77. FBrowser: TDefineDBNavigator;
  78. protected
  79. procedure EditingChanged; override;
  80. procedure DataSetChanged; override;
  81. procedure ActiveChanged; override;
  82. public
  83. constructor Create(ANav: TDefineDBNavigator);
  84. destructor Destroy; override;
  85. end;
  86. { TDefineDBNavigator }
  87. TDefineDBNavigator = class(TDefinePanel)
  88. private
  89. FDataLink: TDefineDBNDataLink;
  90. FVisibleBtns: TFlatDBBTSet;
  91. FHints: TStrings;
  92. FDefHints: TStrings;
  93. ButtonWidth: Integer;
  94. MinBtnSize: TPoint;
  95. FOnNavClick: EFlatBroClick;
  96. FBeforeAction: EFlatBroClick;
  97. FocusedButton: TFlatDBBName;
  98. FConfirmDelete: Boolean;
  99. procedure SetDataSource(Value: TDataSource);
  100. procedure SetVisible(Value: TFlatDBBTSet);
  101. procedure SetHints(Value: TStrings);
  102. function GetDataSource: TDataSource;
  103. function GetHints: TStrings;
  104. protected
  105. Buttons: array[TFlatDBBName] of TDefineDBNButton;
  106. procedure InitButtons;
  107. procedure InitHints;
  108. procedure SetSize(var W: Integer; var H: Integer);
  109. procedure WMSize(var Message: TWMSize); message WM_SIZE;
  110. procedure WMSetFocus(var Message: TWMSetFocus); message WM_SETFOCUS;
  111. procedure WMKillFocus(var Message: TWMKillFocus); message WM_KILLFOCUS;
  112. procedure WMGetDlgCode(var Message: TWMGetDlgCode); message WM_GETDLGCODE;
  113. procedure CMEnabledChanged(var Message: TMessage); message CM_ENABLEDCHANGED;
  114. procedure WMWindowPosChanging(var Message: TWMWindowPosChanging); message WM_WINDOWPOSCHANGING;
  115. procedure BtnMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  116. procedure ClickHandler(Sender: TObject);
  117. procedure HintsChanged(Sender: TObject);
  118. procedure DataChanged;
  119. procedure EditingChanged;
  120. procedure ActiveChanged;
  121. procedure Loaded; override;
  122. procedure SetColors(Index: Integer; Value: TColor); override;
  123. procedure KeyDown(var Key: Word; Shift: TShiftState); override;
  124. procedure Notification(AComponent: TComponent; Operation: TOperation); override;
  125. procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override;
  126. procedure CalcMinSize(var W, H: Integer);
  127. property DataSource: TDataSource read GetDataSource write SetDataSource;
  128. property VISButtons: TFlatDBBTSet read FVisibleBtns write SetVisible
  129. default [vbFirst,vbPrior,vbNext,vbLast,vbNew,vbDelete,vbEdit,vbSave,vbCancel,vbRefresh];
  130. property DeleteDialog: Boolean read FConfirmDelete write FConfirmDelete default True;
  131. property Hints: TStrings read GetHints write SetHints;
  132. property BeforeAction: EFlatBroClick read FBeforeAction write FBeforeAction;
  133. property OnClick: EFlatBroClick read FOnNavClick write FOnNavClick;
  134. public
  135. constructor Create(AOwner: TComponent); override;
  136. destructor Destroy; override;
  137. procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override;
  138. procedure BtnClick(Index: TFlatDBBName); virtual;
  139. end;
  140. { TDefineDBComboBox }
  141. TDefineDBComboBox = class(TDefineComboBox)
  142. private
  143. FDataLink: TFieldDataLink;
  144. FPaintControl: TPaintControl;
  145. function GetComboText: string;
  146. function GetDataField: string;
  147. function GetDataSource: TDataSource;
  148. function GetField: TField;
  149. function GetReadOnly: Boolean;
  150. procedure SetComboText(const Value: string);
  151. procedure SetDataField(const Value: string);
  152. procedure SetDataSource(Value: TDataSource);
  153. procedure SetEditReadOnly;
  154. procedure SetReadOnly(Value: Boolean);
  155. protected
  156. procedure DataChange(Sender: TObject);
  157. procedure EditingChange(Sender: TObject);
  158. procedure UpdateData(Sender: TObject);
  159. procedure CMEnter(var Message: TCMEnter); message CM_ENTER;
  160. procedure CMExit(var Message: TCMExit); message CM_EXIT;
  161. procedure CMGetDataLink(var Message: TMessage); message CM_GETDATALINK;
  162. procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
  163. procedure ResetMaxLength;
  164. procedure ActiveChange(Sender: TObject);
  165. procedure Change; override;
  166. procedure Click; override;
  167. procedure ComboWndProc(var Message: TMessage; ComboWnd: HWnd; ComboProc: Pointer); override;
  168. procedure CreateWnd; override;
  169. procedure DropDown; override;
  170. procedure KeyDown(var Key: Word; Shift: TShiftState); override;
  171. procedure KeyPress(var Key: Char); override;
  172. procedure Loaded; override;
  173. procedure Notification(AComponent: TComponent; Operation: TOperation); override;
  174. procedure SetItems(const Value: TStrings); override;
  175. procedure SetStyle(Value: TComboboxStyle); override;
  176. procedure WndProc(var Message: TMessage); override;
  177. property DataField: string read GetDataField write SetDataField;
  178. property DataSource: TDataSource read GetDataSource write SetDataSource;
  179. property ReadOnly: Boolean read GetReadOnly write SetReadOnly default False;
  180. property Items write SetItems;
  181. public
  182. constructor Create(AOwner: TComponent); override;
  183. destructor Destroy; override;
  184. function ExecuteAction(Action: TBasicAction): Boolean; override;
  185. function UpdateAction(Action: TBasicAction): Boolean; override;
  186. function UseRightToLeftAlignment: Boolean; override;
  187. property Field: TField read GetField;
  188. property Text;
  189. end;
  190. { TDefineDBListBox }
  191. TDefineDBListBox = class(TDefineListBox)
  192. private
  193. FDataLink: TFieldDataLink;
  194. procedure DataChange(Sender: TObject);
  195. procedure UpdateData(Sender: TObject);
  196. function GetDataField: string;
  197. function GetDataSource: TDataSource;
  198. function GetField: TField;
  199. function GetReadOnly: Boolean;
  200. procedure SetDataField(const Value: string);
  201. procedure SetDataSource(Value: TDataSource);
  202. procedure SetReadOnly(Value: Boolean);
  203. procedure SetItems(Value: TStringList);
  204. procedure WMLButtonDown(var Message: TWMLButtonDown); message WM_LBUTTONDOWN;
  205. procedure CMExit(var Message: TCMExit); message CM_EXIT;
  206. protected
  207. procedure KeyDown(var Key: Word; Shift: TShiftState); override;
  208. procedure KeyPress(var Key: Char); override;
  209. procedure Notification(AComponent: TComponent; Operation: TOperation); override;
  210. property ReadOnly: Boolean read GetReadOnly write SetReadOnly default False;
  211. property DataField: string read GetDataField write SetDataField;
  212. property DataSource: TDataSource read GetDataSource write SetDataSource;
  213. property Items write SetItems;
  214. public
  215. constructor Create(AOwner: TComponent); override;
  216. destructor Destroy; override;
  217. procedure Click; override;
  218. function ExecuteAction(Action: TBasicAction): Boolean; override;
  219. function UpdateAction(Action: TBasicAction): Boolean; override;
  220. function UseRightToLeftAlignment: Boolean; override;
  221. property Field: TField read GetField;
  222. end;
  223. { TDefineDBEdit }
  224. TDefineDBEdit = class(TDefineEdit)
  225. private
  226. FDataLink: TFieldDataLink;
  227. FCanvas: TControlCanvas;
  228. FAlignment: TAlignment;
  229. FFocused: Boolean;
  230. procedure ActiveChange(Sender: TObject);
  231. procedure DataChange(Sender: TObject);
  232. procedure EditingChange(Sender: TObject);
  233. function GetDataField: string;
  234. function GetDataSource: TDataSource;
  235. function GetField: TField;
  236. function GetReadOnly: Boolean;
  237. function GetTextMargins: TPoint;
  238. procedure ResetMaxLength;
  239. procedure SetDataField(const Value: string);
  240. procedure SetDataSource(Value: TDataSource);
  241. procedure SetFocused(Value: Boolean);
  242. procedure SetReadOnly(Value: Boolean);
  243. procedure UpdateData(Sender: TObject);
  244. procedure WMCut(var Message: TMessage); message WM_CUT;
  245. procedure WMPaste(var Message: TMessage); message WM_PASTE;
  246. procedure WMUndo(var Message: TMessage); message WM_UNDO;
  247. procedure CMEnter(var Message: TCMEnter); message CM_ENTER;
  248. procedure CMExit(var Message: TCMExit); message CM_EXIT;
  249. procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
  250. procedure CMGetDataLink(var Message: TMessage); message CM_GETDATALINK;
  251. protected
  252. procedure Change; override;
  253. procedure KeyDown(var Key: Word; Shift: TShiftState); override;
  254. procedure KeyPress(var Key: Char); override;
  255. procedure Loaded; override;
  256. procedure Notification(AComponent: TComponent;Operation: TOperation); override;
  257. property DataField: string read GetDataField write SetDataField;
  258. property DataSource: TDataSource read GetDataSource write SetDataSource;
  259. property ReadOnly: Boolean read GetReadOnly write SetReadOnly default False;
  260. public
  261. constructor Create(AOwner: TComponent); override;
  262. destructor Destroy; override;
  263. function ExecuteAction(Action: TBasicAction): Boolean; override;
  264. function UpdateAction(Action: TBasicAction): Boolean; override;
  265. function UseRightToLeftAlignment: Boolean; override;
  266. property Field: TField read GetField;
  267. end;
  268. { TDefineDBFloat }
  269. TDefineDBFloat = class(TDefineFloat)
  270. private
  271. FDataLink : TFieldDataLink;
  272. function GetField : TField;
  273. function GetDataField : string;
  274. procedure SetDataField(const Value: string);
  275. function GetDataSource : TDataSource ;
  276. procedure SetDataSource(Value : TDataSource);
  277. procedure EditingChange(Sender: TObject);
  278. procedure DataChange(sender : TObject);
  279. procedure UpdateData(sender : TObject);
  280. procedure ActiveChange(sender : TObject);
  281. function GetReadOnly: Boolean;
  282. procedure SetReadOnly(const Value: Boolean);
  283. protected
  284. procedure KeyDown(var Key: Word; Shift: TShiftState); override;
  285. procedure KeyPress(var Key: Char); override;
  286. procedure DownClick (Sender: TObject); override;
  287. procedure UpClick (Sender: TObject); override;
  288. procedure CMExit(var Message:TCMExit);message CM_Exit;
  289. procedure Change; override;
  290. property DataField: string read GetDataField write SetDataField;
  291. property DataSource: TDataSource read GetDataSource write SetDataSource;
  292. property ReadOnly: Boolean read GetReadOnly write SetReadOnly default False;
  293. public
  294. constructor Create(AOwner: TComponent); override;
  295. destructor Destroy; override;
  296. property Field: TField read GetField;
  297. end;
  298. { TDefineDBInteger }
  299. TDefineDBInteger = class (TDefineInteger)
  300. private
  301. FDataLink : TFieldDataLink;
  302. function GetDataField : String;
  303. function GetDataSource : TDataSource;
  304. function GetReadOnly : Boolean;
  305. procedure SetReadOnly (aValue : Boolean);
  306. procedure SetDataSource (aValue : TDataSource);
  307. procedure SetDataField (const aValue : String);
  308. procedure DataChange (Sender : TObject);
  309. procedure UpdateData(Sender: TObject);
  310. procedure EditingChange(Sender: TObject);
  311. function GetField: TField;
  312. protected
  313. procedure Change; override;
  314. procedure Notification(AComponent: TComponent; Operation: TOperation);override;
  315. procedure KeyDown(var Key: Word; Shift: TShiftState); override;
  316. procedure KeyPress(var Key: Char); override;
  317. procedure DownClick (Sender: TObject); override;
  318. procedure UpClick (Sender: TObject); override;
  319. procedure CMGetDataLink(var Message: TMessage); message CM_GETDATALINK;
  320. procedure CMExit(var Message: TCMExit); message CM_EXIT;
  321. procedure WMCut(var Message: TMessage); message WM_CUT;
  322. procedure WMPaste(var Message: TMessage); message WM_PASTE;
  323. property DataSource : TDataSource read GetDataSource write SetDataSource;
  324. property DataField: string read GetDataField write SetDataField;
  325. property ReadOnly: Boolean read GetReadOnly write SetReadOnly default False;
  326. public
  327. constructor Create(AOwner: TComponent); override;
  328. destructor Destroy; override;
  329. property Field: TField read GetField;
  330. end;
  331. { TDefineDBMask }
  332. TDefineDBMask = Class(TDefineMask)
  333. private
  334. FDataLink: TFieldDataLink;
  335. FCanvas: TControlCanvas;
  336. FAlignment: TAlignment;
  337. FFocused: Boolean;
  338. procedure ActiveChange(Sender: TObject);
  339. procedure DataChange(Sender: TObject);
  340. procedure EditingChange(Sender: TObject);
  341. procedure ResetMaxLength;
  342. procedure UpdateData(Sender: TObject);
  343. procedure SetFocused(Value: Boolean);
  344. function GetTextMargins: TPoint;
  345. procedure WMCut(var Message: TMessage); message WM_CUT;
  346. procedure WMPaste(var Message: TMessage); message WM_PASTE;
  347. procedure WMUndo(var Message: TMessage); message WM_UNDO;
  348. procedure CMEnter(var Message: TCMEnter); message CM_ENTER;
  349. procedure CMExit(var Message: TCMExit); message CM_EXIT;
  350. procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
  351. procedure CMGetDataLink(var Message: TMessage); message CM_GETDATALINK;
  352. function GetDataField: string;
  353. function GetDataSource: TDataSource;
  354. function GetField: TField;
  355. function GetReadOnly: Boolean;
  356. procedure SetDataField(const Value: string);
  357. procedure SetDataSource(const Value: TDataSource);
  358. procedure SetReadOnly(const Value: Boolean);
  359. protected
  360. procedure Change; override;
  361. procedure KeyDown(var Key: Word; Shift: TShiftState); override;
  362. procedure KeyPress(var Key: Char); override;
  363. procedure Loaded; override;
  364. procedure Notification(AComponent: TComponent;Operation: TOperation); override;
  365. property DataField: string read GetDataField write SetDataField;
  366. property DataSource: TDataSource read GetDataSource write SetDataSource;
  367. property ReadOnly: Boolean read GetReadOnly write SetReadOnly default False;
  368. public
  369. constructor Create(AOwner: TComponent); override;
  370. destructor Destroy; override;
  371. function ExecuteAction(Action: TBasicAction): Boolean; override;
  372. function UpdateAction(Action: TBasicAction): Boolean; override;
  373. function UseRightToLeftAlignment: Boolean; override;
  374. property Field: TField read GetField;
  375. end;
  376. { TDefineDBMemo }
  377. TDefineDBMemo = class(TDefineMemo)
  378. private
  379. FDataLink: TFieldDataLink;
  380. FAutoDisplay: Boolean;
  381. FFocused: Boolean;
  382. FMemoLoaded: Boolean;
  383. FPaintControl: TPaintControl;
  384. procedure DataChange(Sender: TObject);
  385. procedure EditingChange(Sender: TObject);
  386. function GetDataField: string;
  387. function GetDataSource: TDataSource;
  388. function GetField: TField;
  389. function GetReadOnly: Boolean;
  390. procedure SetDataField(const Value: string);
  391. procedure SetDataSource(Value: TDataSource);
  392. procedure SetReadOnly(Value: Boolean);
  393. procedure SetAutoDisplay(Value: Boolean);
  394. procedure SetFocused(Value: Boolean);
  395. procedure UpdateData(Sender: TObject);
  396. protected
  397. procedure WMCut(var Message: TMessage); message WM_CUT;
  398. procedure WMPaste(var Message: TMessage); message WM_PASTE;
  399. procedure WMUndo(var Message: TMessage); message WM_UNDO;
  400. procedure CMEnter(var Message: TCMEnter); message CM_ENTER;
  401. procedure CMExit(var Message: TCMExit); message CM_EXIT;
  402. procedure WMLButtonDblClk(var Message: TWMLButtonDblClk); message WM_LBUTTONDBLCLK;
  403. procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
  404. procedure CMGetDataLink(var Message: TMessage); message CM_GETDATALINK;
  405. procedure Change; override;
  406. procedure KeyDown(var Key: Word; Shift: TShiftState); override;
  407. procedure KeyPress(var Key: Char); override;
  408. procedure Loaded; override;
  409. procedure Notification(AComponent: TComponent; Operation: TOperation); override;
  410. procedure WndProc(var Message: TMessage); override;
  411. property DataField: string read GetDataField write SetDataField;
  412. property DataSource: TDataSource read GetDataSource write SetDataSource;
  413. property ReadOnly: Boolean read GetReadOnly write SetReadOnly default False;
  414. property AutoDisplay: Boolean read FAutoDisplay write SetAutoDisplay default True;
  415. public
  416. constructor Create(AOwner: TComponent); override;
  417. destructor Destroy; override;
  418. function ExecuteAction(Action: TBasicAction): Boolean; override;
  419. procedure LoadMemo; virtual;
  420. function UpdateAction(Action: TBasicAction): Boolean; override;
  421. function UseRightToLeftAlignment: Boolean; override;
  422. property Field: TField read GetField;
  423. end;
  424. { TDefineDBCheckBox }
  425. TDefineDBCheckBox = class(TDefineCheckBox)
  426. private
  427. FDataLink: TFieldDataLink;
  428. FValueCheck: string;
  429. FValueUncheck: string;
  430. procedure SetDataField(const Value: string);
  431. procedure SetDataSource(Value: TDataSource);
  432. procedure SetReadOnly(Value: Boolean);
  433. function GetDataField: string;
  434. function GetDataSource: TDataSource;
  435. function GetField: TField;
  436. function GetReadOnly: Boolean;
  437. protected
  438. procedure CMExit(var Message: TCMExit); message CM_EXIT;
  439. procedure CMGetDataLink(var Message: TMessage); message CM_GETDATALINK;
  440. procedure DataChange(Sender: TObject);
  441. procedure UpdateRecord;
  442. procedure KeyPress(var Key: Char); override;
  443. procedure Notification(AComponent: TComponent; Operation: TOperation); override;
  444. property DataLink: TFieldDataLink read FDataLink;
  445. property DataField: string read GetDataField write SetDataField;
  446. property DataSource: TDataSource read GetDataSource write SetDataSource;
  447. property ReadOnly: Boolean read GetReadOnly write SetReadOnly default False;
  448. property Checked;
  449. public
  450. constructor Create(AOwner: TComponent); override;
  451. destructor Destroy; override;
  452. property Field: TField read GetField;
  453. function ExecuteAction(Action: TBasicAction): Boolean; override;
  454. function UpdateAction(Action: TBasicAction): Boolean; override;
  455. function UseRightToLeftAlignment: Boolean; override;
  456. end;
  457. { TFlatDBCheckBox }
  458. TFlatDBCheckBox = class(TDefineDBCheckBox)
  459. published
  460. property DataField;
  461. property DataSource;
  462. property ReadOnly;
  463. property Transparent;
  464. property Action;
  465. property Caption;
  466. property ColorFocused;
  467. property ColorDown;
  468. property ColorChecked;
  469. property Color;
  470. property ColorBorder;
  471. property Enabled;
  472. property Font;
  473. property Layout;
  474. property ParentColor;
  475. property ParentFont;
  476. property ShowHint;
  477. property TabOrder;
  478. property TabStop;
  479. property Visible;
  480. property OnClick;
  481. property OnDblClick;
  482. property OnDragDrop;
  483. property OnDragOver;
  484. property OnEndDrag;
  485. property OnEnter;
  486. property OnExit;
  487. property OnKeyDown;
  488. property OnKeyPress;
  489. property OnKeyUp;
  490. property OnMouseDown;
  491. property OnMouseMove;
  492. property OnMouseUp;
  493. end;
  494. TFlatDBGrid = class(TVersionDBGrid)
  495. private
  496. FSingleColor: TColor;
  497. FDoubleColor: TColor;
  498. FDbBgColor: boolean;
  499. OldGridWnd : TWndMethod;
  500. FParentColor: Boolean;
  501. FFocusColor: TColor;
  502. FBorderColor: TColor;
  503. FFlatColor: TColor;
  504. FMouseIn: Boolean;
  505. FLinesColor: TColor;
  506. procedure SetColors(Index: Integer; Value: TColor);
  507. procedure SetParentColor(Value: Boolean);
  508. procedure NewGridWnd (var Message : TMessage);
  509. procedure WMVScroll(var Message: TWMVScroll); message WM_VSCROLL;
  510. procedure SetDbBgColor(const Value: boolean);
  511. function GetMouseIn: boolean;
  512. protected
  513. procedure DrawColumnCell(const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); override;
  514. procedure RedrawBorder (const Clip: HRGN = 0);
  515. procedure CMEnabledChanged(var Message: TMessage); message CM_ENABLEDCHANGED;
  516. procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
  517. procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
  518. procedure WMSetFocus(var Message: TWMSetFocus); message WM_SETFOCUS;
  519. procedure WMKillFocus(var Message: TWMKillFocus); message WM_KILLFOCUS;
  520. procedure WMNCCalcSize(var Message: TWMNCCalcSize); message WM_NCCALCSIZE;
  521. procedure WMNCPaint(var Message: TMessage); message WM_NCPAINT;
  522. procedure CMSysColorChange(var Message: TMessage); message CM_SYSCOLORCHANGE;
  523. procedure CMParentColorChanged(var Message: TWMNoParams); message CM_PARENTCOLORCHANGED;
  524. procedure DrawCell(ACol, ARow: Longint; ARect: TRect;
  525. AState: TGridDrawState); override;
  526. property MouseIn:boolean read GetMouseIn;
  527. public
  528. constructor Create(AOwner: TComponent); override;
  529. property Canvas;
  530. property SelectedRows;
  531. published
  532. property DbBgColor :Boolean read FDbBgColor Write SetDbBgColor default true;
  533. property ColorFocused: TColor index 0 read FFocusColor write SetColors default clWhite;
  534. property ColorBorder: TColor index 1 read FBorderColor write SetColors default DefaultBorderColor;
  535. property ColorFlat: TColor index 2 read FFlatColor write SetColors default DefaultFlatColor;
  536. property ColorLines: TColor index 3 read FLinesColor write SetColors default DefaultBorderColor;
  537. property ColorRowSingle :TColor index 4 read FSingleColor Write SetColors default clWhite;
  538. property ColorRowDouble :TColor index 5 read FDoubleColor Write SetColors default clWhite;
  539. property ParentColor: Boolean read FParentColor write SetParentColor default false;
  540. property Align;
  541. property Anchors;
  542. property BiDiMode;
  543. property Columns stored False; //StoreColumns;
  544. property Constraints;
  545. property DataSource;
  546. property DefaultDrawing;
  547. property DragCursor;
  548. property DragKind;
  549. property DragMode;
  550. property Enabled;
  551. property FixedColor;
  552. property Font;
  553. property ImeMode;
  554. property ImeName;
  555. property Options;
  556. property ParentBiDiMode;
  557. property ParentFont;
  558. property ParentShowHint;
  559. property PopupMenu;
  560. property ReadOnly;
  561. property ShowHint;
  562. property TabOrder;
  563. property TabStop;
  564. property TitleFont;
  565. property Visible;
  566. property OnCellClick;
  567. property OnColEnter;
  568. property OnColExit;
  569. property OnColumnMoved;
  570. property OnDrawDataCell; { obsolete }
  571. property OnDrawColumnCell;
  572. property OnDblClick;
  573. property OnDragDrop;
  574. property OnDragOver;
  575. property OnEditButtonClick;
  576. property OnEndDock;
  577. property OnEndDrag;
  578. property OnEnter;
  579. property OnExit;
  580. property OnKeyDown;
  581. property OnKeyPress;
  582. property OnKeyUp;
  583. property OnMouseDown;
  584. property OnMouseMove;
  585. property OnMouseUp;
  586. property OnStartDock;
  587. property OnStartDrag;
  588. property OnTitleClick;
  589. end;
  590. { TDefineDBRadioGroup }
  591. TDefineDBRadioGroup = class(TDefineRadioGroup)
  592. private
  593. FDataLink: TFieldDataLink;
  594. FValue: string;
  595. FValues: TStrings;
  596. FInSetValue: Boolean;
  597. FOnChange: TNotifyEvent;
  598. procedure DataChange(Sender: TObject);
  599. function GetDataField: string;
  600. function GetDataSource: TDataSource;
  601. function GetField: TField;
  602. function GetReadOnly: Boolean;
  603. function GetButtonValue(Index: Integer): string;
  604. procedure SetDataField(const Value: string);
  605. procedure SetDataSource(Value: TDataSource);
  606. procedure SetReadOnly(Value: Boolean);
  607. procedure SetValue(const Value: string);
  608. procedure SetItems(Value: TStrings);
  609. procedure SetValues(Value: TStrings);
  610. procedure CMExit(var Message: TCMExit); message CM_EXIT;
  611. procedure CMGetDataLink(var Message: TMessage); message CM_GETDATALINK;
  612. protected
  613. SaveState:Boolean;
  614. procedure Change; dynamic;
  615. procedure Click; override;
  616. procedure KeyPress(var Key: Char); override;
  617. function CanModify: Boolean; override;
  618. procedure Notification(AComponent: TComponent;
  619. Operation: TOperation); override;
  620. property DataLink: TFieldDataLink read FDataLink;
  621. procedure UpdateRecord;
  622. //----------------------------
  623. property DataField: string read GetDataField write SetDataField;
  624. property DataSource: TDataSource read GetDataSource write SetDataSource;
  625. property Items write SetItems;
  626. property ReadOnly: Boolean read GetReadOnly write SetReadOnly default False;
  627. property Values: TStrings read FValues write SetValues;
  628. property OnChange: TNotifyEvent read FOnChange write FOnChange;
  629. public
  630. constructor Create(AOwner: TComponent); override;
  631. destructor Destroy; override;
  632. function ExecuteAction(Action: TBasicAction): Boolean; override;
  633. function UpdateAction(Action: TBasicAction): Boolean; override;
  634. function UseRightToLeftAlignment: Boolean; override;
  635. property Field: TField read GetField;
  636. property ItemIndex;
  637. property Value: string read FValue write SetValue;
  638. end;
  639. TFlatDBButton = class(TDefineDBButton)
  640. published
  641. property DataSource;
  642. property DBButton;
  643. property BeforeAction;
  644. property ShowDialog;
  645. property Transparent;
  646. property HasFocusFrame;
  647. property Default;
  648. property AllowAllUp;
  649. property ColorFocused;
  650. property ColorDown;
  651. property ColorBorder;
  652. property ColorShadow;
  653. property ColorFlat;
  654. property GroupIndex;
  655. property Action;
  656. property Down;
  657. property Font;
  658. property Layout;
  659. property Margin;
  660. property ParentFont;
  661. property ParentColor;
  662. property ParentShowHint;
  663. property ShowHint;
  664. property TabStop;
  665. property TabOrder;
  666. property Spacing;
  667. property ModalResult;
  668. property Visible;
  669. property OnMouseDown;
  670. property OnMouseMove;
  671. property OnMouseUp;
  672. property OnMouseEnter;
  673. property OnMouseLeave;
  674. {$IFDEF DFS_DELPHI_4_UP}
  675. property Anchors;
  676. property BiDiMode;
  677. property Constraints;
  678. property DragKind;
  679. property ParentBiDiMode;
  680. property OnEndDock;
  681. property OnStartDock;
  682. {$ENDIF}
  683. end;
  684. TFlatDBComboBox = class(TDefineDBComboBox)
  685. published
  686. property Style;
  687. property Ticket;
  688. property TicketPosition;
  689. property TicketSpace;
  690. property DataField;
  691. property DataSource;
  692. property ReadOnly;
  693. property Items;
  694. property Version;
  695. property ColorArrow;
  696. property ColorArrowBackground;
  697. property ColorBorder;
  698. property ColorFlat;
  699. property ColorFocued;
  700. property DragMode;
  701. property DragCursor;
  702. property DropDownCount;
  703. property Enabled;
  704. property Font;
  705. property ItemHeight;
  706. property CharCase;
  707. property MaxLength;
  708. property ParentFont;
  709. property ParentShowHint;
  710. property PopupMenu;
  711. property ShowHint;
  712. property Sorted;
  713. property TabOrder;
  714. property TabStop;
  715. property Visible;
  716. property ItemIndex;
  717. property OnChange;
  718. property OnClick;
  719. property OnDblClick;
  720. property OnDragDrop;
  721. property OnDragOver;
  722. property OnDrawItem;
  723. property OnDropDown;
  724. property OnEndDrag;
  725. property OnEnter;
  726. property OnExit;
  727. property OnKeyDown;
  728. property OnKeyPress;
  729. property OnKeyUp;
  730. property OnMeasureItem;
  731. property OnStartDrag;
  732. property Anchors;
  733. property BiDiMode;
  734. property Constraints;
  735. property DragKind;
  736. property ParentBiDiMode;
  737. property OnEndDock;
  738. property OnStartDock;
  739. end;
  740. TFlatDBListBox = class(TDefineDBListBox)
  741. published
  742. property ReadOnly;
  743. property DataField;
  744. property DataSource;
  745. property Items;
  746. property Version;
  747. property Caption;
  748. property Skin;
  749. property Align;
  750. property Anchors;
  751. property Constraints;
  752. property Enabled;
  753. property Font;
  754. property ParentColor;
  755. property ParentFont;
  756. property ParentShowHint;
  757. property PopupMenu;
  758. property ShowHint;
  759. property TabOrder;
  760. property TabStop;
  761. property Visible;
  762. property OnClick;
  763. property OnChange;
  764. property OnDblClick;
  765. property OnDragDrop;
  766. property OnDragOver;
  767. property OnEndDock;
  768. property OnEndDrag;
  769. property OnEnter;
  770. property OnExit;
  771. property OnKeyDown;
  772. property OnKeyPress;
  773. property OnKeyUp;
  774. property OnMouseDown;
  775. property OnMouseMove;
  776. property OnMouseUp;
  777. property OnStartDock;
  778. property OnStartDrag;
  779. end;
  780. TFlatDBEdit = class(TDefineDBEdit)
  781. published
  782. property Anchors;
  783. property AutoSelect;
  784. property AutoSize;
  785. property BiDiMode;
  786. property BorderStyle;
  787. property CharCase;
  788. property Color;
  789. property Constraints;
  790. property DataField;
  791. property DataSource;
  792. property ReadOnly;
  793. property Ticket;
  794. property TicketPosition;
  795. property TicketSpace;
  796. property Version;
  797. property Alignment;
  798. property ColorFocused;
  799. property ColorBorder;
  800. property ColorFlat;
  801. property ParentColor;
  802. property MaxLength;
  803. property DragCursor;
  804. property DragKind;
  805. property DragMode;
  806. property Enabled;
  807. property Font;
  808. property ParentBiDiMode;
  809. property ParentCtl3D;
  810. property ParentFont;
  811. property ParentShowHint;
  812. property PasswordChar;
  813. property PopupMenu;
  814. property ShowHint;
  815. property TabOrder;
  816. property TabStop;
  817. property Visible;
  818. property OnChange;
  819. property OnClick;
  820. property OnContextPopup;
  821. property OnDblClick;
  822. property OnDragDrop;
  823. property OnDragOver;
  824. property OnEndDock;
  825. property OnEndDrag;
  826. property OnEnter;
  827. property OnExit;
  828. property OnKeyDown;
  829. property OnKeyPress;
  830. property OnKeyUp;
  831. property OnMouseDown;
  832. property OnMouseMove;
  833. property OnMouseUp;
  834. property OnStartDock;
  835. property OnStartDrag;
  836. end;
  837. TFlatDBFloat = class(TDefineDBFloat)
  838. published
  839. property DataField;
  840. property DataSource;
  841. property ReadOnly;
  842. property Digits;
  843. property Precision;
  844. property FloatFormat;
  845. property EditorEnabled;
  846. property Increment;
  847. property MaxValue;
  848. property MinValue;
  849. property Value;
  850. property Alignment;
  851. property ColorFocused;
  852. property ColorBorder;
  853. property ColorFlat;
  854. property AutoSelect;
  855. property AutoSize;
  856. property DragCursor;
  857. property DragMode;
  858. property Enabled;
  859. property Font;
  860. property Ticket;
  861. property TicketPosition;
  862. property TicketSpace;
  863. property ParentColor;
  864. property ParentFont;
  865. property ParentShowHint;
  866. property ImeMode;
  867. property ImeName;
  868. property PopupMenu;
  869. property ShowHint;
  870. property TabOrder;
  871. property TabStop;
  872. property Visible;
  873. property OnChange;
  874. property OnClick;
  875. property OnDblClick;
  876. property OnDragDrop;
  877. property OnDragOver;
  878. property OnEndDrag;
  879. property OnEnter;
  880. property OnExit;
  881. property OnKeyDown;
  882. property OnKeyPress;
  883. property OnKeyUp;
  884. property OnMouseDown;
  885. property OnMouseMove;
  886. property OnMouseUp;
  887. property OnStartDrag;
  888. end;
  889. TFlatDBInteger = class (TDefineDBInteger)
  890. published
  891. property DataSource;
  892. property DataField;
  893. property ReadOnly;
  894. property Increment;
  895. property MaxValue;
  896. property MinValue;
  897. property Value;
  898. property EditorEnabled;
  899. property Alignment;
  900. property ColorFocused;
  901. property ColorBorder;
  902. property ColorFlat;
  903. property AutoSelect;
  904. property AutoSize;
  905. property DragCursor;
  906. property DragMode;
  907. property Enabled;
  908. property ImeMode;
  909. property ImeName;
  910. property Font;
  911. property Ticket;
  912. property TicketPosition;
  913. property TicketSpace;
  914. property ParentColor;
  915. property ParentFont;
  916. property ParentShowHint;
  917. property PopupMenu;
  918. property ShowHint;
  919. property TabOrder;
  920. property TabStop;
  921. property Visible;
  922. property OnChange;
  923. property OnClick;
  924. property OnDblClick;
  925. property OnDragDrop;
  926. property OnDragOver;
  927. property OnEndDrag;
  928. property OnEnter;
  929. property OnExit;
  930. property OnKeyDown;
  931. property OnKeyPress;
  932. property OnKeyUp;
  933. property OnMouseDown;
  934. property OnMouseMove;
  935. property OnMouseUp;
  936. property OnStartDrag;
  937. end;
  938. TFlatDBMaskEdit = Class(TDefineDBMask)
  939. published
  940. property DataField;
  941. property DataSource;
  942. property ReadOnly;
  943. property Ticket;
  944. property TicketPosition;
  945. property TicketSpace;
  946. property Version;
  947. property ColorFocused;
  948. property ColorBorder;
  949. property ColorFlat;
  950. property ParentColor;
  951. property Alignment;
  952. property Align;
  953. property AutoSelect;
  954. property AutoSize;
  955. property BorderStyle;
  956. property CharCase;
  957. property Color;
  958. property DragCursor;
  959. property DragMode;
  960. property Enabled;
  961. property EditMask;
  962. property Font;
  963. property HideSelection;
  964. property MaxLength;
  965. property OEMConvert;
  966. property ParentCtl3D;
  967. property ParentFont;
  968. property ParentShowHint;
  969. property PasswordChar;
  970. property PopupMenu;
  971. property ShowHint;
  972. property TabOrder;
  973. property TabStop;
  974. property Text;
  975. property Visible;
  976. property OnChange;
  977. property OnClick;
  978. property OnDblClick;
  979. property OnDragDrop;
  980. property OnDragOver;
  981. property OnEndDrag;
  982. property OnEnter;
  983. property OnExit;
  984. property OnKeyDown;
  985. property OnKeyPress;
  986. property OnKeyUp;
  987. property OnMouseDown;
  988. property OnMouseMove;
  989. property OnMouseUp;
  990. property OnStartDrag;
  991. property OnValidate;
  992. {$IFDEF DFS_DELPHI_4_UP}
  993. property ImeMode;
  994. property ImeName;
  995. property Anchors;
  996. property BiDiMode;
  997. property Constraints;
  998. property DragKind;
  999. property ParentBiDiMode;
  1000. property OnEndDock;
  1001. property OnStartDock;
  1002. {$ENDIF}
  1003. end;
  1004. TFlatDBMemo = class(TDefineDBMemo)
  1005. published
  1006. property ColorFocused;
  1007. property ColorBorder;
  1008. property ColorFlat;
  1009. property ParentColor;
  1010. property Version;
  1011. property Align;
  1012. property Alignment;
  1013. property Anchors;
  1014. property BiDiMode;
  1015. property BorderStyle;
  1016. property Color;
  1017. property Constraints;
  1018. property DataField;
  1019. property DataSource;
  1020. property ReadOnly;
  1021. property AutoDisplay;
  1022. property DragCursor;
  1023. property DragKind;
  1024. property DragMode;
  1025. property Enabled;
  1026. property Font;
  1027. property MaxLength;
  1028. property ParentBiDiMode;
  1029. property ParentCtl3D;
  1030. property ParentFont;
  1031. property ParentShowHint;
  1032. property PopupMenu;
  1033. property ScrollBars;
  1034. property ShowHint;
  1035. property TabOrder;
  1036. property TabStop;
  1037. property Visible;
  1038. property WantTabs;
  1039. property WordWrap;
  1040. property OnChange;
  1041. property OnClick;
  1042. property OnContextPopup;
  1043. property OnDblClick;
  1044. property OnDragDrop;
  1045. property OnDragOver;
  1046. property OnEndDock;
  1047. property OnEndDrag;
  1048. property OnEnter;
  1049. property OnExit;
  1050. property OnKeyDown;
  1051. property OnKeyPress;
  1052. property OnKeyUp;
  1053. property OnMouseDown;
  1054. property OnMouseMove;
  1055. property OnMouseUp;
  1056. property OnStartDock;
  1057. property OnStartDrag;
  1058. end;
  1059. TFlatDBNavigator = class(TDefineDBNavigator)
  1060. published
  1061. property DataSource;
  1062. property VISButtons;
  1063. property DeleteDialog;
  1064. property Hints;
  1065. property BeforeAction;
  1066. property OnClick;
  1067. property ColorBorder;
  1068. property Constraints;
  1069. property Transparent;
  1070. property Align;
  1071. property Anchors;
  1072. property Enabled;
  1073. property ParentShowHint;
  1074. property PopupMenu;
  1075. property ShowHint;
  1076. property TabOrder;
  1077. property TabStop;
  1078. property Visible;
  1079. property Locked;
  1080. property FullRepaint;
  1081. property Color;
  1082. property OnContextPopup;
  1083. property OnDblClick;
  1084. property OnDragDrop;
  1085. property OnDragOver;
  1086. property OnEndDock;
  1087. property OnEndDrag;
  1088. property OnEnter;
  1089. property OnExit;
  1090. property OnResize;
  1091. property OnStartDock;
  1092. property OnStartDrag;
  1093. end;
  1094. TFlatDBRadioGroup = class(TDefineDBRadioGroup)
  1095. published
  1096. property Transparent;
  1097. property Alignment;
  1098. property ItemIndex;
  1099. property Columns;
  1100. property Align;
  1101. property Cursor;
  1102. property Caption;
  1103. property Font;
  1104. property ParentFont;
  1105. property Color;
  1106. property ParentColor;
  1107. property PopupMenu;
  1108. property ShowHint;
  1109. property ParentShowHint;
  1110. property Enabled;
  1111. property Visible;
  1112. property TabOrder;
  1113. property TabStop;
  1114. property Hint;
  1115. property ColorBorder;
  1116. property BackgropStartColor;
  1117. property BackgropStopColor;
  1118. property BackgropOrien;
  1119. property StyleFace;
  1120. property Border;
  1121. property Anchors;
  1122. property Constraints;
  1123. property DragKind;
  1124. property DragMode;
  1125. property DragCursor;
  1126. property DataField;
  1127. property DataSource;
  1128. property Items;
  1129. property ReadOnly;
  1130. property Values;
  1131. property OnChange;
  1132. property DockSite;
  1133. property OnEndDock;
  1134. property OnStartDock;
  1135. property OnDockDrop;
  1136. property OnDockOver;
  1137. property OnUnDock;
  1138. property OnClick;
  1139. property OnDblClick;
  1140. property OnDragDrop;
  1141. property OnDragOver;
  1142. property OnEndDrag;
  1143. property OnEnter;
  1144. property OnExit;
  1145. property OnMouseDown;
  1146. property OnMouseMove;
  1147. property OnMouseUp;
  1148. property OnStartDrag;
  1149. end;
  1150. implementation
  1151. uses Clipbrd, FlatCnsts;
  1152. { TDefineDBBDataLink }
  1153. constructor TDefineDBBDataLink.Create(ANav: TDefineDBButton);
  1154. begin
  1155. inherited Create;
  1156. FDBBitBtn := ANav;
  1157. VisualControl := True;
  1158. end;
  1159. destructor TDefineDBBDataLink.Destroy;
  1160. begin
  1161. FDBBitBtn := nil;
  1162. inherited Destroy;
  1163. end;
  1164. procedure TDefineDBBDataLink.EditingChanged;
  1165. begin
  1166. if FDBBitBtn <> nil then FDBBitBtn.EditingChanged;
  1167. end;
  1168. procedure TDefineDBBDataLink.DataSetChanged;
  1169. begin
  1170. if FDBBitBtn <> nil then FDBBitBtn.DataChanged;
  1171. end;
  1172. procedure TDefineDBBDataLink.ActiveChanged;
  1173. begin
  1174. if FDBBitBtn <> nil then FDBBitBtn.ActiveChanged;
  1175. end;
  1176. { TDefineDBButton }
  1177. var
  1178. myResIDName : array[TFlatDBBName] of PChar = ('FIRST', 'PRIOR', 'NEXT',
  1179. 'LAST', 'NEW', 'DELETE', 'EDIT', 'SAVE', 'CANCEL', 'REFRESH');
  1180. myBtnHintId : array[TFlatDBBName] of Pointer = (@myFirstHint, @myPriorHint,
  1181. @myNextHint, @myLastHint, @myNewHint, @myDeleteHint,
  1182. @myEditHint, @myPostHint, @myCancelHint, @myRefreshHint);
  1183. myBtnCapId : array[TFlatDBBName] of Pointer = (@myFirstCap, @myPriorCap,
  1184. @myNextCap, @myLastCap, @myNewCap, @myDeleteCap, @myEditCap,
  1185. @myPostCap, @myCancelCap, @myRefreshCap);
  1186. constructor TDefineDBButton.Create(AOwner: TComponent);
  1187. begin
  1188. inherited Create(AOwner);
  1189. FDataLink := TDefineDBBDataLink.Create(self);
  1190. FDBButton := vbNew;
  1191. FShowDialog := True;
  1192. Layout := blGlyphLeft;
  1193. OnClick := ClickHandler;
  1194. Enabled := False;
  1195. ShowHint := True;
  1196. LoadResourceData(DBButton);
  1197. end;
  1198. destructor TDefineDBButton.Destroy;
  1199. begin
  1200. FDataLink.Free;
  1201. inherited Destroy;
  1202. end;
  1203. function TDefineDBButton.GetDataSource: TDataSource;
  1204. begin
  1205. result := FDataLink.DataSource;
  1206. end;
  1207. procedure TDefineDBButton.SetDataSource(const Value: TDataSource);
  1208. begin
  1209. FDataLink.DataSource := Value;
  1210. if not (csLoading in ComponentState) then
  1211. ActiveChanged;
  1212. if Value <> nil then
  1213. begin
  1214. LoadResourceData(DBButton);
  1215. Value.FreeNotification(Self);
  1216. end;
  1217. end;
  1218. procedure TDefineDBButton.Notification(AComponent: TComponent;
  1219. Operation: TOperation);
  1220. begin
  1221. inherited Notification(AComponent, Operation);
  1222. if (Operation = opRemove) and (FDataLink <> nil) and
  1223. (AComponent = DataSource) then DataSource := nil;
  1224. end;
  1225. procedure TDefineDBButton.LoadResourceData(Value:TFlatDBBName);
  1226. var ResName : String;
  1227. begin
  1228. FmtStr(ResName, 'FLAT_%s', [myResIDName[Value]]);
  1229. Glyph.LoadFromResourceName(HInstance, ResName);
  1230. NumGlyphs := 2;
  1231. Caption := LoadResString(myBtnCapId[Value]);
  1232. Hint := LoadResString(myBtnHintId[Value]);
  1233. end;
  1234. procedure TDefineDBButton.SetDBButton(const Value: TFlatDBBName);
  1235. begin
  1236. If FDBButton <> Value then
  1237. begin
  1238. FDBButton := Value;
  1239. LoadResourceData(Value);
  1240. ActiveChanged;
  1241. end;
  1242. end;
  1243. procedure TDefineDBButton.BtnClick(Index: TFlatDBBName);
  1244. begin
  1245. if (DataSource <> nil) and (DataSource.State <> dsInactive) then
  1246. begin
  1247. if not (csDesigning in ComponentState) and Assigned(FBeforeAction) then
  1248. FBeforeAction(Self, Index);
  1249. with DataSource.DataSet do
  1250. begin
  1251. case Index of
  1252. vbFirst : First;
  1253. vbPrior : Prior;
  1254. vbNext : Next;
  1255. vbLast : Last;
  1256. vbEdit : Edit;
  1257. vbCancel : Cancel;
  1258. vbRefresh : Refresh;
  1259. vbNew : if not FShowDialog or(ShowBox(myNewRecordQuestion, mbIYn)<>idNo) then Insert;
  1260. vbSave : if not FShowDialog or(ShowBox(mySaveRecordQuestion, mbIYn)<>idNo) then Post;
  1261. vbDelete : if not FShowDialog or(ShowBox(myDeleteRecordQuestion, mbIYn)<>idNo) then Delete;
  1262. end;
  1263. end;
  1264. end;
  1265. if not (csDesigning in ComponentState) and Assigned(FOnNavClick) then
  1266. FOnNavClick(Self, Index);
  1267. end;
  1268. procedure TDefineDBButton.ClickHandler(Sender: TObject);
  1269. begin
  1270. BtnClick(FDBButton);
  1271. end;
  1272. procedure TDefineDBButton.DataChanged;
  1273. var
  1274. UpEnable, DnEnable, EnDelete: Boolean;
  1275. begin
  1276. UpEnable := FDataLink.Active and not FDataLink.DataSet.BOF;
  1277. DnEnable := FDataLink.Active and not FDataLink.DataSet.EOF;
  1278. EnDelete := FDataLink.Active and FDataLink.DataSet.CanModify and
  1279. not (FDataLink.DataSet.BOF and FDataLink.DataSet.EOF);
  1280. case FDBButton of
  1281. vbFirst,vbPrior : Enabled := UpEnable;
  1282. vbNext,vbLast : Enabled := DnEnable;
  1283. vbDelete : Enabled := EnDelete;
  1284. end;
  1285. end;
  1286. procedure TDefineDBButton.EditingChanged;
  1287. var
  1288. CanModify: Boolean;
  1289. begin
  1290. CanModify := FDataLink.Active and FDataLink.DataSet.CanModify;
  1291. case FDBButton of
  1292. vbNew,vbRefresh : Enabled := CanModify;
  1293. vbEdit : Enabled := CanModify and not FDataLink.Editing;
  1294. vbSave : Enabled := CanModify and FDataLink.Editing;
  1295. vbCancel : Enabled := CanModify and FDataLink.Editing;
  1296. end;
  1297. end;
  1298. procedure TDefineDBButton.ActiveChanged;
  1299. begin
  1300. if not FDataLink.Active then
  1301. Enabled := False
  1302. else
  1303. begin
  1304. DataChanged;
  1305. EditingChanged;
  1306. end;
  1307. end;
  1308. procedure TDefineDBButton.CMEnabledChanged(var Message: TMessage);
  1309. begin
  1310. inherited;
  1311. if not (csLoading in ComponentState) then
  1312. ActiveChanged;
  1313. end;
  1314. procedure TDefineDBButton.Loaded;
  1315. begin
  1316. inherited Loaded;
  1317. ActiveChanged;
  1318. end;
  1319. procedure TDefineDBButton.WMGetDlgCode(var Message: TWMGetDlgCode);
  1320. begin
  1321. Message.Result := DLGC_WANTARROWS;
  1322. end;
  1323. procedure TDefineDBButton.WMKillFocus(var Message: TWMKillFocus);
  1324. begin
  1325. inherited;
  1326. Invalidate;
  1327. end;
  1328. procedure TDefineDBButton.WMSetFocus(var Message: TWMSetFocus);
  1329. begin
  1330. inherited;
  1331. Invalidate;
  1332. end;
  1333. procedure TDefineDBButton.SetName(const Value: TComponentName);
  1334. begin
  1335. inherited SetName(Value);
  1336. if (csDesigning in ComponentState)and((GetTextLen = 0)or
  1337. (CompareText(Caption, Name) = 0)) then
  1338. LoadResourceData(FDBButton);
  1339. end;
  1340. { TDefineDBNavigator }
  1341. constructor TDefineDBNavigator.Create(AOwner: TComponent);
  1342. begin
  1343. inherited Create(AOwner);
  1344. ControlStyle := ControlStyle - [csAcceptsControls, csSetCaption] + [csOpaque];
  1345. if not NewStyleControls then ControlStyle := ControlStyle + [csFramed];
  1346. FDataLink := TDefineDBNDataLink.Create(Self);
  1347. FHints := TStringList.Create;
  1348. TStringList(FHints).OnChange := HintsChanged;
  1349. FVisibleBtns := [vbFirst,vbPrior,vbNext,vbLast,vbNew,vbDelete,vbEdit,vbSave,vbCancel,vbRefresh];
  1350. InitButtons;
  1351. InitHints;
  1352. ShowHint := True;
  1353. Cursor := crHandPoint;
  1354. Width := 241;
  1355. Height := 25;
  1356. ButtonWidth := 0;
  1357. FocusedButton := vbFirst;
  1358. FConfirmDelete := True;
  1359. FullRepaint := False;
  1360. end;
  1361. destructor TDefineDBNavigator.Destroy;
  1362. begin
  1363. FDefHints.Free;
  1364. FDataLink.Free;
  1365. FHints.Free;
  1366. FDataLink := nil;
  1367. inherited Destroy;
  1368. end;
  1369. procedure TDefineDBNavigator.InitButtons;
  1370. var
  1371. I: TFlatDBBName;
  1372. Btn: TDefineDBNButton;
  1373. X: Integer;
  1374. ResName: string;
  1375. begin
  1376. MinBtnSize := Point(20, 18);
  1377. X := 0;
  1378. for I := Low(Buttons) to High(Buttons) do
  1379. begin
  1380. Btn := TDefineDBNButton.Create (Self);
  1381. Btn.Index := I;
  1382. Btn.Visible := I in FVisibleBtns;
  1383. Btn.Enabled := True;
  1384. Btn.SetBounds(X, 0, MinBtnSize.X, MinBtnSize.Y);
  1385. FmtStr(ResName, 'FLAT_%s', [myResIDName[I]]);
  1386. Btn.Glyph.LoadFromResourceName(HInstance, ResName);
  1387. Btn.NumGlyphs := 2;
  1388. Btn.Enabled := False;
  1389. Btn.Parent := Self;
  1390. Btn.Transparent := tmAlways;
  1391. Btn.OnClick := ClickHandler;
  1392. Btn.OnMouseDown := BtnMouseDown;
  1393. Btn.ColorBorder := ColorBorder;
  1394. Buttons[I] := Btn;
  1395. X := X + MinBtnSize.X;
  1396. end;
  1397. Buttons[vbPrior].BroStyle := Buttons[vbPrior].BroStyle + [myAllowTimer];
  1398. Buttons[vbNext].BroStyle := Buttons[vbNext].BroStyle + [myAllowTimer];
  1399. end;
  1400. procedure TDefineDBNavigator.InitHints;
  1401. var
  1402. I: Integer;
  1403. J: TFlatDBBName;
  1404. begin
  1405. if not Assigned(FDefHints) then
  1406. begin
  1407. FDefHints := TStringList.Create;
  1408. for J := Low(Buttons) to High(Buttons) do
  1409. FDefHints.Add(LoadResString(myBtnHintId[J]));
  1410. end;
  1411. for J := Low(Buttons) to High(Buttons) do
  1412. Buttons[J].Hint := FDefHints[Ord(J)];
  1413. J := Low(Buttons);
  1414. for I := 0 to (FHints.Count - 1) do
  1415. begin
  1416. if FHints.Strings[I] <> '' then
  1417. Buttons[J].Hint := FHints.Strings[I];
  1418. if J = High(Buttons) then
  1419. Exit;
  1420. Inc(J);
  1421. end;
  1422. end;
  1423. procedure TDefineDBNavigator.HintsChanged(Sender: TObject);
  1424. begin
  1425. InitHints;
  1426. end;
  1427. procedure TDefineDBNavigator.SetHints(Value: TStrings);
  1428. begin
  1429. if Value.Text = FDefHints.Text then
  1430. FHints.Clear
  1431. else
  1432. FHints.Assign(Value);
  1433. end;
  1434. function TDefineDBNavigator.GetHints: TStrings;
  1435. begin
  1436. if (csDesigning in ComponentState) and not (csWriting in ComponentState) and
  1437. not (csReading in ComponentState) and (FHints.Count = 0) then
  1438. Result := FDefHints else
  1439. Result := FHints;
  1440. end;
  1441. procedure TDefineDBNavigator.GetChildren(Proc: TGetChildProc; Root: TComponent);
  1442. begin
  1443. end;
  1444. procedure TDefineDBNavigator.Notification(AComponent: TComponent;
  1445. Operation: TOperation);
  1446. begin
  1447. inherited Notification(AComponent, Operation);
  1448. if (Operation = opRemove) and (FDataLink <> nil) and
  1449. (AComponent = DataSource) then DataSource := nil;
  1450. end;
  1451. procedure TDefineDBNavigator.SetVisible(Value: TFlatDBBTSet);
  1452. var
  1453. I: TFlatDBBName;
  1454. W, H: Integer;
  1455. begin
  1456. W := Width;
  1457. H := Height;
  1458. FVisibleBtns := Value;
  1459. for I := Low(Buttons) to High(Buttons) do Buttons[I].Visible := I in FVisibleBtns;
  1460. SetSize(W, H);
  1461. if (W <> Width) or (H <> Height) then inherited SetBounds(Left, Top, W, H);
  1462. Invalidate;
  1463. end;
  1464. procedure TDefineDBNavigator.CalcMinSize(var W, H: Integer);
  1465. var
  1466. Count: Integer;
  1467. I: TFlatDBBName;
  1468. begin
  1469. if (csLoading in ComponentState) then Exit;
  1470. if Buttons[vbFirst] = nil then Exit;
  1471. Count := 0;
  1472. for I := Low(Buttons) to High(Buttons) do if Buttons[I].Visible then Inc(Count);
  1473. if Count = 0 then Inc(Count);
  1474. W := Max(W, Count * MinBtnSize.X);
  1475. H := Max(H, MinBtnSize.Y);
  1476. if Align = alNone then W := (W div Count) * Count;
  1477. end;
  1478. procedure TDefineDBNavigator.SetSize(var W: Integer; var H: Integer);
  1479. var
  1480. Count: Integer;
  1481. I: TFlatDBBName;
  1482. Space, Temp, Remain: Integer;
  1483. X: Integer;
  1484. begin
  1485. if (csLoading in ComponentState) then Exit;
  1486. if Buttons[vbFirst] = nil then Exit;
  1487. CalcMinSize(W, H);
  1488. Count := 0;
  1489. for I := Low(Buttons) to High(Buttons) do if Buttons[I].Visible then Inc(Count);
  1490. if Count = 0 then Inc(Count);
  1491. ButtonWidth := W div Count;
  1492. Temp := Count * ButtonWidth;
  1493. if Align = alNone then W := Temp;
  1494. X := 0;
  1495. Remain := W - Temp;
  1496. Temp := Count div 2;
  1497. for I := Low(Buttons) to High(Buttons) do
  1498. begin
  1499. if Buttons[I].Visible then
  1500. begin
  1501. Space := 0;
  1502. if Remain <> 0 then
  1503. begin
  1504. Dec(Temp, Remain);
  1505. if Temp < 0 then
  1506. begin
  1507. Inc(Temp, Count);
  1508. Space := 1;
  1509. end;
  1510. end;
  1511. Buttons[I].SetBounds(X, 0, ButtonWidth + Space, Height);
  1512. Inc(X, ButtonWidth + Space);
  1513. end
  1514. else
  1515. Buttons[I].SetBounds(Width + 1, 0, ButtonWidth, Height);
  1516. end;
  1517. end;
  1518. procedure TDefineDBNavigator.SetBounds(ALeft, ATop, AWidth, AHeight: Integer);
  1519. var
  1520. W, H: Integer;
  1521. begin
  1522. W := AWidth;
  1523. H := AHeight;
  1524. if not HandleAllocated then SetSize(W, H);
  1525. inherited SetBounds (ALeft, ATop, W, H);
  1526. end;
  1527. procedure TDefineDBNavigator.WMSize(var Message: TWMSize);
  1528. var
  1529. W, H: Integer;
  1530. begin
  1531. inherited;
  1532. W := Width;
  1533. H := Height;
  1534. SetSize(W, H);
  1535. end;
  1536. procedure TDefineDBNavigator.WMWindowPosChanging(var Message: TWMWindowPosChanging);
  1537. begin
  1538. inherited;
  1539. if (SWP_NOSIZE and Message.WindowPos.Flags) = 0 then
  1540. CalcMinSize(Message.WindowPos.cx, Message.WindowPos.cy);
  1541. end;
  1542. procedure TDefineDBNavigator.ClickHandler(Sender: TObject);
  1543. begin
  1544. BtnClick(TDefineDBNButton(Sender).Index);
  1545. end;
  1546. procedure TDefineDBNavigator.BtnMouseDown(Sender: TObject; Button: TMouseButton;
  1547. Shift: TShiftState; X, Y: Integer);
  1548. var
  1549. OldFocus: TFlatDBBName;
  1550. begin
  1551. OldFocus := FocusedButton;
  1552. FocusedButton := TDefineDBNButton (Sender).Index;
  1553. if TabStop and (GetFocus <> Handle) and CanFocus then
  1554. begin
  1555. SetFocus;
  1556. if (GetFocus <> Handle) then
  1557. Exit;
  1558. end
  1559. else if TabStop and (GetFocus = Handle) and (OldFocus <> FocusedButton) then
  1560. begin
  1561. Buttons[OldFocus].Invalidate;
  1562. Buttons[FocusedButton].Invalidate;
  1563. end;
  1564. end;
  1565. procedure TDefineDBNavigator.BtnClick(Index: TFlatDBBName);
  1566. begin
  1567. if (DataSource <> nil) and (DataSource.State <> dsInactive) then
  1568. begin
  1569. if not (csDesigning in ComponentState) and Assigned(FBeforeAction) then
  1570. FBeforeAction(Self, Index);
  1571. with DataSource.DataSet do
  1572. begin
  1573. case Index of
  1574. vbPrior : Prior;
  1575. vbNext : Next;
  1576. vbFirst : First;
  1577. vbLast : Last;
  1578. vbNew : Insert;
  1579. vbEdit : Edit;
  1580. vbCancel: Cancel;
  1581. vbSave : Post;
  1582. vbRefresh: Refresh;
  1583. vbDelete:
  1584. if(not FConfirmDelete)or(ShowBox(myDeleteRecordQuestion, mbIYN)<>idCancel) then Delete;
  1585. end;
  1586. end;
  1587. end;
  1588. if not (csDesigning in ComponentState) and Assigned(FOnNavClick) then FOnNavClick(Self, Index);
  1589. end;
  1590. procedure TDefineDBNavigator.WMSetFocus(var Message: TWMSetFocus);
  1591. begin
  1592. Buttons[FocusedButton].Invalidate;
  1593. end;
  1594. procedure TDefineDBNavigator.WMKillFocus(var Message: TWMKillFocus);
  1595. begin
  1596. Buttons[FocusedButton].Invalidate;
  1597. end;
  1598. procedure TDefineDBNavigator.KeyDown(var Key: Word; Shift: TShiftState);
  1599. var
  1600. NewFocus: TFlatDBBName;
  1601. OldFocus: TFlatDBBName;
  1602. begin
  1603. OldFocus := FocusedButton;
  1604. case Key of
  1605. VK_RIGHT:
  1606. begin
  1607. NewFocus := FocusedButton;
  1608. repeat
  1609. if NewFocus < High(Buttons) then
  1610. NewFocus := Succ(NewFocus);
  1611. until (NewFocus = High(Buttons)) or (Buttons[NewFocus].Visible);
  1612. if NewFocus <> FocusedButton then
  1613. begin
  1614. FocusedButton := NewFocus;
  1615. Buttons[OldFocus].Invalidate;
  1616. Buttons[FocusedButton].Invalidate;
  1617. end;
  1618. end;
  1619. VK_LEFT:
  1620. begin
  1621. NewFocus := FocusedButton;
  1622. repeat
  1623. if NewFocus > Low(Buttons) then
  1624. NewFocus := Pred(NewFocus);
  1625. until (NewFocus = Low(Buttons)) or (Buttons[NewFocus].Visible);
  1626. if NewFocus <> FocusedButton then
  1627. begin
  1628. FocusedButton := NewFocus;
  1629. Buttons[OldFocus].Invalidate;
  1630. Buttons[FocusedButton].Invalidate;
  1631. end;
  1632. end;
  1633. VK_SPACE:
  1634. begin
  1635. if Buttons[FocusedButton].Enabled then
  1636. Buttons[FocusedButton].Click;
  1637. end;
  1638. end;
  1639. end;
  1640. procedure TDefineDBNavigator.WMGetDlgCode(var Message: TWMGetDlgCode);
  1641. begin
  1642. Message.Result := DLGC_WANTARROWS;
  1643. end;
  1644. procedure TDefineDBNavigator.DataChanged;
  1645. var
  1646. UpEnable, DnEnable: Boolean;
  1647. begin
  1648. UpEnable := Enabled and FDataLink.Active and not FDataLink.DataSet.BOF;
  1649. DnEnable := Enabled and FDataLink.Active and not FDataLink.DataSet.EOF;
  1650. Buttons[vbFirst].Enabled := UpEnable;
  1651. Buttons[vbPrior].Enabled := UpEnable;
  1652. Buttons[vbNext].Enabled := DnEnable;
  1653. Buttons[vbLast].Enabled := DnEnable;
  1654. Buttons[vbDelete].Enabled := Enabled and FDataLink.Active and
  1655. FDataLink.DataSet.CanModify and
  1656. not (FDataLink.DataSet.BOF and FDataLink.DataSet.EOF);
  1657. end;
  1658. procedure TDefineDBNavigator.EditingChanged;
  1659. var
  1660. CanModify: Boolean;
  1661. begin
  1662. CanModify := Enabled and FDataLink.Active and FDataLink.DataSet.CanModify;
  1663. Buttons[vbNew].Enabled := CanModify;
  1664. Buttons[vbEdit].Enabled := CanModify and not FDataLink.Editing;
  1665. Buttons[vbSave].Enabled := CanModify and FDataLink.Editing;
  1666. Buttons[vbCancel].Enabled := CanModify and FDataLink.Editing;
  1667. Buttons[vbRefresh].Enabled := CanModify;
  1668. end;
  1669. procedure TDefineDBNavigator.ActiveChanged;
  1670. var
  1671. I: TFlatDBBName;
  1672. begin
  1673. if not (Enabled and FDataLink.Active) then
  1674. for I := Low(Buttons) to High(Buttons) do
  1675. Buttons[I].Enabled := False
  1676. else
  1677. begin
  1678. DataChanged;
  1679. EditingChanged;
  1680. end;
  1681. end;
  1682. procedure TDefineDBNavigator.CMEnabledChanged(var Message: TMessage);
  1683. begin
  1684. inherited;
  1685. if not (csLoading in ComponentState) then
  1686. ActiveChanged;
  1687. end;
  1688. procedure TDefineDBNavigator.SetDataSource(Value: TDataSource);
  1689. begin
  1690. FDataLink.DataSource := Value;
  1691. if not (csLoading in ComponentState) then
  1692. ActiveChanged;
  1693. if Value <> nil then Value.FreeNotification(Self);
  1694. end;
  1695. function TDefineDBNavigator.GetDataSource: TDataSource;
  1696. begin
  1697. Result := FDataLink.DataSource;
  1698. end;
  1699. procedure TDefineDBNavigator.Loaded;
  1700. var
  1701. W, H: Integer;
  1702. begin
  1703. inherited Loaded;
  1704. W := Width;
  1705. H := Height;
  1706. SetSize(W, H);
  1707. if (W <> Width) or (H <> Height) then
  1708. inherited SetBounds (Left, Top, W, H);
  1709. InitHints;
  1710. ActiveChanged;
  1711. end;
  1712. procedure TDefineDBNavigator.SetColors(Index: Integer; Value: TColor);
  1713. var I: TFlatDBBName;
  1714. begin
  1715. inherited;
  1716. for I := low(Buttons) to high(Buttons) do
  1717. begin
  1718. Buttons[i].ColorBorder := Value;
  1719. end;
  1720. end;
  1721. { TDefineDBNDataLink }
  1722. constructor TDefineDBNDataLink.Create(ANav: TDefineDBNavigator);
  1723. begin
  1724. inherited Create;
  1725. FBrowser := ANav;
  1726. VisualControl := True;
  1727. end;
  1728. destructor TDefineDBNDataLink.Destroy;
  1729. begin
  1730. FBrowser := nil;
  1731. inherited Destroy;
  1732. end;
  1733. procedure TDefineDBNDataLink.EditingChanged;
  1734. begin
  1735. if FBrowser <> nil then FBrowser.EditingChanged;
  1736. end;
  1737. procedure TDefineDBNDataLink.DataSetChanged;
  1738. begin
  1739. if FBrowser <> nil then FBrowser.DataChanged;
  1740. end;
  1741. procedure TDefineDBNDataLink.ActiveChanged;
  1742. begin
  1743. if FBrowser <> nil then FBrowser.ActiveChanged;
  1744. end;
  1745. {TDefineDBNButton}
  1746. destructor TDefineDBNButton.Destroy;
  1747. begin
  1748. if FRepeatTimer <> nil then
  1749. FRepeatTimer.Free;
  1750. inherited Destroy;
  1751. end;
  1752. procedure TDefineDBNButton.MouseDown(Button: TMouseButton; Shift: TShiftState;
  1753. X, Y: Integer);
  1754. begin
  1755. inherited MouseDown (Button, Shift, X, Y);
  1756. if myAllowTimer in FBroStyle then
  1757. begin
  1758. if FRepeatTimer = nil then
  1759. FRepeatTimer := TTimer.Create(Self);
  1760. FRepeatTimer.OnTimer := TimerExpired;
  1761. FRepeatTimer.Interval := FlatInitRepeatPause;
  1762. FRepeatTimer.Enabled := True;
  1763. end;
  1764. end;
  1765. procedure TDefineDBNButton.MouseUp(Button: TMouseButton; Shift: TShiftState;
  1766. X, Y: Integer);
  1767. begin
  1768. inherited MouseUp (Button, Shift, X, Y);
  1769. if FRepeatTimer <> nil then
  1770. FRepeatTimer.Enabled := False;
  1771. end;
  1772. procedure TDefineDBNButton.TimerExpired(Sender: TObject);
  1773. begin
  1774. FRepeatTimer.Interval :=FlatRepeatPause;
  1775. if (FState = bsDown) and MouseCapture then
  1776. begin
  1777. try
  1778. Click;
  1779. except
  1780. FRepeatTimer.Enabled := False;
  1781. raise;
  1782. end;
  1783. end;
  1784. end;
  1785. { TDefineDBComboBox }
  1786. constructor TDefineDBComboBox.Create(AOwner: TComponent);
  1787. begin
  1788. inherited Create(AOwner);
  1789. ControlStyle := ControlStyle + [csReplicatable];
  1790. FDataLink := TFieldDataLink.Create;
  1791. FDataLink.Control := Self;
  1792. FDataLink.OnDataChange := DataChange;
  1793. FDataLink.OnUpdateData := UpdateData;
  1794. FDataLink.OnEditingChange := EditingChange;
  1795. FDataLink.OnActiveChange := ActiveChange;
  1796. FPaintControl := TPaintControl.Create(Self, 'COMBOBOX');
  1797. end;
  1798. destructor TDefineDBComboBox.Destroy;
  1799. begin
  1800. FPaintControl.Free;
  1801. FDataLink.Free;
  1802. FDataLink := nil;
  1803. inherited Destroy;
  1804. end;
  1805. procedure TDefineDBComboBox.Loaded;
  1806. begin
  1807. inherited Loaded;
  1808. ResetMaxLength;
  1809. if(csDesigning in ComponentState) then DataChange(Self);
  1810. end;
  1811. procedure TDefineDBComboBox.ActiveChange(Sender: TObject);
  1812. begin
  1813. ResetMaxLength;
  1814. end;
  1815. procedure TDefineDBComboBox.Notification(AComponent: TComponent;
  1816. Operation: TOperation);
  1817. begin
  1818. inherited Notification(AComponent, Operation);
  1819. if(Operation = opRemove) and(FDataLink <> nil) and
  1820. (AComponent = DataSource) then DataSource := nil;
  1821. end;
  1822. procedure TDefineDBComboBox.CreateWnd;
  1823. begin
  1824. inherited CreateWnd;
  1825. SetEditReadOnly;
  1826. end;
  1827. procedure TDefineDBComboBox.ResetMaxLength;
  1828. var
  1829. F: TField;
  1830. begin
  1831. if (MaxLength > 0) and Assigned(DataSource) and Assigned(DataSource.DataSet) then
  1832. begin
  1833. F := DataSource.DataSet.FindField(DataField);
  1834. if Assigned(F) and (F.DataType in [ftString, ftWideString]) and (F.Size = MaxLength) then
  1835. MaxLength := 0;
  1836. end;
  1837. end;
  1838. procedure TDefineDBComboBox.DataChange(Sender: TObject);
  1839. begin
  1840. if not(Style = csSimple) and DroppedDown then Exit;
  1841. if not (csDesigning in ComponentState) then
  1842. begin
  1843. if (FDataLink.Field.DataType in [ftString, ftWideString]) and (MaxLength = 0) then
  1844. MaxLength := FDataLink.Field.Size;
  1845. end;
  1846. if FDataLink.Field <> nil then
  1847. SetComboText(FDataLink.Field.Text)
  1848. else
  1849. if csDesigning in ComponentState then
  1850. begin
  1851. if DataField <> '' then
  1852. SetComBoText(DataField)
  1853. else
  1854. SetComboText(Name);
  1855. end else
  1856. SetComboText('');
  1857. end;
  1858. procedure TDefineDBComboBox.UpdateData(Sender: TObject);
  1859. begin
  1860. FDataLink.Field.Text := GetComboText;
  1861. end;
  1862. procedure TDefineDBComboBox.SetComboText(const Value: string);
  1863. var
  1864. I: Integer;
  1865. Redraw: Boolean;
  1866. begin
  1867. if Value <> GetComboText then
  1868. begin
  1869. if Style <> csDropDown then
  1870. begin
  1871. Redraw :=(Style <> csSimple) and HandleAllocated;
  1872. if Redraw then SendMessage(Handle, WM_SETREDRAW, 0, 0);
  1873. try
  1874. if Value = '' then I := -1 else I := Items.IndexOf(Value);
  1875. ItemIndex := I;
  1876. finally
  1877. if Redraw then
  1878. begin
  1879. SendMessage(Handle, WM_SETREDRAW, 1, 0);
  1880. Invalidate;
  1881. end;
  1882. end;
  1883. if I >= 0 then Exit;
  1884. end;
  1885. if Style in [csDropDown, csSimple] then Text := Value;
  1886. end;
  1887. end;
  1888. function TDefineDBComboBox.GetComboText: string;
  1889. var
  1890. I: Integer;
  1891. begin
  1892. if Style in [csDropDown, csSimple] then Result := Text else
  1893. begin
  1894. I := ItemIndex;
  1895. if I < 0 then Result := '' else Result := Items[I];
  1896. end;
  1897. end;
  1898. procedure TDefineDBComboBox.Change;
  1899. begin
  1900. FDataLink.Edit;
  1901. inherited Change;
  1902. FDataLink.Modified;
  1903. end;
  1904. procedure TDefineDBComboBox.Click;
  1905. begin
  1906. FDataLink.Edit;
  1907. inherited Click;
  1908. FDataLink.Modified;
  1909. end;
  1910. procedure TDefineDBComboBox.DropDown;
  1911. begin
  1912. inherited DropDown;
  1913. end;
  1914. function TDefineDBComboBox.GetDataSource: TDataSource;
  1915. begin
  1916. Result := FDataLink.DataSource;
  1917. end;
  1918. procedure TDefineDBComboBox.SetDataSource(Value: TDataSource);
  1919. begin
  1920. if not(FDataLink.DataSourceFixed and(csLoading in ComponentState)) then
  1921. FDataLink.DataSource := Value;
  1922. if Value <> nil then Value.FreeNotification(Self);
  1923. end;
  1924. function TDefineDBComboBox.GetDataField: string;
  1925. begin
  1926. Result := FDataLink.FieldName;
  1927. end;
  1928. procedure TDefineDBComboBox.SetDataField(const Value: string);
  1929. begin
  1930. if not (csDesigning in ComponentState) then
  1931. ResetMaxLength;
  1932. FDataLink.FieldName := Value;
  1933. end;
  1934. function TDefineDBComboBox.GetReadOnly: Boolean;
  1935. begin
  1936. Result := FDataLink.ReadOnly;
  1937. end;
  1938. procedure TDefineDBComboBox.SetReadOnly(Value: Boolean);
  1939. begin
  1940. FDataLink.ReadOnly := Value;
  1941. end;
  1942. function TDefineDBComboBox.GetField: TField;
  1943. begin
  1944. Result := FDataLink.Field;
  1945. end;
  1946. procedure TDefineDBComboBox.KeyDown(var Key: Word; Shift: TShiftState);
  1947. begin
  1948. inherited KeyDown(Key, Shift);
  1949. if Key in [VK_BACK, VK_DELETE, VK_UP, VK_DOWN, 32..255] then
  1950. begin
  1951. if not FDataLink.Edit and(Key in [VK_UP, VK_DOWN]) then
  1952. Key := 0;
  1953. end;
  1954. end;
  1955. procedure TDefineDBComboBox.KeyPress(var Key: Char);
  1956. begin
  1957. inherited KeyPress(Key);
  1958. if(Key in [#32..#255]) and(FDataLink.Field <> nil) and
  1959. not FDataLink.Field.IsValidChar(Key) then
  1960. begin
  1961. MessageBeep(0);
  1962. Key := #0;
  1963. end;
  1964. case Key of
  1965. ^H, ^V, ^X, #32..#255:
  1966. FDataLink.Edit;
  1967. #27:
  1968. begin
  1969. FDataLink.Reset;
  1970. SelectAll;
  1971. end;
  1972. end;
  1973. end;
  1974. procedure TDefineDBComboBox.EditingChange(Sender: TObject);
  1975. begin
  1976. SetEditReadOnly;
  1977. end;
  1978. procedure TDefineDBComboBox.SetEditReadOnly;
  1979. begin
  1980. if(Style in [csDropDown, csSimple]) and HandleAllocated then
  1981. SendMessage(EditHandle, EM_SETREADONLY, Ord(not FDataLink.Editing), 0);
  1982. end;
  1983. procedure TDefineDBComboBox.WndProc(var Message: TMessage);
  1984. begin
  1985. if not(csDesigning in ComponentState) then
  1986. case Message.Msg of
  1987. WM_COMMAND:
  1988. if TWMCommand(Message).NotifyCode = CBN_SELCHANGE then
  1989. if not FDataLink.Edit then
  1990. begin
  1991. if Style <> csSimple then
  1992. PostMessage(Handle, CB_SHOWDROPDOWN, 0, 0);
  1993. Exit;
  1994. end;
  1995. CB_SHOWDROPDOWN:
  1996. if Message.WParam <> 0 then FDataLink.Edit else
  1997. if not FDataLink.Editing then DataChange(Self); {Restore text}
  1998. WM_CREATE,
  1999. WM_WINDOWPOSCHANGED,
  2000. CM_FONTCHANGED:
  2001. FPaintControl.DestroyHandle;
  2002. end;
  2003. inherited WndProc(Message);
  2004. end;
  2005. procedure TDefineDBComboBox.ComboWndProc(var Message: TMessage; ComboWnd: HWnd;
  2006. ComboProc: Pointer);
  2007. begin
  2008. if not(csDesigning in ComponentState) then
  2009. case Message.Msg of
  2010. WM_LBUTTONDOWN:
  2011. if(Style = csSimple) and(ComboWnd <> EditHandle) then
  2012. if not FDataLink.Edit then Exit;
  2013. end;
  2014. inherited ComboWndProc(Message, ComboWnd, ComboProc);
  2015. end;
  2016. procedure TDefineDBComboBox.CMEnter(var Message: TCMEnter);
  2017. begin
  2018. inherited;
  2019. if SysLocale.FarEast and FDataLink.CanModify then
  2020. SendMessage(EditHandle, EM_SETREADONLY, Ord(False), 0);
  2021. end;
  2022. procedure TDefineDBComboBox.CMExit(var Message: TCMExit);
  2023. begin
  2024. try
  2025. FDataLink.UpdateRecord;
  2026. except
  2027. SelectAll;
  2028. SetFocus;
  2029. raise;
  2030. end;
  2031. inherited;
  2032. end;
  2033. procedure TDefineDBComboBox.WMPaint(var Message: TWMPaint);
  2034. var
  2035. S: string;
  2036. R: TRect;
  2037. P: TPoint;
  2038. Child: HWND;
  2039. begin
  2040. if csPaintCopy in ControlState then
  2041. begin
  2042. if FDataLink.Field <> nil then S := FDataLink.Field.Text else S := '';
  2043. if Style = csDropDown then
  2044. begin
  2045. SendMessage(FPaintControl.Handle, WM_SETTEXT, 0, Longint(PChar(S)));
  2046. SendMessage(FPaintControl.Handle, WM_PAINT, Message.DC, 0);
  2047. Child := GetWindow(FPaintControl.Handle, GW_CHILD);
  2048. if Child <> 0 then
  2049. begin
  2050. Windows.GetClientRect(Child, R);
  2051. Windows.MapWindowPoints(Child, FPaintControl.Handle, R.TopLeft, 2);
  2052. GetWindowOrgEx(Message.DC, P);
  2053. SetWindowOrgEx(Message.DC, P.X - R.Left, P.Y - R.Top, nil);
  2054. IntersectClipRect(Message.DC, 0, 0, R.Right - R.Left, R.Bottom - R.Top);
  2055. SendMessage(Child, WM_PAINT, Message.DC, 0);
  2056. end;
  2057. end else
  2058. begin
  2059. SendMessage(FPaintControl.Handle, CB_RESETCONTENT, 0, 0);
  2060. if Items.IndexOf(S) <> -1 then
  2061. begin
  2062. SendMessage(FPaintControl.Handle, CB_ADDSTRING, 0, Longint(PChar(S)));
  2063. SendMessage(FPaintControl.Handle, CB_SETCURSEL, 0, 0);
  2064. end;
  2065. SendMessage(FPaintControl.Handle, WM_PAINT, Message.DC, 0);
  2066. end;
  2067. end else
  2068. inherited;
  2069. end;
  2070. procedure TDefineDBComboBox.SetItems(const Value: TStrings);
  2071. begin
  2072. inherited SetItems(Value);
  2073. DataChange(Self);
  2074. end;
  2075. procedure TDefineDBComboBox.SetStyle(Value: TComboboxStyle);
  2076. begin
  2077. if(Value = csSimple) and Assigned(FDatalink) and FDatalink.DatasourceFixed then
  2078. DatabaseError(SNotReplicatable);
  2079. inherited SetStyle(Value);
  2080. end;
  2081. function TDefineDBComboBox.UseRightToLeftAlignment: Boolean;
  2082. begin
  2083. Result := DBUseRightToLeftAlignment(Self, Field);
  2084. end;
  2085. procedure TDefineDBComboBox.CMGetDatalink(var Message: TMessage);
  2086. begin
  2087. Message.Result := Integer(FDataLink);
  2088. end;
  2089. function TDefineDBComboBox.ExecuteAction(Action: TBasicAction): Boolean;
  2090. begin
  2091. Result := inherited ExecuteAction(Action) or(FDataLink <> nil) and
  2092. FDataLink.ExecuteAction(Action);
  2093. end;
  2094. function TDefineDBComboBox.UpdateAction(Action: TBasicAction): Boolean;
  2095. begin
  2096. Result := inherited UpdateAction(Action) or(FDataLink <> nil) and
  2097. FDataLink.UpdateAction(Action);
  2098. end;
  2099. { TDefineDBListBox }
  2100. constructor TDefineDBListBox.Create(AOwner: TComponent);
  2101. begin
  2102. inherited Create(AOwner);
  2103. FDataLink := TFieldDataLink.Create;
  2104. FDataLink.Control := Self;
  2105. FDataLink.OnDataChange := DataChange;
  2106. FDataLink.OnUpdateData := UpdateData;
  2107. end;
  2108. destructor TDefineDBListBox.Destroy;
  2109. begin
  2110. FDataLink.Free;
  2111. FDataLink := nil;
  2112. inherited Destroy;
  2113. end;
  2114. procedure TDefineDBListBox.Notification(AComponent: TComponent;
  2115. Operation: TOperation);
  2116. begin
  2117. inherited Notification(AComponent, Operation);
  2118. if(Operation = opRemove) and(FDataLink <> nil) and
  2119. (AComponent = DataSource) then DataSource := nil;
  2120. end;
  2121. function TDefineDBListBox.UseRightToLeftAlignment: Boolean;
  2122. begin
  2123. Result := DBUseRightToLeftAlignment(Self, Field);
  2124. end;
  2125. procedure TDefineDBListBox.DataChange(Sender: TObject);
  2126. begin
  2127. if FDataLink.Field <> nil then
  2128. ItemIndex := Items.IndexOf(FDataLink.Field.Text)
  2129. else
  2130. ItemIndex := -1;
  2131. end;
  2132. procedure TDefineDBListBox.UpdateData(Sender: TObject);
  2133. begin
  2134. if ItemIndex >= 0 then
  2135. FDataLink.Field.Text := Items[ItemIndex]
  2136. else
  2137. FDataLink.Field.Text := '';
  2138. end;
  2139. procedure TDefineDBListBox.Click;
  2140. begin
  2141. if FDataLink.Edit then
  2142. begin
  2143. inherited Click;
  2144. FDataLink.Modified;
  2145. end;
  2146. end;
  2147. function TDefineDBListBox.GetDataSource: TDataSource;
  2148. begin
  2149. Result := FDataLink.DataSource;
  2150. end;
  2151. procedure TDefineDBListBox.SetDataSource(Value: TDataSource);
  2152. begin
  2153. FDataLink.DataSource := Value;
  2154. if Value <> nil then Value.FreeNotification(Self);
  2155. end;
  2156. function TDefineDBListBox.GetDataField: string;
  2157. begin
  2158. Result := FDataLink.FieldName;
  2159. end;
  2160. procedure TDefineDBListBox.SetDataField(const Value: string);
  2161. begin
  2162. FDataLink.FieldName := Value;
  2163. end;
  2164. function TDefineDBListBox.GetReadOnly: Boolean;
  2165. begin
  2166. Result := FDataLink.ReadOnly;
  2167. end;
  2168. procedure TDefineDBListBox.SetReadOnly(Value: Boolean);
  2169. begin
  2170. FDataLink.ReadOnly := Value;
  2171. end;
  2172. function TDefineDBListBox.GetField: TField;
  2173. begin
  2174. Result := FDataLink.Field;
  2175. end;
  2176. procedure TDefineDBListBox.KeyDown(var Key: Word; Shift: TShiftState);
  2177. begin
  2178. inherited KeyDown(Key, Shift);
  2179. if Key in [VK_PRIOR, VK_NEXT, VK_END, VK_HOME, VK_LEFT, VK_UP,
  2180. VK_RIGHT, VK_DOWN] then
  2181. if not FDataLink.Edit then Key := 0;
  2182. end;
  2183. procedure TDefineDBListBox.KeyPress(var Key: Char);
  2184. begin
  2185. inherited KeyPress(Key);
  2186. case Key of
  2187. #32..#255:
  2188. if not FDataLink.Edit then Key := #0;
  2189. #27:
  2190. FDataLink.Reset;
  2191. end;
  2192. end;
  2193. procedure TDefineDBListBox.WMLButtonDown(var Message: TWMLButtonDown);
  2194. begin
  2195. if FDataLink.Edit then inherited
  2196. else
  2197. begin
  2198. Self.SetFocus;
  2199. with Message do
  2200. MouseDown(mbLeft, KeysToShiftState(Keys), XPos, YPos);
  2201. end;
  2202. end;
  2203. procedure TDefineDBListBox.CMExit(var Message: TCMExit);
  2204. begin
  2205. try
  2206. if IndexInCount(ItemIndex, Items.Count) then
  2207. FDataLink.UpdateRecord;
  2208. except
  2209. Self.SetFocus;
  2210. raise;
  2211. end;
  2212. inherited;
  2213. end;
  2214. procedure TDefineDBListBox.SetItems(Value: TStringList);
  2215. begin
  2216. Items.Assign(Value);
  2217. DataChange(Self);
  2218. end;
  2219. function TDefineDBListBox.ExecuteAction(Action: TBasicAction): Boolean;
  2220. begin
  2221. Result := inherited ExecuteAction(Action) or(FDataLink <> nil) and
  2222. FDataLink.ExecuteAction(Action);
  2223. end;
  2224. function TDefineDBListBox.UpdateAction(Action: TBasicAction): Boolean;
  2225. begin
  2226. Result := inherited UpdateAction(Action) or(FDataLink <> nil) and
  2227. FDataLink.UpdateAction(Action);
  2228. end;
  2229. { TDefineDBEdit }
  2230. procedure TDefineDBEdit.ResetMaxLength;
  2231. var
  2232. F: TField;
  2233. begin
  2234. if (MaxLength > 0) and Assigned(DataSource) and Assigned(DataSource.DataSet) then
  2235. begin
  2236. F := DataSource.DataSet.FindField(DataField);
  2237. if Assigned(F) and (F.DataType in [ftString, ftWideString]) and (F.Size = MaxLength) then
  2238. MaxLength := 0;
  2239. end;
  2240. end;
  2241. constructor TDefineDBEdit.Create(AOwner: TComponent);
  2242. begin
  2243. inherited Create(AOwner);
  2244. inherited ReadOnly := True;
  2245. ControlStyle := ControlStyle + [csReplicatable];
  2246. FDataLink := TFieldDataLink.Create;
  2247. FDataLink.Control := Self;
  2248. FDataLink.OnDataChange := DataChange;
  2249. FDataLink.OnEditingChange := EditingChange;
  2250. FDataLink.OnUpdateData := UpdateData;
  2251. FDataLink.OnActiveChange := ActiveChange;
  2252. end;
  2253. destructor TDefineDBEdit.Destroy;
  2254. begin
  2255. FDataLink.Free;
  2256. FDataLink := nil;
  2257. FCanvas.Free;
  2258. inherited Destroy;
  2259. end;
  2260. procedure TDefineDBEdit.Loaded;
  2261. begin
  2262. inherited Loaded;
  2263. ResetMaxLength;
  2264. if (csDesigning in ComponentState) then DataChange(Self);
  2265. end;
  2266. procedure TDefineDBEdit.Notification(AComponent: TComponent;
  2267. Operation: TOperation);
  2268. begin
  2269. inherited Notification(AComponent, Operation);
  2270. if (Operation = opRemove) and (FDataLink <> nil) and
  2271. (AComponent = DataSource) then DataSource := nil;
  2272. end;
  2273. function TDefineDBEdit.UseRightToLeftAlignment: Boolean;
  2274. begin
  2275. Result := DBUseRightToLeftAlignment(Self, Field);
  2276. end;
  2277. procedure TDefineDBEdit.KeyDown(var Key: Word; Shift: TShiftState);
  2278. begin
  2279. inherited KeyDown(Key, Shift);
  2280. if (Key = VK_DELETE) or ((Key = VK_INSERT) and (ssShift in Shift)) then
  2281. FDataLink.Edit;
  2282. end;
  2283. procedure TDefineDBEdit.KeyPress(var Key: Char);
  2284. begin
  2285. inherited KeyPress(Key);
  2286. if (Key in [#32..#255]) and (FDataLink.Field <> nil) and
  2287. not FDataLink.Field.IsValidChar(Key) then
  2288. begin
  2289. MessageBeep(0);
  2290. Key := #0;
  2291. end;
  2292. case Key of
  2293. ^H, ^V, ^X, #32..#255:
  2294. FDataLink.Edit;
  2295. #27:
  2296. begin
  2297. FDataLink.Reset;
  2298. SelectAll;
  2299. Key := #0;
  2300. end;
  2301. end;
  2302. end;
  2303. procedure TDefineDBEdit.SetFocused(Value: Boolean);
  2304. begin
  2305. if FFocused <> Value then
  2306. begin
  2307. FFocused := Value;
  2308. if (FAlignment <> taLeftJustify) then Invalidate;
  2309. FDataLink.Reset;
  2310. end;
  2311. end;
  2312. procedure TDefineDBEdit.Change;
  2313. begin
  2314. FDataLink.Modified;
  2315. inherited Change;
  2316. end;
  2317. function TDefineDBEdit.GetDataSource: TDataSource;
  2318. begin
  2319. Result := FDataLink.DataSource;
  2320. end;
  2321. procedure TDefineDBEdit.SetDataSource(Value: TDataSource);
  2322. begin
  2323. if not (FDataLink.DataSourceFixed and (csLoading in ComponentState)) then
  2324. FDataLink.DataSource := Value;
  2325. if Value <> nil then Value.FreeNotification(Self);
  2326. end;
  2327. function TDefineDBEdit.GetDataField: string;
  2328. begin
  2329. Result := FDataLink.FieldName;
  2330. end;
  2331. procedure TDefineDBEdit.SetDataField(const Value: string);
  2332. begin
  2333. if not (csDesigning in ComponentState) then
  2334. ResetMaxLength;
  2335. FDataLink.FieldName := Value;
  2336. end;
  2337. function TDefineDBEdit.GetReadOnly: Boolean;
  2338. begin
  2339. Result := FDataLink.ReadOnly;
  2340. end;
  2341. procedure TDefineDBEdit.SetReadOnly(Value: Boolean);
  2342. begin
  2343. FDataLink.ReadOnly := Value;
  2344. end;
  2345. function TDefineDBEdit.GetField: TField;
  2346. begin
  2347. Result := FDataLink.Field;
  2348. end;
  2349. procedure TDefineDBEdit.ActiveChange(Sender: TObject);
  2350. begin
  2351. ResetMaxLength;
  2352. end;
  2353. procedure TDefineDBEdit.DataChange(Sender: TObject);
  2354. begin
  2355. if FDataLink.Field <> nil then
  2356. begin
  2357. if FAlignment <> FDataLink.Field.Alignment then
  2358. begin
  2359. Text := ''; {forces update}
  2360. FAlignment := FDataLink.Field.Alignment;
  2361. end;
  2362. if not (csDesigning in ComponentState) then
  2363. begin
  2364. if (FDataLink.Field.DataType in [ftString, ftWideString]) and (MaxLength = 0) then
  2365. MaxLength := FDataLink.Field.Size;
  2366. end;
  2367. if FFocused and FDataLink.CanModify then
  2368. Text := FDataLink.Field.Text
  2369. else
  2370. begin
  2371. Text := FDataLink.Field.DisplayText;
  2372. if FDataLink.Editing then
  2373. Modified := True;
  2374. end;
  2375. end else
  2376. begin
  2377. FAlignment := taLeftJustify;
  2378. if csDesigning in ComponentState then
  2379. begin
  2380. if DataField <> '' then
  2381. Text := DataField
  2382. else
  2383. Text := Name;
  2384. end else
  2385. Text := '';
  2386. end;
  2387. end;
  2388. procedure TDefineDBEdit.EditingChange(Sender: TObject);
  2389. begin
  2390. inherited ReadOnly := not FDataLink.Editing;
  2391. end;
  2392. procedure TDefineDBEdit.UpdateData(Sender: TObject);
  2393. begin
  2394. FDataLink.Field.Text := Text;
  2395. end;
  2396. procedure TDefineDBEdit.WMUndo(var Message: TMessage);
  2397. begin
  2398. FDataLink.Edit;
  2399. inherited;
  2400. end;
  2401. procedure TDefineDBEdit.WMPaste(var Message: TMessage);
  2402. begin
  2403. FDataLink.Edit;
  2404. inherited;
  2405. end;
  2406. procedure TDefineDBEdit.WMCut(var Message: TMessage);
  2407. begin
  2408. FDataLink.Edit;
  2409. inherited;
  2410. end;
  2411. procedure TDefineDBEdit.CMEnter(var Message: TCMEnter);
  2412. begin
  2413. SetFocused(True);
  2414. inherited;
  2415. if SysLocale.FarEast and FDataLink.CanModify then
  2416. inherited ReadOnly := False;
  2417. end;
  2418. procedure TDefineDBEdit.CMExit(var Message: TCMExit);
  2419. begin
  2420. try
  2421. FDataLink.UpdateRecord;
  2422. except
  2423. SelectAll;
  2424. SetFocus;
  2425. raise;
  2426. end;
  2427. SetFocused(False);
  2428. DoExit;
  2429. end;
  2430. procedure TDefineDBEdit.WMPaint(var Message: TWMPaint);
  2431. const
  2432. AlignStyle : array[Boolean, TAlignment] of DWORD =
  2433. ((WS_EX_LEFT, WS_EX_RIGHT, WS_EX_LEFT),
  2434. (WS_EX_RIGHT, WS_EX_LEFT, WS_EX_LEFT));
  2435. var
  2436. Left: Integer;
  2437. Margins: TPoint;
  2438. R: TRect;
  2439. DC: HDC;
  2440. PS: TPaintStruct;
  2441. S: string;
  2442. AAlignment: TAlignment;
  2443. ExStyle: DWORD;
  2444. begin
  2445. AAlignment := FAlignment;
  2446. if UseRightToLeftAlignment then ChangeBiDiModeAlignment(AAlignment);
  2447. if ((AAlignment = taLeftJustify) or FFocused) and
  2448. not (csPaintCopy in ControlState) then
  2449. begin
  2450. if SysLocale.MiddleEast and HandleAllocated and (IsRightToLeft) then
  2451. begin { This keeps the right aligned text, right aligned }
  2452. ExStyle := DWORD(GetWindowLong(Handle, GWL_EXSTYLE)) and (not WS_EX_RIGHT) and
  2453. (not WS_EX_RTLREADING) and (not WS_EX_LEFTSCROLLBAR);
  2454. if UseRightToLeftReading then ExStyle := ExStyle or WS_EX_RTLREADING;
  2455. if UseRightToLeftScrollbar then ExStyle := ExStyle or WS_EX_LEFTSCROLLBAR;
  2456. ExStyle := ExStyle or
  2457. AlignStyle[UseRightToLeftAlignment, AAlignment];
  2458. if DWORD(GetWindowLong(Handle, GWL_EXSTYLE)) <> ExStyle then
  2459. SetWindowLong(Handle, GWL_EXSTYLE, ExStyle);
  2460. end;
  2461. inherited;
  2462. Exit;
  2463. end;
  2464. { Since edit controls do not handle justification unless multi-line (and
  2465. then only poorly) we will draw right and center justify manually unless
  2466. the edit has the focus. }
  2467. if FCanvas = nil then
  2468. begin
  2469. FCanvas := TControlCanvas.Create;
  2470. FCanvas.Control := Self;
  2471. end;
  2472. DC := Message.DC;
  2473. if DC = 0 then DC := BeginPaint(Handle, PS);
  2474. FCanvas.Handle := DC;
  2475. try
  2476. FCanvas.Font := Font;
  2477. with FCanvas do
  2478. begin
  2479. R := ClientRect;
  2480. if not (NewStyleControls and Ctl3D) and (BorderStyle = bsSingle) then
  2481. begin
  2482. Brush.Color := clWindowFrame;
  2483. FrameRect(R);
  2484. InflateRect(R, -1, -1);
  2485. end;
  2486. Brush.Color := Color;
  2487. if not Enabled then
  2488. Font.Color := clGrayText;
  2489. if (csPaintCopy in ControlState) and (FDataLink.Field <> nil) then
  2490. begin
  2491. S := FDataLink.Field.DisplayText;
  2492. case CharCase of
  2493. ecUpperCase: S := AnsiUpperCase(S);
  2494. ecLowerCase: S := AnsiLowerCase(S);
  2495. end;
  2496. end else
  2497. S := Text;
  2498. if PasswordChar <> #0 then FillChar(S[1], Length(S), PasswordChar);
  2499. Margins := GetTextMargins;
  2500. case AAlignment of
  2501. taLeftJustify: Left := Margins.X;
  2502. taRightJustify: Left := ClientWidth - TextWidth(S) - Margins.X - 1;
  2503. else
  2504. Left := (ClientWidth - TextWidth(S)) div 2;
  2505. end;
  2506. if SysLocale.MiddleEast then UpdateTextFlags;
  2507. TextRect(R, Left, Margins.Y, S);
  2508. end;
  2509. finally
  2510. FCanvas.Handle := 0;
  2511. if Message.DC = 0 then EndPaint(Handle, PS);
  2512. end;
  2513. end;
  2514. procedure TDefineDBEdit.CMGetDataLink(var Message: TMessage);
  2515. begin
  2516. // Message.Result := Integer(FDataLink);
  2517. Message.Result := SizeOf(FDataLink);
  2518. end;
  2519. function TDefineDBEdit.GetTextMargins: TPoint;
  2520. var
  2521. DC: HDC;
  2522. SaveFont: HFont;
  2523. I: Integer;
  2524. SysMetrics, Metrics: TTextMetric;
  2525. begin
  2526. if NewStyleControls then
  2527. begin
  2528. if BorderStyle = bsNone then I := 0 else
  2529. if Ctl3D then I := 1 else I := 2;
  2530. Result.X := SendMessage(Handle, EM_GETMARGINS, 0, 0) and $0000FFFF + I;
  2531. Result.Y := I;
  2532. end else
  2533. begin
  2534. if BorderStyle = bsNone then I := 0 else
  2535. begin
  2536. DC := GetDC(0);
  2537. GetTextMetrics(DC, SysMetrics);
  2538. SaveFont := SelectObject(DC, Font.Handle);
  2539. GetTextMetrics(DC, Metrics);
  2540. SelectObject(DC, SaveFont);
  2541. ReleaseDC(0, DC);
  2542. I := SysMetrics.tmHeight;
  2543. if I > Metrics.tmHeight then I := Metrics.tmHeight;
  2544. I := I div 4;
  2545. end;
  2546. Result.X := I;
  2547. Result.Y := I;
  2548. end;
  2549. end;
  2550. function TDefineDBEdit.ExecuteAction(Action: TBasicAction): Boolean;
  2551. begin
  2552. Result := inherited ExecuteAction(Action) or (FDataLink <> nil) and
  2553. FDataLink.ExecuteAction(Action);
  2554. end;
  2555. function TDefineDBEdit.UpdateAction(Action: TBasicAction): Boolean;
  2556. begin
  2557. Result := inherited UpdateAction(Action) or (FDataLink <> nil) and
  2558. FDataLink.UpdateAction(Action);
  2559. end;
  2560. { TDefineDBFloat }
  2561. procedure TDefineDBFloat.EditingChange(Sender: TObject);
  2562. begin
  2563. inherited ReadOnly := not FDataLink.Editing;
  2564. end;
  2565. function TDefineDBFloat.GetDataSource: TDataSource;
  2566. begin
  2567. Result := FDataLink.DataSource;
  2568. end;
  2569. procedure TDefineDBFloat.SetDataSource(Value: TDataSource);
  2570. begin
  2571. if not (FDataLink.DataSourceFixed and (csLoading in ComponentState)) then
  2572. FDataLink.DataSource := Value;
  2573. if Value <> nil then Value.FreeNotification(Self);
  2574. Enabled := FDataLink.Active and (FDataLink.Field <> nil) and
  2575. not FDataLink.Field.ReadOnly ;
  2576. end;
  2577. function TDefineDBFloat.GetField: TField;
  2578. begin
  2579. Result := FDataLink.Field;
  2580. end;
  2581. function TDefineDBFloat.GetDataField: string;
  2582. begin
  2583. Result := FDataLink.FieldName;
  2584. end;
  2585. procedure TDefineDBFloat.SetDataField(const Value: string);
  2586. begin
  2587. FDataLink.FieldName := Value;
  2588. end;
  2589. constructor TDefineDBFloat.Create(AOwner: TComponent);
  2590. begin
  2591. inherited Create(AOwner);
  2592. FDataLink := TFieldDataLink.Create;
  2593. FDataLink.Control := Self;
  2594. FDataLink.OnDataChange := DataChange;
  2595. FDataLink.OnEditingChange := EditingChange;
  2596. FDataLink.OnUpdateData := UpdateData;
  2597. FDataLink.OnActiveChange := ActiveChange;
  2598. end;
  2599. destructor TDefineDBFloat.Destroy;
  2600. begin
  2601. FDataLink.Free;
  2602. FDataLink := nil;
  2603. inherited Destroy;
  2604. end;
  2605. procedure TDefineDBFloat.DataChange(sender : TObject);
  2606. begin
  2607. if (FDataLink.Field <> nil) and
  2608. ((FDataLink.Field is TFloatField) or (FDataLink.Field is TCurrencyField)) then
  2609. value := FDataLink.Field.AsFloat
  2610. else
  2611. value := 0.00;
  2612. end;
  2613. procedure TDefineDBFloat.UpdateData(sender : TObject);
  2614. begin
  2615. if (FDataLink.Field <> nil) and
  2616. ((FDataLink.Field is TFloatField) or (FDataLink.Field is TCurrencyField)) then
  2617. FDataLink.Field.AsFloat := value ;
  2618. end;
  2619. procedure TDefineDBFloat.ActiveChange(sender : TObject);
  2620. begin
  2621. Enabled := FDataLink.Active and (FDataLink.Field <> nil);
  2622. end;
  2623. procedure TDefineDBFloat.CMExit(var Message:TCMExit);
  2624. begin
  2625. try
  2626. FDataLink.UpdateRecord;
  2627. except
  2628. SelectAll;
  2629. SetFocus;
  2630. raise;
  2631. end;
  2632. inherited;
  2633. end;
  2634. procedure TDefineDBFloat.KeyDown(var Key: Word; Shift: TShiftState);
  2635. begin
  2636. inherited KeyDown(Key, Shift);
  2637. if (Key = VK_DELETE) or ((Key = VK_INSERT) and (ssShift in Shift)) then
  2638. FDataLink.Edit;
  2639. end;
  2640. procedure TDefineDBFloat.KeyPress(var Key: Char);
  2641. begin
  2642. inherited KeyPress(Key);
  2643. if (Key in [#32..#255]) and (FDataLink.Field <> nil) and
  2644. not FDataLink.Field.IsValidChar(Key) then
  2645. begin
  2646. MessageBeep(0);
  2647. Key := #0;
  2648. end;
  2649. case Key of
  2650. {^H, ^V, ^X,} #48..#57:
  2651. FDataLink.Edit;
  2652. #27: //esc取消
  2653. begin
  2654. FDataLink.Reset;
  2655. SelectAll;
  2656. Key := #0;
  2657. end;
  2658. end;
  2659. end;
  2660. procedure TDefineDBFloat.Change;
  2661. begin
  2662. if FDataLink <> nil then
  2663. FDataLink.Modified;
  2664. inherited Change;
  2665. end;
  2666. procedure TDefineDBFloat.DownClick (Sender: TObject);
  2667. begin
  2668. inherited DownClick (Sender);
  2669. FDataLink.Edit;
  2670. end;
  2671. procedure TDefineDBFloat.UpClick (Sender: TObject);
  2672. begin
  2673. inherited UpClick (Sender);
  2674. FDataLink.Edit;
  2675. end;
  2676. function TDefineDBFloat.GetReadOnly: Boolean;
  2677. begin
  2678. Result := FDataLink.ReadOnly;
  2679. inherited ReadOnly := Result;
  2680. end;
  2681. procedure TDefineDBFloat.SetReadOnly(const Value: Boolean);
  2682. begin
  2683. FDataLink.ReadOnly := Value;
  2684. inherited ReadOnly := Value;
  2685. end;
  2686. { TDefineDBInteger }
  2687. function TDefineDBInteger.GetDataField : String;
  2688. begin
  2689. Result := FDataLink.FieldName;
  2690. end;
  2691. function TDefineDBInteger.GetDataSource : TDataSource;
  2692. begin
  2693. Result := FDataLink.DataSource;
  2694. end;
  2695. function TDefineDBInteger.GetReadOnly : Boolean;
  2696. begin
  2697. Result := FDataLink.ReadOnly;
  2698. inherited ReadOnly := Result;
  2699. end;
  2700. procedure TDefineDBInteger.SetReadOnly (aValue : Boolean);
  2701. begin
  2702. FDataLink.ReadOnly := aValue;
  2703. inherited ReadOnly := aValue;
  2704. end;
  2705. procedure TDefineDBInteger.SetDataSource (aValue : TDataSource);
  2706. begin
  2707. FDataLink.DataSource := aValue;
  2708. if aValue <> nil then aValue.FreeNotification(Self);
  2709. end;
  2710. procedure TDefineDBInteger.SetDataField (const aValue : String);
  2711. begin
  2712. FDataLink.FieldName := aValue;
  2713. end;
  2714. procedure TDefineDBInteger.DataChange (Sender : TObject);
  2715. begin
  2716. if FDataLink.Field <> nil then
  2717. begin
  2718. if not (csDesigning in ComponentState) then
  2719. begin
  2720. if (FDataLink.Field.DataType = ftInteger) and (MaxLength = 0) then
  2721. MaxLength := FDataLink.Field.Size;
  2722. end;
  2723. if {FFocused and} FDataLink.CanModify then
  2724. begin
  2725. Value := FDataLink.Field.AsInteger;
  2726. end
  2727. else
  2728. begin
  2729. Value := FDataLink.Field.AsInteger;
  2730. end;
  2731. end
  2732. end;
  2733. procedure TDefineDBInteger.UpdateData(Sender: TObject);
  2734. begin
  2735. FDataLink.Field.AsInteger := Value; { Value, Text }
  2736. end;
  2737. procedure TDefineDBInteger.EditingChange(Sender: TObject);
  2738. begin
  2739. inherited ReadOnly := not FDataLink.Editing;
  2740. end;
  2741. procedure TDefineDBInteger.WMPaste(var Message: TMessage);
  2742. begin
  2743. FDataLink.Edit;
  2744. inherited;
  2745. end;
  2746. procedure TDefineDBInteger.WMCut(var Message: TMessage);
  2747. begin
  2748. FDataLink.Edit;
  2749. inherited;
  2750. end;
  2751. procedure TDefineDBInteger.Change;
  2752. begin
  2753. if FDataLink <> nil then
  2754. FDataLink.Modified;
  2755. inherited Change;
  2756. end;
  2757. procedure TDefineDBInteger.Notification(AComponent: TComponent; Operation: TOperation);
  2758. begin
  2759. inherited Notification(AComponent, Operation);
  2760. if (Operation = opRemove) and (FDataLink <> nil) and
  2761. (AComponent = DataSource) then DataSource := nil;
  2762. end;
  2763. procedure TDefineDBInteger.CMGetDataLink(var Message: TMessage);
  2764. begin
  2765. Message.Result := Integer(FDataLink);
  2766. end;
  2767. procedure TDefineDBInteger.CMExit(var Message: TCMExit);
  2768. begin
  2769. try
  2770. FDataLink.UpdateRecord;
  2771. except
  2772. SelectAll;
  2773. SetFocus;
  2774. raise;
  2775. end;
  2776. end;
  2777. procedure TDefineDBInteger.KeyDown(var Key: Word; Shift: TShiftState);
  2778. begin
  2779. inherited KeyDown(Key, Shift);
  2780. if (Key = VK_DELETE) or ((Key = VK_INSERT) and (ssShift in Shift)) then
  2781. FDataLink.Edit;
  2782. end;
  2783. procedure TDefineDBInteger.KeyPress(var Key: Char);
  2784. begin
  2785. inherited KeyPress(Key);
  2786. if (Key in [#32..#255]) and (FDataLink.Field <> nil) and
  2787. not FDataLink.Field.IsValidChar(Key) then
  2788. begin
  2789. MessageBeep(0);
  2790. Key := #0;
  2791. end;
  2792. case Key of
  2793. {^H, ^V, ^X,} #48..#57:
  2794. FDataLink.Edit;
  2795. #27:
  2796. begin
  2797. FDataLink.Reset;
  2798. SelectAll;
  2799. Key := #0;
  2800. end;
  2801. end;
  2802. end;
  2803. procedure TDefineDBInteger.DownClick (Sender: TObject);
  2804. begin
  2805. inherited DownClick (Sender);
  2806. FDataLink.Edit;
  2807. end;
  2808. procedure TDefineDBInteger.UpClick (Sender: TObject);
  2809. begin
  2810. inherited UpClick (Sender);
  2811. FDataLink.Edit;
  2812. end;
  2813. constructor TDefineDBInteger.Create(AOwner: TComponent);
  2814. begin
  2815. inherited Create(AOwner);
  2816. inherited ReadOnly := True;
  2817. ControlStyle:=ControlStyle-[csReplicatable];
  2818. FDataLink := TFieldDataLink.Create;
  2819. FDataLink.Control := Self;
  2820. FDataLink.OnDataChange := DataChange;
  2821. FDataLink.OnEditingChange := EditingChange;
  2822. FDataLink.OnUpdateData := UpdateData;
  2823. end;
  2824. destructor TDefineDBInteger.Destroy;
  2825. begin
  2826. FDataLink.Free;
  2827. FDataLink := nil;
  2828. inherited Destroy;
  2829. end;
  2830. function TDefineDBInteger.GetField: TField;
  2831. begin
  2832. result := FDataLink.Field;
  2833. end;
  2834. { TDefineDBMask }
  2835. procedure TDefineDBMask.ActiveChange(Sender: TObject);
  2836. begin
  2837. ResetMaxLength;
  2838. end;
  2839. procedure TDefineDBMask.Change;
  2840. begin
  2841. FDataLink.Modified;
  2842. inherited Change;
  2843. end;
  2844. procedure TDefineDBMask.CMEnter(var Message: TCMEnter);
  2845. begin
  2846. SetFocused(True);
  2847. inherited;
  2848. if SysLocale.FarEast and FDataLink.CanModify then
  2849. inherited ReadOnly := False;
  2850. end;
  2851. procedure TDefineDBMask.CMExit(var Message: TCMExit);
  2852. begin
  2853. try
  2854. FDataLink.UpdateRecord;
  2855. except
  2856. SelectAll;
  2857. SetFocus;
  2858. raise;
  2859. end;
  2860. SetFocused(False);
  2861. DoExit;
  2862. end;
  2863. procedure TDefineDBMask.CMGetDataLink(var Message: TMessage);
  2864. begin
  2865. Message.Result := SizeOf(FDataLink);
  2866. end;
  2867. constructor TDefineDBMask.Create(AOwner: TComponent);
  2868. begin
  2869. inherited Create(AOwner);
  2870. inherited ReadOnly := True;
  2871. ControlStyle := ControlStyle + [csReplicatable];
  2872. FDataLink := TFieldDataLink.Create;
  2873. FDataLink.Control := Self;
  2874. FDataLink.OnDataChange := DataChange;
  2875. FDataLink.OnEditingChange := EditingChange;
  2876. FDataLink.OnUpdateData := UpdateData;
  2877. FDataLink.OnActiveChange := ActiveChange;
  2878. end;
  2879. procedure TDefineDBMask.DataChange(Sender: TObject);
  2880. begin
  2881. if FDataLink.Field <> nil then
  2882. begin
  2883. if FAlignment <> FDataLink.Field.Alignment then
  2884. begin
  2885. Text := ''; {forces update}
  2886. FAlignment := FDataLink.Field.Alignment;
  2887. end;
  2888. if not (csDesigning in ComponentState) then
  2889. begin
  2890. if (FDataLink.Field.DataType in [ftString, ftWideString]) and (MaxLength = 0) then
  2891. MaxLength := FDataLink.Field.Size;
  2892. end;
  2893. if FFocused and FDataLink.CanModify then
  2894. Text := FDataLink.Field.Text
  2895. else
  2896. begin
  2897. Text := FDataLink.Field.DisplayText;
  2898. if FDataLink.Editing then
  2899. Modified := True;
  2900. end;
  2901. end else
  2902. begin
  2903. FAlignment := taLeftJustify;
  2904. if csDesigning in ComponentState then
  2905. Text := Name else
  2906. Text := '';
  2907. end;
  2908. end;
  2909. destructor TDefineDBMask.Destroy;
  2910. begin
  2911. FDataLink.Free;
  2912. FDataLink := nil;
  2913. FCanvas.Free;
  2914. inherited Destroy;
  2915. end;
  2916. procedure TDefineDBMask.EditingChange(Sender: TObject);
  2917. begin
  2918. inherited ReadOnly := not FDataLink.Editing;
  2919. end;
  2920. function TDefineDBMask.ExecuteAction(Action: TBasicAction): Boolean;
  2921. begin
  2922. Result := inherited ExecuteAction(Action) or (FDataLink <> nil) and
  2923. FDataLink.ExecuteAction(Action);
  2924. end;
  2925. function TDefineDBMask.GetDataField: string;
  2926. begin
  2927. Result := FDataLink.FieldName;
  2928. end;
  2929. function TDefineDBMask.GetDataSource: TDataSource;
  2930. begin
  2931. Result := FDataLink.DataSource;
  2932. end;
  2933. function TDefineDBMask.GetField: TField;
  2934. begin
  2935. Result := FDataLink.Field;
  2936. end;
  2937. function TDefineDBMask.GetReadOnly: Boolean;
  2938. begin
  2939. Result := FDataLink.ReadOnly;
  2940. end;
  2941. function TDefineDBMask.GetTextMargins: TPoint;
  2942. var
  2943. DC: HDC;
  2944. SaveFont: HFont;
  2945. I: Integer;
  2946. SysMetrics, Metrics: TTextMetric;
  2947. begin
  2948. if NewStyleControls then
  2949. begin
  2950. if BorderStyle = bsNone then I := 0 else
  2951. if Ctl3D then I := 1 else I := 2;
  2952. Result.X := SendMessage(Handle, EM_GETMARGINS, 0, 0) and $0000FFFF + I;
  2953. Result.Y := I;
  2954. end else
  2955. begin
  2956. if BorderStyle = bsNone then I := 0 else
  2957. begin
  2958. DC := GetDC(0);
  2959. GetTextMetrics(DC, SysMetrics);
  2960. SaveFont := SelectObject(DC, Font.Handle);
  2961. GetTextMetrics(DC, Metrics);
  2962. SelectObject(DC, SaveFont);
  2963. ReleaseDC(0, DC);
  2964. I := SysMetrics.tmHeight;
  2965. if I > Metrics.tmHeight then I := Metrics.tmHeight;
  2966. I := I div 4;
  2967. end;
  2968. Result.X := I;
  2969. Result.Y := I;
  2970. end;
  2971. end;
  2972. procedure TDefineDBMask.KeyDown(var Key: Word; Shift: TShiftState);
  2973. begin
  2974. inherited KeyDown(Key, Shift);
  2975. if (Key = VK_DELETE) or ((Key = VK_INSERT) and (ssShift in Shift)) then
  2976. FDataLink.Edit;
  2977. end;
  2978. procedure TDefineDBMask.KeyPress(var Key: Char);
  2979. begin
  2980. inherited KeyPress(Key);
  2981. if (Key in [#32..#255]) and (FDataLink.Field <> nil) and
  2982. not FDataLink.Field.IsValidChar(Key) then
  2983. begin
  2984. MessageBeep(0);
  2985. Key := #0;
  2986. end;
  2987. case Key of
  2988. ^H, ^V, ^X, #32..#255:
  2989. FDataLink.Edit;
  2990. #27:
  2991. begin
  2992. FDataLink.Reset;
  2993. SelectAll;
  2994. Key := #0;
  2995. end;
  2996. end;
  2997. end;
  2998. procedure TDefineDBMask.Loaded;
  2999. begin
  3000. inherited Loaded;
  3001. ResetMaxLength;
  3002. if (csDesigning in ComponentState) then DataChange(Self);
  3003. end;
  3004. procedure TDefineDBMask.Notification(AComponent: TComponent;
  3005. Operation: TOperation);
  3006. begin
  3007. inherited Notification(AComponent, Operation);
  3008. if (Operation = opRemove) and (FDataLink <> nil) and
  3009. (AComponent = DataSource) then DataSource := nil;
  3010. end;
  3011. procedure TDefineDBMask.ResetMaxLength;
  3012. var
  3013. F: TField;
  3014. begin
  3015. if (MaxLength > 0) and Assigned(DataSource) and Assigned(DataSource.DataSet) then
  3016. begin
  3017. F := DataSource.DataSet.FindField(DataField);
  3018. if Assigned(F) and (F.DataType in [ftString, ftWideString]) and (F.Size = MaxLength) then
  3019. MaxLength := 0;
  3020. end;
  3021. end;
  3022. procedure TDefineDBMask.SetDataField(const Value: string);
  3023. begin
  3024. if not (csDesigning in ComponentState) then
  3025. ResetMaxLength;
  3026. FDataLink.FieldName := Value;
  3027. end;
  3028. procedure TDefineDBMask.SetDataSource(const Value: TDataSource);
  3029. begin
  3030. if not (FDataLink.DataSourceFixed and (csLoading in ComponentState)) then
  3031. FDataLink.DataSource := Value;
  3032. if Value <> nil then Value.FreeNotification(Self);
  3033. end;
  3034. procedure TDefineDBMask.SetFocused(Value: Boolean);
  3035. begin
  3036. if FFocused <> Value then
  3037. begin
  3038. FFocused := Value;
  3039. if (FAlignment <> taLeftJustify) then Invalidate;
  3040. FDataLink.Reset;
  3041. end;
  3042. end;
  3043. procedure TDefineDBMask.SetReadOnly(const Value: Boolean);
  3044. begin
  3045. FDataLink.ReadOnly := Value;
  3046. end;
  3047. function TDefineDBMask.UpdateAction(Action: TBasicAction): Boolean;
  3048. begin
  3049. Result := inherited UpdateAction(Action) or (FDataLink <> nil) and
  3050. FDataLink.UpdateAction(Action);
  3051. end;
  3052. procedure TDefineDBMask.UpdateData(Sender: TObject);
  3053. begin
  3054. FDataLink.Field.Text := Text;
  3055. end;
  3056. function TDefineDBMask.UseRightToLeftAlignment: Boolean;
  3057. begin
  3058. Result := DBUseRightToLeftAlignment(Self, Field);
  3059. end;
  3060. procedure TDefineDBMask.WMCut(var Message: TMessage);
  3061. begin
  3062. FDataLink.Edit;
  3063. inherited;
  3064. end;
  3065. procedure TDefineDBMask.WMPaint(var Message: TWMPaint);
  3066. const
  3067. AlignStyle : array[Boolean, TAlignment] of DWORD =
  3068. ((WS_EX_LEFT, WS_EX_RIGHT, WS_EX_LEFT),
  3069. (WS_EX_RIGHT, WS_EX_LEFT, WS_EX_LEFT));
  3070. var
  3071. Left: Integer;
  3072. Margins: TPoint;
  3073. R: TRect;
  3074. DC: HDC;
  3075. PS: TPaintStruct;
  3076. S: string;
  3077. AAlignment: TAlignment;
  3078. ExStyle: DWORD;
  3079. begin
  3080. AAlignment := FAlignment;
  3081. if UseRightToLeftAlignment then ChangeBiDiModeAlignment(AAlignment);
  3082. if ((AAlignment = taLeftJustify) or FFocused) and
  3083. not (csPaintCopy in ControlState) then
  3084. begin
  3085. if SysLocale.MiddleEast and HandleAllocated and (IsRightToLeft) then
  3086. begin { This keeps the right aligned text, right aligned }
  3087. ExStyle := DWORD(GetWindowLong(Handle, GWL_EXSTYLE)) and (not WS_EX_RIGHT) and
  3088. (not WS_EX_RTLREADING) and (not WS_EX_LEFTSCROLLBAR);
  3089. if UseRightToLeftReading then ExStyle := ExStyle or WS_EX_RTLREADING;
  3090. if UseRightToLeftScrollbar then ExStyle := ExStyle or WS_EX_LEFTSCROLLBAR;
  3091. ExStyle := ExStyle or
  3092. AlignStyle[UseRightToLeftAlignment, AAlignment];
  3093. if DWORD(GetWindowLong(Handle, GWL_EXSTYLE)) <> ExStyle then
  3094. SetWindowLong(Handle, GWL_EXSTYLE, ExStyle);
  3095. end;
  3096. inherited;
  3097. Exit;
  3098. end;
  3099. { Since edit controls do not handle justification unless multi-line (and
  3100. then only poorly) we will draw right and center justify manually unless
  3101. the edit has the focus. }
  3102. if FCanvas = nil then
  3103. begin
  3104. FCanvas := TControlCanvas.Create;
  3105. FCanvas.Control := Self;
  3106. end;
  3107. DC := Message.DC;
  3108. if DC = 0 then DC := BeginPaint(Handle, PS);
  3109. FCanvas.Handle := DC;
  3110. try
  3111. FCanvas.Font := Font;
  3112. with FCanvas do
  3113. begin
  3114. R := ClientRect;
  3115. if not (NewStyleControls and Ctl3D) and (BorderStyle = bsSingle) then
  3116. begin
  3117. Brush.Color := clWindowFrame;
  3118. FrameRect(R);
  3119. InflateRect(R, -1, -1);
  3120. end;
  3121. Brush.Color := Color;
  3122. if not Enabled then
  3123. Font.Color := clGrayText;
  3124. if (csPaintCopy in ControlState) and (FDataLink.Field <> nil) then
  3125. begin
  3126. S := FDataLink.Field.DisplayText;
  3127. case CharCase of
  3128. ecUpperCase: S := AnsiUpperCase(S);
  3129. ecLowerCase: S := AnsiLowerCase(S);
  3130. end;
  3131. end else
  3132. S := Text;
  3133. if PasswordChar <> #0 then FillChar(S[1], Length(S), PasswordChar);
  3134. Margins := GetTextMargins;
  3135. case AAlignment of
  3136. taLeftJustify: Left := Margins.X;
  3137. taRightJustify: Left := ClientWidth - TextWidth(S) - Margins.X - 1;
  3138. else
  3139. Left := (ClientWidth - TextWidth(S)) div 2;
  3140. end;
  3141. if SysLocale.MiddleEast then UpdateTextFlags;
  3142. TextRect(R, Left, Margins.Y, S);
  3143. end;
  3144. finally
  3145. FCanvas.Handle := 0;
  3146. if Message.DC = 0 then EndPaint(Handle, PS);
  3147. end;
  3148. end;
  3149. procedure TDefineDBMask.WMPaste(var Message: TMessage);
  3150. begin
  3151. FDataLink.Edit;
  3152. inherited;
  3153. end;
  3154. procedure TDefineDBMask.WMUndo(var Message: TMessage);
  3155. begin
  3156. FDataLink.Edit;
  3157. inherited;
  3158. end;
  3159. {TDefineDBMemo}
  3160. constructor TDefineDBMemo.Create(AOwner: TComponent);
  3161. begin
  3162. inherited Create(AOwner);
  3163. inherited ReadOnly := True;
  3164. AutoSize := False;
  3165. FAutoDisplay := True;
  3166. FDataLink := TFieldDataLink.Create;
  3167. FDataLink.Control := Self;
  3168. FDataLink.OnDataChange := DataChange;
  3169. FDataLink.OnEditingChange := EditingChange;
  3170. FDataLink.OnUpdateData := UpdateData;
  3171. FPaintControl := TPaintControl.Create(Self, 'EDIT');
  3172. end;
  3173. destructor TDefineDBMemo.Destroy;
  3174. begin
  3175. FPaintControl.Free;
  3176. FDataLink.Free;
  3177. FDataLink := nil;
  3178. inherited Destroy;
  3179. end;
  3180. procedure TDefineDBMemo.Loaded;
  3181. begin
  3182. inherited Loaded;
  3183. if (csDesigning in ComponentState) then DataChange(Self);
  3184. end;
  3185. procedure TDefineDBMemo.Notification(AComponent: TComponent;
  3186. Operation: TOperation);
  3187. begin
  3188. inherited Notification(AComponent, Operation);
  3189. if (Operation = opRemove) and (FDataLink <> nil) and
  3190. (AComponent = DataSource) then DataSource := nil;
  3191. end;
  3192. function TDefineDBMemo.UseRightToLeftAlignment: Boolean;
  3193. begin
  3194. Result := DBUseRightToLeftAlignment(Self, Field);
  3195. end;
  3196. procedure TDefineDBMemo.KeyDown(var Key: Word; Shift: TShiftState);
  3197. begin
  3198. inherited KeyDown(Key, Shift);
  3199. if FMemoLoaded then
  3200. begin
  3201. if (Key = VK_DELETE) or ((Key = VK_INSERT) and (ssShift in Shift)) then
  3202. FDataLink.Edit;
  3203. end;
  3204. end;
  3205. procedure TDefineDBMemo.KeyPress(var Key: Char);
  3206. begin
  3207. inherited KeyPress(Key);
  3208. if FMemoLoaded then
  3209. begin
  3210. if (Key in [#32..#255]) and (FDataLink.Field <> nil) and
  3211. not FDataLink.Field.IsValidChar(Key) then
  3212. begin
  3213. MessageBeep(0);
  3214. Key := #0;
  3215. end;
  3216. case Key of
  3217. ^H, ^I, ^J, ^M, ^V, ^X, #32..#255:
  3218. FDataLink.Edit;
  3219. #27:
  3220. FDataLink.Reset;
  3221. end;
  3222. end else
  3223. begin
  3224. if Key = #13 then LoadMemo;
  3225. Key := #0;
  3226. end;
  3227. end;
  3228. procedure TDefineDBMemo.Change;
  3229. begin
  3230. if FMemoLoaded then FDataLink.Modified;
  3231. FMemoLoaded := True;
  3232. inherited Change;
  3233. end;
  3234. function TDefineDBMemo.GetDataSource: TDataSource;
  3235. begin
  3236. Result := FDataLink.DataSource;
  3237. end;
  3238. procedure TDefineDBMemo.SetDataSource(Value: TDataSource);
  3239. begin
  3240. if not (FDataLink.DataSourceFixed and (csLoading in ComponentState)) then
  3241. FDataLink.DataSource := Value;
  3242. if Value <> nil then Value.FreeNotification(Self);
  3243. end;
  3244. function TDefineDBMemo.GetDataField: string;
  3245. begin
  3246. Result := FDataLink.FieldName;
  3247. end;
  3248. procedure TDefineDBMemo.SetDataField(const Value: string);
  3249. begin
  3250. FDataLink.FieldName := Value;
  3251. end;
  3252. function TDefineDBMemo.GetReadOnly: Boolean;
  3253. begin
  3254. Result := FDataLink.ReadOnly;
  3255. end;
  3256. procedure TDefineDBMemo.SetReadOnly(Value: Boolean);
  3257. begin
  3258. FDataLink.ReadOnly := Value;
  3259. end;
  3260. function TDefineDBMemo.GetField: TField;
  3261. begin
  3262. Result := FDataLink.Field;
  3263. end;
  3264. procedure TDefineDBMemo.LoadMemo;
  3265. begin
  3266. if not FMemoLoaded and Assigned(FDataLink.Field) and FDataLink.Field.IsBlob then
  3267. begin
  3268. try
  3269. Lines.Text := FDataLink.Field.AsString;
  3270. FMemoLoaded := True;
  3271. except
  3272. // Memo too large
  3273. on E:EInvalidOperation do
  3274. Lines.Text := Format('(%s)', [E.Message]);
  3275. end;
  3276. EditingChange(Self);
  3277. end;
  3278. end;
  3279. procedure TDefineDBMemo.DataChange(Sender: TObject);
  3280. begin
  3281. if FDataLink.Field <> nil then
  3282. if FDataLink.Field.IsBlob then
  3283. begin
  3284. if FAutoDisplay or (FDataLink.Editing and FMemoLoaded) then
  3285. begin
  3286. FMemoLoaded := False;
  3287. LoadMemo;
  3288. end else
  3289. begin
  3290. Text := Format('(%s)', [FDataLink.Field.DisplayLabel]);
  3291. FMemoLoaded := False;
  3292. end;
  3293. end else
  3294. begin
  3295. if FFocused and FDataLink.CanModify then
  3296. Text := FDataLink.Field.Text
  3297. else
  3298. Text := FDataLink.Field.DisplayText;
  3299. FMemoLoaded := True;
  3300. end
  3301. else
  3302. begin
  3303. if csDesigning in ComponentState then Text := Name else Text := '';
  3304. FMemoLoaded := False;
  3305. end;
  3306. if HandleAllocated then
  3307. RedrawWindow(Handle, nil, 0, RDW_INVALIDATE or RDW_ERASE or RDW_FRAME);
  3308. end;
  3309. procedure TDefineDBMemo.EditingChange(Sender: TObject);
  3310. begin
  3311. inherited ReadOnly := not (FDataLink.Editing and FMemoLoaded);
  3312. end;
  3313. procedure TDefineDBMemo.UpdateData(Sender: TObject);
  3314. begin
  3315. FDataLink.Field.AsString := Text;
  3316. end;
  3317. procedure TDefineDBMemo.SetFocused(Value: Boolean);
  3318. begin
  3319. if FFocused <> Value then
  3320. begin
  3321. FFocused := Value;
  3322. if not Assigned(FDataLink.Field) or not FDataLink.Field.IsBlob then
  3323. FDataLink.Reset;
  3324. end;
  3325. end;
  3326. procedure TDefineDBMemo.WndProc(var Message: TMessage);
  3327. begin
  3328. with Message do
  3329. if (Msg = WM_CREATE) or (Msg = WM_WINDOWPOSCHANGED) or
  3330. (Msg = CM_FONTCHANGED) then FPaintControl.DestroyHandle;
  3331. inherited;
  3332. end;
  3333. procedure TDefineDBMemo.CMEnter(var Message: TCMEnter);
  3334. begin
  3335. SetFocused(True);
  3336. inherited;
  3337. if SysLocale.FarEast and FDataLink.CanModify then
  3338. inherited ReadOnly := False;
  3339. end;
  3340. procedure TDefineDBMemo.CMExit(var Message: TCMExit);
  3341. begin
  3342. try
  3343. FDataLink.UpdateRecord;
  3344. except
  3345. SetFocus;
  3346. raise;
  3347. end;
  3348. SetFocused(False);
  3349. inherited;
  3350. end;
  3351. procedure TDefineDBMemo.SetAutoDisplay(Value: Boolean);
  3352. begin
  3353. if FAutoDisplay <> Value then
  3354. begin
  3355. FAutoDisplay := Value;
  3356. if Value then LoadMemo;
  3357. end;
  3358. end;
  3359. procedure TDefineDBMemo.WMLButtonDblClk(var Message: TWMLButtonDblClk);
  3360. begin
  3361. if not FMemoLoaded then LoadMemo else inherited;
  3362. end;
  3363. procedure TDefineDBMemo.WMCut(var Message: TMessage);
  3364. begin
  3365. FDataLink.Edit;
  3366. inherited;
  3367. end;
  3368. procedure TDefineDBMemo.WMUndo(var Message: TMessage);
  3369. begin
  3370. FDataLink.Edit;
  3371. inherited;
  3372. end;
  3373. procedure TDefineDBMemo.WMPaste(var Message: TMessage);
  3374. begin
  3375. FDataLink.Edit;
  3376. inherited;
  3377. end;
  3378. procedure TDefineDBMemo.CMGetDataLink(var Message: TMessage);
  3379. begin
  3380. Message.Result := Integer(FDataLink);
  3381. end;
  3382. procedure TDefineDBMemo.WMPaint(var Message: TWMPaint);
  3383. var
  3384. S: string;
  3385. begin
  3386. if not (csPaintCopy in ControlState) then inherited else
  3387. begin
  3388. if FDataLink.Field <> nil then
  3389. if FDataLink.Field.IsBlob then
  3390. begin
  3391. if FAutoDisplay then
  3392. S := AdjustLineBreaks(FDataLink.Field.AsString)
  3393. else
  3394. S := Format('(%s)', [FDataLink.Field.DisplayLabel]);
  3395. end else
  3396. S := FDataLink.Field.DisplayText;
  3397. SendMessage(FPaintControl.Handle, WM_SETTEXT, 0, Integer(PChar(S)));
  3398. SendMessage(FPaintControl.Handle, WM_ERASEBKGND, Message.DC, 0);
  3399. SendMessage(FPaintControl.Handle, WM_PAINT, Message.DC, 0);
  3400. end;
  3401. end;
  3402. function TDefineDBMemo.ExecuteAction(Action: TBasicAction): Boolean;
  3403. begin
  3404. Result := inherited ExecuteAction(Action) or (FDataLink <> nil) and
  3405. FDataLink.ExecuteAction(Action);
  3406. end;
  3407. function TDefineDBMemo.UpdateAction(Action: TBasicAction): Boolean;
  3408. begin
  3409. Result := inherited UpdateAction(Action) or (FDataLink <> nil) and
  3410. FDataLink.UpdateAction(Action);
  3411. end;
  3412. { TFlatDBGrid }
  3413. constructor TFlatDBGrid.Create(AOwner: TComponent);
  3414. begin
  3415. inherited Create(AOwner);
  3416. FSingleColor := clWhite;
  3417. FDoubleColor := clWhite;//$00FFF0E1;
  3418. OldGridWnd := self.WindowProc ;
  3419. self.WindowProc := NewGridWnd;
  3420. fDBBGColor := True;
  3421. BorderStyle := bsNone;
  3422. FFocusColor := clWhite;
  3423. FBorderColor := DefaultBorderColor;
  3424. FLinesColor := DefaultBorderColor;
  3425. FFlatColor := DefaultFlatColor;
  3426. FParentColor := True;
  3427. FMouseIn := False;
  3428. end;
  3429. procedure TFlatDBGrid.NewGridWnd(var Message: TMessage);
  3430. var
  3431. IsNeg : Boolean;
  3432. begin
  3433. if Message.Msg = WM_MOUSEWHEEL then
  3434. begin
  3435. IsNeg := Short(Message.WParamHi) < 0;
  3436. if IsNeg then
  3437. Self.DataSource.DataSet.MoveBy(1)
  3438. else
  3439. Self.DataSource.DataSet.MoveBy(-1)
  3440. end
  3441. else
  3442. OldGridWnd(Message);
  3443. end;
  3444. procedure TFlatDBGrid.DrawColumnCell(const Rect: TRect; DataCol: Integer;
  3445. Column: TColumn; State: TGridDrawState);
  3446. begin
  3447. inherited;
  3448. if GdSelected in State then exit;
  3449. if DbBgColor then
  3450. begin
  3451. if DataSource.DataSet.RecNo mod 2<>0 then
  3452. Canvas.Brush.Color := FSingleColor //读取单横颜色值。。。
  3453. else
  3454. Canvas.Brush.Color := FDoubleColor; // 读取双横颜色值。$00F7E7E7。。
  3455. end;
  3456. DefaultDrawColumnCell(Rect, DataCol, Column, State);
  3457. end;
  3458. procedure TFlatDBGrid.SetDbBgColor(const Value: boolean);
  3459. begin
  3460. FDbBgColor := Value;
  3461. repaint;
  3462. end;
  3463. procedure TFlatDBGrid.WMVScroll(var Message: TWMVScroll);
  3464. var
  3465. SI: TScrollInfo;
  3466. begin
  3467. inherited;
  3468. if Datalink.Active then
  3469. with Message, DataLink.DataSet do
  3470. case ScrollCode of
  3471. SB_THUMBPOSITION:
  3472. begin
  3473. if IsSequenced then
  3474. begin
  3475. SI.cbSize := sizeof(SI);
  3476. SI.fMask := SIF_ALL;
  3477. SetScrollPos(self.Handle,SB_VERT,Pos,True); //强行设定滚动条的位置
  3478. GetScrollInfo(Self.Handle, SB_VERT, SI);
  3479. if SI.nTrackPos <= 1 then First
  3480. else if SI.nTrackPos >= RecordCount then Last
  3481. else RecNo := SI.nTrackPos;
  3482. end
  3483. else
  3484. case Pos of
  3485. 0: First;
  3486. 1: MoveBy(-VisibleRowCount);
  3487. 2: Exit;
  3488. 3: MoveBy(VisibleRowCount);
  3489. 4: Last;
  3490. end;
  3491. end;
  3492. end;
  3493. end;
  3494. procedure TFlatDBGrid.RedrawBorder(const Clip: HRGN);
  3495. var
  3496. Attrib:TBorderAttrib;
  3497. begin
  3498. with Attrib do
  3499. begin
  3500. Ctrl := self;
  3501. FocusColor := ColorFocused;
  3502. BorderColor := ColorBorder;
  3503. FlatColor := ColorFlat;
  3504. MouseState := MouseIn;
  3505. FocusState := Focused;
  3506. DesignState := ComponentState;
  3507. HasBars := ScrollBars = ssBoth;
  3508. BoldState := False;
  3509. end;
  3510. Color := DrawEditBorder(Attrib,Clip);
  3511. end;
  3512. procedure TFlatDBGrid.SetParentColor(Value: Boolean);
  3513. begin
  3514. if Value <> FParentColor then
  3515. begin
  3516. FParentColor := Value;
  3517. if FParentColor then
  3518. begin
  3519. if Parent <> nil then
  3520. FFlatColor := TForm(Parent).Color;
  3521. RedrawBorder;
  3522. end;
  3523. end;
  3524. end;
  3525. procedure TFlatDBGrid.CMSysColorChange(var Message: TMessage);
  3526. begin
  3527. if (Parent <> nil)and(FParentColor) then
  3528. FFlatColor := TForm(Parent).Color;
  3529. RedrawBorder;
  3530. end;
  3531. procedure TFlatDBGrid.CMParentColorChanged(var Message: TWMNoParams);
  3532. begin
  3533. if (Parent <> nil)and(FParentColor) then
  3534. FFlatColor := TForm(Parent).Color;
  3535. RedrawBorder;
  3536. end;
  3537. procedure TFlatDBGrid.SetColors(Index: Integer; Value: TColor);
  3538. begin
  3539. case Index of
  3540. 0: FFocusColor := Value;
  3541. 1: FBorderColor := Value;
  3542. 2: begin
  3543. FFlatColor := Value;
  3544. FParentColor := False;
  3545. end;
  3546. 3: FLinesColor := Value;
  3547. 4: FSingleColor := Value;
  3548. 5: FDoubleColor := Value;
  3549. end;
  3550. Repaint;
  3551. RedrawBorder;
  3552. end;
  3553. procedure TFlatDBGrid.CMMouseEnter(var Message: TMessage);
  3554. begin
  3555. inherited;
  3556. if (GetActiveWindow <> 0) then
  3557. begin
  3558. FMouseIn := True;
  3559. RedrawBorder;
  3560. end;
  3561. end;
  3562. procedure TFlatDBGrid.CMMouseLeave(var Message: TMessage);
  3563. begin
  3564. inherited;
  3565. FMouseIn := False;
  3566. RedrawBorder;
  3567. end;
  3568. procedure TFlatDBGrid.CMEnabledChanged(var Message: TMessage);
  3569. const
  3570. EnableColors: array[Boolean] of TColor = (clBtnFace, clWindow);
  3571. begin
  3572. inherited;
  3573. Color := EnableColors[Enabled];
  3574. RedrawBorder;
  3575. end;
  3576. procedure TFlatDBGrid.WMSetFocus(var Message: TWMSetFocus);
  3577. begin
  3578. inherited;
  3579. if not(csDesigning in ComponentState) then
  3580. RedrawBorder;
  3581. end;
  3582. procedure TFlatDBGrid.WMKillFocus(var Message: TWMKillFocus);
  3583. begin
  3584. inherited;
  3585. if not(csDesigning in ComponentState) then
  3586. RedrawBorder;
  3587. end;
  3588. procedure TFlatDBGrid.WMNCCalcSize(var Message: TWMNCCalcSize);
  3589. begin
  3590. inherited;
  3591. InflateRect(Message.CalcSize_Params^.rgrc[0], -3, -3);
  3592. end;
  3593. procedure TFlatDBGrid.WMNCPaint(var Message: TMessage);
  3594. begin
  3595. inherited;
  3596. RedrawBorder(HRGN(Message.WParam));
  3597. end;
  3598. procedure TFlatDBGrid.DrawCell(ACol, ARow: Integer; ARect: TRect;
  3599. AState: TGridDrawState);
  3600. var FRect:TRect;
  3601. begin
  3602. inherited;
  3603. //绘制数据区的表格边框
  3604. with ARect, Canvas do
  3605. begin
  3606. if (ACol = 0)or(ARow = 0) then
  3607. begin
  3608. if ARow > 0 then begin
  3609. FRect := Rect(Left-1,Top-1,Right,Bottom+2);
  3610. DrawFrame(Canvas, FRect, FLinesColor, FLinesColor, 1)
  3611. end else if ACol > 0 then begin
  3612. FRect := Rect(Left-2,Top,Right+1,Bottom+1);
  3613. DrawFrame(Canvas, FRect, FLinesColor, FLinesColor, 1)
  3614. end else begin
  3615. FRect := Rect(Left,Top,Right+1,Bottom+1);
  3616. DrawButtonBorder(Canvas,FRect,FLinesColor,1)
  3617. end;
  3618. end else begin
  3619. FRect := Rect(Left-1,Top-1,Right+1,Bottom+1);
  3620. DrawButtonBorder(Canvas,FRect,FLinesColor,1);
  3621. end;
  3622. end;
  3623. end;
  3624. function TFlatDBGrid.GetMouseIn: boolean;
  3625. begin
  3626. result := FMouseIn;
  3627. end;
  3628. { TDefineDBCheckBox }
  3629. constructor TDefineDBCheckBox.Create(AOwner: TComponent);
  3630. begin
  3631. inherited Create(AOwner);
  3632. ControlStyle := ControlStyle + [csReplicatable];
  3633. FValueCheck := STextTrue;
  3634. FValueUncheck := STextFalse;
  3635. FDataLink := TFieldDataLink.Create;
  3636. FDataLink.Control := Self;
  3637. FDataLink.OnDataChange := DataChange;
  3638. end;
  3639. destructor TDefineDBCheckBox.Destroy;
  3640. begin
  3641. FDataLink.Free;
  3642. FDataLink := nil;
  3643. inherited Destroy;
  3644. end;
  3645. procedure TDefineDBCheckBox.Notification(AComponent: TComponent;
  3646. Operation: TOperation);
  3647. begin
  3648. inherited Notification(AComponent, Operation);
  3649. if (Operation = opRemove) and (FDataLink <> nil) and
  3650. (AComponent = DataSource) then DataSource := nil;
  3651. end;
  3652. procedure TDefineDBCheckBox.DataChange(Sender: TObject);
  3653. begin
  3654. if (FDataLink.Field <> nil) and (FDataLink.Field is TBooleanField) then
  3655. Checked := FDataLink.Field.AsBoolean
  3656. else
  3657. Checked := False;
  3658. end;
  3659. procedure TDefineDBCheckBox.UpdateRecord;
  3660. var
  3661. Pos: Integer;
  3662. S: string;
  3663. begin
  3664. if (FDataLink.DataSet <> nil)and(not ReadOnly) then begin
  3665. FDataLink.DataSet.Edit;
  3666. if FDataLink.Field.DataType = ftBoolean then
  3667. FDataLink.Field.AsBoolean := not Checked
  3668. else begin
  3669. if Checked then S := FValueCheck else S := FValueUncheck;
  3670. Pos := 1;
  3671. FDataLink.Field.Text := ExtractFieldName(S, Pos);
  3672. end;
  3673. FDataLink.DataSet.Post;
  3674. end;
  3675. end;
  3676. function TDefineDBCheckBox.GetDataSource: TDataSource;
  3677. begin
  3678. Result := FDataLink.DataSource;
  3679. end;
  3680. procedure TDefineDBCheckBox.SetDataSource(Value: TDataSource);
  3681. begin
  3682. if not (FDataLink.DataSourceFixed and (csLoading in ComponentState)) then
  3683. FDataLink.DataSource := Value;
  3684. if Value <> nil then Value.FreeNotification(Self);
  3685. end;
  3686. function TDefineDBCheckBox.GetDataField: string;
  3687. begin
  3688. Result := FDataLink.FieldName;
  3689. end;
  3690. procedure TDefineDBCheckBox.SetDataField(const Value: string);
  3691. begin
  3692. FDataLink.FieldName := Value;
  3693. end;
  3694. function TDefineDBCheckBox.GetReadOnly: Boolean;
  3695. begin
  3696. Result := FDataLink.ReadOnly;
  3697. end;
  3698. procedure TDefineDBCheckBox.SetReadOnly(Value: Boolean);
  3699. begin
  3700. FDataLink.ReadOnly := Value;
  3701. end;
  3702. function TDefineDBCheckBox.GetField: TField;
  3703. begin
  3704. Result := FDataLink.Field;
  3705. end;
  3706. procedure TDefineDBCheckBox.KeyPress(var Key: Char);
  3707. begin
  3708. inherited KeyPress(Key);
  3709. case Key of
  3710. #8 : UpdateRecord;
  3711. #27: FDataLink.Reset;
  3712. end;
  3713. end;
  3714. procedure TDefineDBCheckBox.CMExit(var Message: TCMExit);
  3715. begin
  3716. try
  3717. UpdateRecord;
  3718. except
  3719. SetFocus;
  3720. raise;
  3721. end;
  3722. inherited;
  3723. end;
  3724. procedure TDefineDBCheckBox.CMGetDataLink(var Message: TMessage);
  3725. begin
  3726. Message.Result := Integer(FDataLink);
  3727. end;
  3728. function TDefineDBCheckBox.ExecuteAction(Action: TBasicAction): Boolean;
  3729. begin
  3730. Result := inherited ExecuteAction(Action) or (DataLink <> nil) and
  3731. DataLink.ExecuteAction(Action);
  3732. end;
  3733. function TDefineDBCheckBox.UpdateAction(Action: TBasicAction): Boolean;
  3734. begin
  3735. Result := inherited UpdateAction(Action) or (DataLink <> nil) and
  3736. DataLink.UpdateAction(Action);
  3737. end;
  3738. function TDefineDBCheckBox.UseRightToLeftAlignment: Boolean;
  3739. begin
  3740. Result := inherited UseRightToLeftAlignment;
  3741. end;
  3742. { TDefineDBRadioGroup }
  3743. constructor TDefineDBRadioGroup.Create(AOwner: TComponent);
  3744. begin
  3745. FValues := TStringList.Create;
  3746. FDataLink := TFieldDataLink.Create;
  3747. SaveState := True;
  3748. inherited Create(AOwner);
  3749. FDataLink.Control := Self;
  3750. FDataLink.OnDataChange := DataChange;
  3751. end;
  3752. destructor TDefineDBRadioGroup.Destroy;
  3753. begin
  3754. FDataLink.Free;
  3755. FDataLink := nil;
  3756. FValues.Free;
  3757. inherited Destroy;
  3758. end;
  3759. procedure TDefineDBRadioGroup.Notification(AComponent: TComponent;
  3760. Operation: TOperation);
  3761. begin
  3762. inherited Notification(AComponent, Operation);
  3763. if (Operation = opRemove) and (FDataLink <> nil) and
  3764. (AComponent = DataSource) then DataSource := nil;
  3765. end;
  3766. function TDefineDBRadioGroup.UseRightToLeftAlignment: Boolean;
  3767. begin
  3768. Result := inherited UseRightToLeftAlignment;
  3769. end;
  3770. procedure TDefineDBRadioGroup.DataChange(Sender: TObject);
  3771. begin
  3772. if SaveState then begin
  3773. if FDataLink.Field <> nil then
  3774. Value := FDataLink.Field.Text else
  3775. Value := '';
  3776. end;
  3777. end;
  3778. function TDefineDBRadioGroup.GetDataSource: TDataSource;
  3779. begin
  3780. Result := FDataLink.DataSource;
  3781. end;
  3782. procedure TDefineDBRadioGroup.SetDataSource(Value: TDataSource);
  3783. begin
  3784. FDataLink.DataSource := Value;
  3785. if Value <> nil then Value.FreeNotification(Self);
  3786. end;
  3787. function TDefineDBRadioGroup.GetDataField: string;
  3788. begin
  3789. Result := FDataLink.FieldName;
  3790. end;
  3791. procedure TDefineDBRadioGroup.SetDataField(const Value: string);
  3792. begin
  3793. FDataLink.FieldName := Value;
  3794. end;
  3795. function TDefineDBRadioGroup.GetReadOnly: Boolean;
  3796. begin
  3797. Result := FDataLink.ReadOnly;
  3798. end;
  3799. procedure TDefineDBRadioGroup.SetReadOnly(Value: Boolean);
  3800. begin
  3801. FDataLink.ReadOnly := Value;
  3802. end;
  3803. function TDefineDBRadioGroup.GetField: TField;
  3804. begin
  3805. Result := FDataLink.Field;
  3806. end;
  3807. function TDefineDBRadioGroup.GetButtonValue(Index: Integer): string;
  3808. begin
  3809. if (Index < FValues.Count) and (FValues[Index] <> '') then
  3810. Result := FValues[Index]
  3811. else if Index < Items.Count then
  3812. Result := Items[Index]
  3813. else
  3814. Result := '';
  3815. end;
  3816. procedure TDefineDBRadioGroup.SetValue(const Value: string);
  3817. var
  3818. I, Index: Integer;
  3819. begin
  3820. if FValue <> Value then
  3821. begin
  3822. FInSetValue := True;
  3823. try
  3824. Index := -1;
  3825. for I := 0 to Items.Count - 1 do
  3826. if Value = GetButtonValue(I) then
  3827. begin
  3828. Index := I;
  3829. Break;
  3830. end;
  3831. ItemIndex := Index;
  3832. finally
  3833. FInSetValue := False;
  3834. end;
  3835. FValue := Value;
  3836. Change;
  3837. end;
  3838. end;
  3839. procedure TDefineDBRadioGroup.UpdateRecord;
  3840. begin
  3841. if (FDataLink.DataSet <> nil)and(not ReadOnly) then begin
  3842. if (FDataLink.Field <> nil)and(ItemIndex>=0) then
  3843. begin
  3844. FDataLink.DataSet.Edit;
  3845. FDataLink.Field.Text := Value;//GetButtonValue(ItemIndex);
  3846. FDataLink.DataSet.Post;
  3847. SaveState := True;
  3848. end;
  3849. end;
  3850. end;
  3851. procedure TDefineDBRadioGroup.CMExit(var Message: TCMExit);
  3852. begin
  3853. try
  3854. UpdateRecord;
  3855. except
  3856. if ItemIndex >= 0 then
  3857. TDefineRadioButton(Controls[ItemIndex]).SetFocus else
  3858. TDefineRadioButton(Controls[0]).SetFocus;
  3859. raise;
  3860. end;
  3861. inherited;
  3862. end;
  3863. procedure TDefineDBRadioGroup.CMGetDataLink(var Message: TMessage);
  3864. begin
  3865. Message.Result := Integer(FDataLink);
  3866. end;
  3867. procedure TDefineDBRadioGroup.Click;
  3868. begin
  3869. if not FInSetValue then
  3870. begin
  3871. inherited Click;
  3872. SaveState := False;
  3873. if ItemIndex >= 0 then Value := GetButtonValue(ItemIndex);
  3874. end;
  3875. end;
  3876. procedure TDefineDBRadioGroup.SetItems(Value: TStrings);
  3877. begin
  3878. Items.Assign(Value);
  3879. DataChange(Self);
  3880. end;
  3881. procedure TDefineDBRadioGroup.SetValues(Value: TStrings);
  3882. begin
  3883. FValues.Assign(Value);
  3884. DataChange(Self);
  3885. end;
  3886. procedure TDefineDBRadioGroup.Change;
  3887. begin
  3888. if Assigned(FOnChange) then FOnChange(Self);
  3889. end;
  3890. procedure TDefineDBRadioGroup.KeyPress(var Key: Char);
  3891. begin
  3892. inherited KeyPress(Key);
  3893. case Key of
  3894. #8 : UpdateRecord;
  3895. #27 : FDataLink.Reset;
  3896. end;
  3897. end;
  3898. function TDefineDBRadioGroup.CanModify: Boolean;
  3899. begin
  3900. Result := FDataLink.Edit;
  3901. end;
  3902. function TDefineDBRadioGroup.ExecuteAction(Action: TBasicAction): Boolean;
  3903. begin
  3904. Result := inherited ExecuteAction(Action) or (DataLink <> nil) and
  3905. DataLink.ExecuteAction(Action);
  3906. end;
  3907. function TDefineDBRadioGroup.UpdateAction(Action: TBasicAction): Boolean;
  3908. begin
  3909. Result := inherited UpdateAction(Action) or (DataLink <> nil) and
  3910. DataLink.UpdateAction(Action);
  3911. end;
  3912. end.