datasource.inc 8.4 KB

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