datasource.inc 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497
  1. { ---------------------------------------------------------------------
  2. TDatalink
  3. ---------------------------------------------------------------------}
  4. Constructor TDataLink.Create;
  5. begin
  6. Inherited Create;
  7. FBufferCount:=1;
  8. FDatasourceFixed:=False;
  9. end;
  10. Destructor TDataLink.Destroy;
  11. begin
  12. Factive:=False;
  13. FEditing:=False;
  14. FDataSourceFixed:=False;
  15. DataSource:=Nil;
  16. Inherited Destroy;
  17. end;
  18. Procedure TDataLink.ActiveChanged;
  19. begin
  20. end;
  21. Procedure TDataLink.CheckActiveAndEditing;
  22. Var
  23. B : Boolean;
  24. begin
  25. B:=Assigned(DataSource) and (DataSource.State<>dsInactive);
  26. If B<>FActive then
  27. begin
  28. FActive:=B;
  29. ActiveChanged;
  30. end;
  31. B:=Assigned(DataSource) and (DataSource.State in dsEditModes) and Not FReadOnly;
  32. If B<>FEditing Then
  33. begin
  34. FEditing:=B;
  35. EditingChanged;
  36. end;
  37. end;
  38. Procedure TDataLink.CheckBrowseMode;
  39. begin
  40. end;
  41. Function TDataLink.CalcFirstRecord(Index : Integer) : Integer;
  42. { recalculates index of first record in buffer,
  43. and returns number of record scrolled.}
  44. Var
  45. A, // Index of active record in buffer
  46. F, // Index of current first record in buffer
  47. L : Integer; // index of Last (for us) record in buffer;
  48. begin
  49. A:=DataSource.DataSet.FActiveRecord;
  50. F:=FFirstRecord+Index;
  51. L:=F+FBufferCount-1;
  52. If A>L Then
  53. Result:=A-L
  54. else If A<F Then
  55. Result:=A-F;
  56. FFirstRecord:=F+Result;
  57. end;
  58. Procedure TDataLink.DataEvent(Event: TDataEvent; Info: Longint);
  59. begin
  60. Case Event of
  61. deFieldChange,
  62. deRecordChange :
  63. If Not FUpdatingRecord then
  64. RecordChanged(TField(Info));
  65. deDataSetChange:
  66. begin
  67. CalcFirstRecord(Info);
  68. DatasetChanged;
  69. end;
  70. deDataSetScroll:
  71. DatasetScrolled(CalcFirstRecord(Info));
  72. deLayoutChange:
  73. begin
  74. CalcFirstRecord(Info);
  75. LayoutChanged;
  76. end;
  77. deUpdateRecord:
  78. UpdateRecord;
  79. deUpdateState:
  80. CheckActiveAndEditing;
  81. deCheckBrowseMode:
  82. CheckBrowseMode;
  83. deFocusControl:
  84. FocusControl(TFieldRef(Info));
  85. end;
  86. end;
  87. Procedure TDataLink.DataSetChanged;
  88. begin
  89. RecordChanged(Nil);
  90. end;
  91. Procedure TDataLink.DataSetScrolled(Distance: Integer);
  92. begin
  93. DataSetChanged;
  94. end;
  95. Procedure TDataLink.EditingChanged;
  96. begin
  97. end;
  98. Procedure TDataLink.FocusControl(Field: TFieldRef);
  99. begin
  100. end;
  101. Function TDataLink.GetActiveRecord: Integer;
  102. begin
  103. Result:=Dataset.FActiveRecord;
  104. end;
  105. Function TDatalink.GetDataSet : TDataset;
  106. begin
  107. Result:=FDataSource.DataSet
  108. end;
  109. Function TDataLink.GetBOF: Boolean;
  110. begin
  111. Result:=DataSet.BOF
  112. end;
  113. Function TDataLink.GetBufferCount: Integer;
  114. begin
  115. Result:=FBufferCount;
  116. end;
  117. Function TDataLink.GetEOF: Boolean;
  118. begin
  119. Result:=DataSet.EOF
  120. end;
  121. Function TDataLink.GetRecordCount: Integer;
  122. Var D : TDataSet;
  123. begin
  124. Result:=Dataset.RecordCount;
  125. If Result>BufferCount then
  126. Result:=BufferCount;
  127. end;
  128. Procedure TDataLink.LayoutChanged;
  129. begin
  130. DataSetChanged;
  131. end;
  132. Function TDataLink.MoveBy(Distance: Integer): Integer;
  133. begin
  134. DataSet.MoveBy(Distance);
  135. end;
  136. Procedure TDataLink.RecordChanged(Field: TField);
  137. begin
  138. end;
  139. Procedure TDataLink.SetActiveRecord(Value: Integer);
  140. begin
  141. Dataset.FActiveRecord:=Value;
  142. end;
  143. Procedure TDataLink.SetBufferCount(Value: Integer);
  144. begin
  145. If FBUfferCount<>Value then
  146. begin
  147. FBufferCount:=Value;
  148. Dataset.SetBufListSize(Value);
  149. end;
  150. end;
  151. Procedure TDataLink.SetDataSource(Value : TDatasource);
  152. begin
  153. if not FDataSourceFixed then
  154. begin
  155. if Assigned(DataSource) then
  156. DataSource.UnregisterDatalink(Self);
  157. FDataSource := Value;
  158. if Assigned(DataSource) then
  159. DataSource.RegisterDatalink(Self);
  160. end;
  161. end;
  162. Procedure TDatalink.SetReadOnly(Value : Boolean);
  163. begin
  164. If FReadOnly<>Value then
  165. begin
  166. FReadOnly:=Value;
  167. CheckActiveAndEditing;
  168. end;
  169. end;
  170. Procedure TDataLink.UpdateData;
  171. begin
  172. end;
  173. Function TDataLink.Edit: Boolean;
  174. begin
  175. If Not FReadOnly then
  176. DataSource.Edit;
  177. // Triggered event will set FEditing
  178. Result:=FEditing;
  179. end;
  180. Procedure TDataLink.UpdateRecord;
  181. begin
  182. FUpdatingRecord:=True;
  183. Try
  184. UpdateData;
  185. finally
  186. FUpdatingRecord:=False;
  187. end;
  188. end;
  189. { ---------------------------------------------------------------------
  190. TDetailDataLink
  191. ---------------------------------------------------------------------}
  192. Function TDetailDataLink.GetDetailDataSet: TDataSet;
  193. begin
  194. end;
  195. { ---------------------------------------------------------------------
  196. TMasterDataLink
  197. ---------------------------------------------------------------------}
  198. constructor TMasterDataLink.Create(ADataSet: TDataSet);
  199. begin
  200. end;
  201. destructor TMasterDataLink.Destroy;
  202. begin
  203. inherited Destroy;
  204. end;
  205. Procedure TMasterDataLink.ActiveChanged;
  206. begin
  207. end;
  208. Procedure TMasterDataLink.CheckBrowseMode;
  209. begin
  210. end;
  211. Function TMasterDataLink.GetDetailDataSet: TDataSet;
  212. begin
  213. end;
  214. Procedure TMasterDataLink.LayoutChanged;
  215. begin
  216. end;
  217. Procedure TMasterDataLink.RecordChanged(Field: TField);
  218. begin
  219. end;
  220. procedure TMasterDatalink.SetFieldNames(const Value: string);
  221. begin
  222. end;
  223. { ---------------------------------------------------------------------
  224. TDatasource
  225. ---------------------------------------------------------------------}
  226. Constructor TDataSource.Create(AOwner: TComponent);
  227. begin
  228. Inherited Create(AOwner);
  229. FDatalinks:=TList.Create;
  230. FEnabled:=True;
  231. FAutoEdit:=True;
  232. end;
  233. Destructor TDataSource.Destroy;
  234. begin
  235. FOnStateCHange:=Nil;
  236. Dataset:=Nil;
  237. With FDataLinks do
  238. While Count>0 do
  239. TDatalink(Items[Count - 1]).DataSource:=Nil;
  240. FDatalinks.Free;
  241. inherited Destroy;
  242. end;
  243. Procedure TDatasource.Edit;
  244. begin
  245. If (State=dsBrowse) and AutoEdit Then
  246. Dataset.Edit;
  247. end;
  248. Function TDataSource.IsLinkedTo(ADataSet: TDataSet): Boolean;
  249. begin
  250. Result:=False;
  251. end;
  252. procedure TDatasource.DistributeEvent(Event: TDataEvent; Info: Longint);
  253. Var
  254. i : Longint;
  255. begin
  256. With FDatalinks do
  257. begin
  258. For I:=0 to Count-1 do
  259. With TDatalink(Items[i]) do
  260. If Not VisualControl Then
  261. DataEvent(Event,Info);
  262. For I:=0 to Count-1 do
  263. With TDatalink(Items[i]) do
  264. If VisualControl Then
  265. DataEvent(Event,Info);
  266. end;
  267. end;
  268. procedure TDatasource.RegisterDataLink(DataLink: TDataLink);
  269. begin
  270. FDatalinks.Add(DataLink);
  271. If DataSet<>Nil then
  272. Dataset.SetBufListSize(Datalink.BufferCount);
  273. end;
  274. procedure TDatasource.SetDataSet(ADataSet: TDataSet);
  275. begin
  276. If FDataset<>Nil Then
  277. FDataset.UnRegisterDataSource(Self);
  278. If ADataset<>Nil Then
  279. ADataset.RegisterDatasource(Self);
  280. FDataSet:=ADAtaset;
  281. ProcessEvent(deUpdateState,0);
  282. end;
  283. procedure TDatasource.SetEnabled(Value: Boolean);
  284. begin
  285. FEnabled:=Value;
  286. end;
  287. Procedure TDatasource.DoDataChange (Info : Pointer);
  288. begin
  289. If Assigned(OnDataChange) Then
  290. OnDataChange(Self,TField(Info));
  291. end;
  292. Procedure TDatasource.DoStateChange;
  293. begin
  294. If Assigned(OnStateChange) Then
  295. OnStateChange(Self);
  296. end;
  297. Procedure TDatasource.DoUpdateData;
  298. begin
  299. If Assigned(OnUpdateData) Then
  300. OnUpdateData(Self);
  301. end;
  302. procedure TDatasource.UnregisterDataLink(DataLink: TDataLink);
  303. begin
  304. FDatalinks.Remove(Datalink);
  305. If Dataset<>Nil then
  306. Dataset.SetBufListSize(DataLink.BufferCount);
  307. end;
  308. procedure TDataSource.ProcessEvent(Event : TDataEvent; Info : longint);
  309. Const
  310. OnDataChangeEvents = [deRecordChange, deDataSetChange,
  311. deDataSetScroll,
  312. deLayoutChange,deUpdateState];
  313. Var
  314. NeedDataChange : Boolean;
  315. FLastState : TdataSetState;
  316. begin
  317. // Special UpdateState handling.
  318. If Event=deUpdateState then
  319. begin
  320. NeedDataChange:=(FState=dsInactive);
  321. FLastState:=FState;
  322. If Assigned(Dataset) then
  323. FState:=Dataset.State
  324. else
  325. FState:=dsInactive;
  326. // Don't do events if nothing changed.
  327. If FState<>FlastState then
  328. exit;
  329. end
  330. else
  331. NeedDataChange:=True;
  332. DistributeEvent(Event,Info);
  333. // Extra handlers
  334. If Not (csDestroying in ComponentState) then
  335. begin
  336. If (Event=deUpdateState) then
  337. DoStateChange;
  338. If (Event in OnDataChangeEvents) and
  339. NeedDataChange Then
  340. DoDataChange(Nil);
  341. If (Event = deFieldChange) Then
  342. DoDataCHange(Pointer(Info));
  343. If (Event=deUpdateRecord) then
  344. DoUpdateData;
  345. end;
  346. end;