dataset.inc 32 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681
  1. {
  2. $Id$
  3. This file is part of the Free Pascal run time library.
  4. Copyright (c) 1999-2000 by Michael Van Canneyt, member of the
  5. Free Pascal development team
  6. Dataset implementation
  7. See the file COPYING.FPC, included in this distribution,
  8. for details about the copyright.
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  12. **********************************************************************}
  13. { ---------------------------------------------------------------------
  14. TDataSet
  15. ---------------------------------------------------------------------}
  16. Const
  17. DefaultBufferCount = 10;
  18. constructor TDataSet.Create(AOwner: TComponent);
  19. begin
  20. Inherited Create(AOwner);
  21. FFieldDefs:=TFieldDefs.Create(Self);
  22. FFieldList:=TFields.Create(Self);
  23. FDataSources:=TList.Create;
  24. end;
  25. destructor TDataSet.Destroy;
  26. var
  27. i: Integer;
  28. begin
  29. Active:=False;
  30. FFieldDefs.Free;
  31. FFieldList.Free;
  32. With FDatasources do
  33. begin
  34. While Count>0 do
  35. TDatasource(Items[Count - 1]).DataSet:=Nil;
  36. Free;
  37. end;
  38. if Assigned(FBuffers) then
  39. begin
  40. for i := 0 to FBufferCount do
  41. FreeRecordBuffer(FBuffers[i]);
  42. FreeMem(FBuffers);
  43. end;
  44. Inherited Destroy;
  45. end;
  46. Procedure TDataset.ActivateBuffers;
  47. begin
  48. FBOF:=False;
  49. FEOF:=False;
  50. FRecordCount:=1;
  51. FActiveRecord:=0;
  52. end;
  53. Procedure TDataset.UpdateFieldDefs;
  54. begin
  55. //!! To be implemented
  56. end;
  57. Procedure TDataset.BindFields(Binding: Boolean);
  58. Var I : longint;
  59. begin
  60. {
  61. Here some magic will be needed later; for now just simply set
  62. Just set fieldno from listindex...
  63. Later we should take it from the fielddefs.
  64. // ATM Set by CreateField ...
  65. For I:=0 to FFieldList.Count-1 do
  66. FFieldList[i].FFieldNo:=I;
  67. }
  68. end;
  69. Function TDataset.BookmarkAvailable: Boolean;
  70. Const BookmarkStates = [dsBrowse,dsEdit,dsInsert];
  71. begin
  72. Result:=(Not IsEmpty) and (State in BookmarkStates)
  73. and (getBookMarkFlag(ActiveBuffer)=bfCurrent);
  74. end;
  75. Procedure TDataset.CalculateFields(Buffer: PChar);
  76. begin
  77. //!! To be implemented
  78. end;
  79. Procedure TDataset.CheckActive;
  80. begin
  81. If Not Active then
  82. DataBaseError(SInactiveDataset);
  83. end;
  84. Procedure TDataset.CheckInactive;
  85. begin
  86. If Active then
  87. DataBaseError(SActiveDataset);
  88. end;
  89. Procedure TDataset.ClearBuffers;
  90. begin
  91. FRecordCount:=0;
  92. FactiveRecord:=0;
  93. FCurrentRecord:=-1;
  94. FBOF:=True;
  95. FEOF:=True;
  96. end;
  97. Procedure TDataset.ClearCalcFields(Buffer: PChar);
  98. begin
  99. //!! To be implemented
  100. end;
  101. Procedure TDataset.CloseBlob(Field: TField);
  102. begin
  103. //!! To be implemented
  104. end;
  105. Procedure TDataset.CloseCursor;
  106. begin
  107. //!! To be implemented
  108. end;
  109. Procedure TDataset.CreateFields;
  110. Var I : longint;
  111. begin
  112. {$ifdef DSDebug}
  113. Writeln ('Creating fields');
  114. Writeln ('Count : ',fielddefs.Count);
  115. For I:=0 to FieldDefs.Count-1 do
  116. Writeln('Def ',I,' : ',Fielddefs.items[i].Name,'(',Fielddefs.items[i].FieldNo,')');
  117. {$endif}
  118. For I:=0 to fielddefs.Count-1 do
  119. With Fielddefs.Items[I] do
  120. If DataType<>ftUnknown then
  121. begin
  122. {$ifdef DSDebug}
  123. Writeln('About to create field',FieldDefs.Items[i].Name);
  124. {$endif}
  125. CreateField(self);
  126. end;
  127. end;
  128. Procedure TDataset.DataEvent(Event: TDataEvent; Info: Longint);
  129. Var
  130. i : longint;
  131. begin
  132. // Do some bookkeeping;
  133. case Event of
  134. deFieldChange :
  135. begin
  136. if TField(Info).FieldKind in [fkData,fkInternalCalc] then
  137. SetModified(True);
  138. if FInternalCalcFields and (TField(Info).FieldKind = fkData) then
  139. RefreshInternalCalcFields(ActiveBuffer)
  140. else if (FCalcFieldsSize <> 0) and FAutoCalcFields and
  141. (TField(Info).FieldKind = fkData) then
  142. CalculateFields(ActiveBuffer);
  143. TField(Info).Change;
  144. end;
  145. end;
  146. // Distribute event to datasets;
  147. for I := 0 to FDataSources.Count - 1 do
  148. TDataSource(FDataSources[I]).ProcessEvent(Event, Info);
  149. end;
  150. Procedure TDataset.DestroyFields;
  151. begin
  152. FFieldList.Clear;
  153. end;
  154. Procedure TDataset.DoAfterCancel;
  155. begin
  156. If assigned(FAfterCancel) then
  157. FAfterCancel(Self);
  158. end;
  159. Procedure TDataset.DoAfterClose;
  160. begin
  161. If assigned(FAfterClose) then
  162. FAfterClose(Self);
  163. end;
  164. Procedure TDataset.DoAfterDelete;
  165. begin
  166. If assigned(FAfterDelete) then
  167. FAfterDelete(Self);
  168. end;
  169. Procedure TDataset.DoAfterEdit;
  170. begin
  171. If assigned(FAfterEdit) then
  172. FAfterEdit(Self);
  173. end;
  174. Procedure TDataset.DoAfterInsert;
  175. begin
  176. If assigned(FAfterInsert) then
  177. FAfterInsert(Self);
  178. end;
  179. Procedure TDataset.DoAfterOpen;
  180. begin
  181. If assigned(FAfterOpen) then
  182. FAfterOpen(Self);
  183. end;
  184. Procedure TDataset.DoAfterPost;
  185. begin
  186. If assigned(FAfterPost) then
  187. FAfterPost(Self);
  188. end;
  189. Procedure TDataset.DoAfterScroll;
  190. begin
  191. If assigned(FAfterScroll) then
  192. FAfterScroll(Self);
  193. end;
  194. Procedure TDataset.DoBeforeCancel;
  195. begin
  196. If assigned(FBeforeCancel) then
  197. FBeforeCancel(Self);
  198. end;
  199. Procedure TDataset.DoBeforeClose;
  200. begin
  201. If assigned(FBeforeClose) then
  202. FBeforeClose(Self);
  203. end;
  204. Procedure TDataset.DoBeforeDelete;
  205. begin
  206. If assigned(FBeforeDelete) then
  207. FBeforeDelete(Self);
  208. end;
  209. Procedure TDataset.DoBeforeEdit;
  210. begin
  211. If assigned(FBeforeEdit) then
  212. FBeforeEdit(Self);
  213. end;
  214. Procedure TDataset.DoBeforeInsert;
  215. begin
  216. If assigned(FBeforeInsert) then
  217. FBeforeInsert(Self);
  218. end;
  219. Procedure TDataset.DoBeforeOpen;
  220. begin
  221. If assigned(FBeforeOpen) then
  222. FBeforeOpen(Self);
  223. end;
  224. Procedure TDataset.DoBeforePost;
  225. begin
  226. If assigned(FBeforePost) then
  227. FBeforePost(Self);
  228. end;
  229. Procedure TDataset.DoBeforeScroll;
  230. begin
  231. If assigned(FBeforeScroll) then
  232. FBeforeScroll(Self);
  233. end;
  234. Procedure TDataset.DoInternalOpen;
  235. begin
  236. FBufferCount:=0;
  237. FDefaultFields:=FieldCount=0;
  238. DoBeforeOpen;
  239. Try
  240. {$ifdef dsdebug}
  241. Writeln ('Calling internal open');
  242. {$endif}
  243. InternalOpen;
  244. FBOF:=True;
  245. {$ifdef dsdebug}
  246. Writeln ('Setting state to browse');
  247. {$endif}
  248. SetState(dsBrowse);
  249. {$ifdef dsdebug}
  250. Writeln ('Setting buffer size');
  251. {$endif}
  252. (*
  253. SetBufListSize(DefaultBufferCount);
  254. {$ifdef dsdebug}
  255. Writeln ('Getting next records');
  256. {$endif}
  257. GetNextRecords;
  258. *)
  259. RecalcBufListSize;
  260. //SetBufferCount(DefaultBufferCount);
  261. DoAfterOpen;
  262. DoAfterScroll;
  263. except
  264. SetState(dsInactive);
  265. DoInternalClose;
  266. raise;
  267. end;
  268. end;
  269. Function TDataset.RequiredBuffers : longint;
  270. {
  271. If later some datasource requires more buffers (grids etc)
  272. then it should be taken into account here...
  273. }
  274. begin
  275. Result:=0;
  276. end;
  277. Procedure TDataset.DoInternalClose;
  278. begin
  279. FreeFieldBuffers;
  280. ClearBuffers;
  281. SetBufListSize(-1);
  282. SetState(dsInactive);
  283. InternalClose;
  284. end;
  285. Procedure TDataset.DoOnCalcFields;
  286. begin
  287. If assigned(FOnCalcfields) then
  288. FOnCalcFields(Self);
  289. end;
  290. Procedure TDataset.DoOnNewRecord;
  291. begin
  292. If assigned(FOnNewRecord) then
  293. FOnNewRecord(Self);
  294. end;
  295. Function TDataset.FieldByNumber(FieldNo: Longint): TField;
  296. begin
  297. Result:=FFieldList.FieldByNumber(FieldNo);
  298. end;
  299. Function TDataset.FindRecord(Restart, GoForward: Boolean): Boolean;
  300. begin
  301. //!! To be implemented
  302. end;
  303. Procedure TDataset.FreeFieldBuffers;
  304. Var I : longint;
  305. begin
  306. For I:=0 to FFieldList.Count-1 do
  307. FFieldList[i].FreeBuffers;
  308. end;
  309. Function TDataset.GetBookmarkStr: TBookmarkStr;
  310. begin
  311. Result:='';
  312. If BookMarkAvailable then
  313. begin
  314. SetLength(Result,FBookMarkSize);
  315. GetBookMarkData(ActiveBuffer,Pointer(Result));
  316. end
  317. end;
  318. Function TDataset.GetBuffer (Index : longint) : Pchar;
  319. begin
  320. Result:=FBuffers[Index];
  321. end;
  322. Procedure TDataset.GetCalcFields(Buffer: PChar);
  323. begin
  324. //!! To be implemented
  325. end;
  326. Function TDataset.GetCanModify: Boolean;
  327. begin
  328. Result:=True;
  329. end;
  330. Procedure TDataset.GetChildren(Proc: TGetChildProc; Root: TComponent);
  331. begin
  332. //!! To be implemented
  333. end;
  334. Function TDataset.GetField (Index : Longint) : TField;
  335. begin
  336. Result:=FFIeldList[index];
  337. end;
  338. {
  339. This is not yet allowed, FPC doesn't allow typed consts of Classes...
  340. Const
  341. DefFieldClasses : Array [TFieldType] of TFieldClass =
  342. ( { ftUnknown} Tfield,
  343. { ftString} TStringField,
  344. { ftSmallint} TLongIntField,
  345. { ftInteger} TLongintField,
  346. { ftWord} TLongintField,
  347. { ftBoolean} TBooleanField,
  348. { ftFloat} TFloatField,
  349. { ftDate} TDateField,
  350. { ftTime} TTimeField,
  351. { ftDateTime} TDateTimeField,
  352. { ftBytes} TBytesField,
  353. { ftVarBytes} TVarBytesField,
  354. { ftAutoInc} TAutoIncField,
  355. { ftBlob} TBlobField,
  356. { ftMemo} TMemoField,
  357. { ftGraphic} TGraphicField,
  358. { ftFmtMemo} TMemoField,
  359. { ftParadoxOle} Nil,
  360. { ftDBaseOle} Nil,
  361. { ftTypedBinary} Nil,
  362. { ftCursor} Nil
  363. );
  364. }
  365. Function TDataset.GetFieldClass(FieldType: TFieldType): TFieldClass;
  366. begin
  367. Case FieldType of
  368. ftUnknown : Result:=Tfield;
  369. ftString: Result := TStringField;
  370. ftSmallint: Result := TSmallIntField;
  371. ftInteger: Result := TLongintField;
  372. ftWord: Result := TWordField;
  373. ftBoolean: Result := TBooleanField;
  374. ftFloat: Result := TFloatField;
  375. ftDate: Result := TDateField;
  376. ftTime: Result := TTimeField;
  377. ftDateTime: Result := TDateTimeField;
  378. ftBytes: Result := TBytesField;
  379. ftVarBytes: Result := TVarBytesField;
  380. ftAutoInc: Result := TAutoIncField;
  381. ftBlob: Result := TBlobField;
  382. ftMemo: Result := TMemoField;
  383. ftGraphic: Result := TGraphicField;
  384. ftFmtMemo: Result := TMemoField;
  385. ftParadoxOle: Result := Nil;
  386. ftDBaseOle: Result := Nil;
  387. ftTypedBinary: Result := Nil;
  388. ftCursor: Result := Nil;
  389. end;
  390. end;
  391. Function TDataset.GetIsIndexField(Field: TField): Boolean;
  392. begin
  393. //!! To be implemented
  394. end;
  395. Function TDataset.GetNextRecord: Boolean;
  396. Var Shifted : Boolean;
  397. begin
  398. {$ifdef dsdebug}
  399. Writeln ('Getting next record. Internal RecordCount : ',FRecordCount);
  400. {$endif}
  401. Shifted:=FRecordCount=FBufferCount;
  402. If Shifted then
  403. begin
  404. ShiftBuffers(0,1);
  405. Dec(FRecordCount);
  406. end;
  407. {$ifdef dsdebug}
  408. Writeln ('Getting data into buffer : ',FRecordCount);
  409. {$endif}
  410. If FRecordCount>0 Then SetCurrentRecord(FRecordCount-1);
  411. Result:=GetRecord(FBuffers[FRecordCount],gmNext,True)=grOK;
  412. If Result then
  413. begin
  414. If FRecordCount=0 then
  415. ActivateBuffers
  416. else
  417. If FRecordCount<FBufferCount then
  418. Inc(FRecordCount);
  419. FCurrentRecord:=FRecordCount - 1;
  420. end
  421. else
  422. begin
  423. if shifted then
  424. begin
  425. ShiftBuffers(0,-1);
  426. inc(FRecordCount);
  427. end;
  428. CursorPosChanged;
  429. end;
  430. {$ifdef dsdebug}
  431. Writeln ('Result getting next record : ',Result);
  432. {$endif}
  433. end;
  434. Function TDataset.GetNextRecords: Longint;
  435. begin
  436. Result:=0;
  437. {$ifdef dsdebug}
  438. Writeln ('Getting next record(s), need :',FBufferCount);
  439. {$endif}
  440. While (FRecordCount<FBufferCount) and GetNextRecord do
  441. Inc(Result);
  442. {$ifdef dsdebug}
  443. Writeln ('Result Getting next record(s), GOT :',RESULT);
  444. {$endif}
  445. end;
  446. Function TDataset.GetPriorRecord: Boolean;
  447. Var Shifted : boolean;
  448. begin
  449. {$ifdef dsdebug}
  450. Writeln ('Getting previous record');
  451. {$endif}
  452. Shifted:=FRecordCount>0;
  453. If Shifted Then
  454. begin
  455. SetCurrentRecord(0);
  456. ShiftBuffers(0,-1);
  457. end;
  458. Result:=GetRecord(FBuffers[0],gmPrior,True)=grOK;
  459. If Result then
  460. begin
  461. If FRecordCount=0 then
  462. ActivateBuffers
  463. else
  464. begin
  465. If FrecordCount<FBufferCount then
  466. Inc(FRecordCount);
  467. end;
  468. FCurrentRecord:=0;
  469. end
  470. else
  471. begin
  472. If Shifted then
  473. begin
  474. ShiftBuffers(0,1);
  475. end;
  476. CursorPosChanged;
  477. end;
  478. end;
  479. Function TDataset.GetPriorRecords: Longint;
  480. begin
  481. Result:=0;
  482. {$ifdef dsdebug}
  483. Writeln ('Getting previous record(s), need :',FBufferCount);
  484. {$endif}
  485. While (FRecordCount<FbufferCount) and GetPriorRecord do
  486. Inc(Result);
  487. end;
  488. Function TDataset.GetRecNo: Longint;
  489. begin
  490. //!! To be implemented
  491. end;
  492. Function TDataset.GetRecordCount: Longint;
  493. begin
  494. //!! To be implemented
  495. end;
  496. Procedure TDataset.InitFieldDefs;
  497. begin
  498. //!! To be implemented
  499. end;
  500. Procedure TDataset.InitRecord(Buffer: PChar);
  501. begin
  502. InternalInitRecord(Buffer);
  503. ClearCalcFields(Buffer);
  504. end;
  505. Procedure TDataset.InternalCancel;
  506. begin
  507. //!! To be implemented
  508. end;
  509. Procedure TDataset.InternalEdit;
  510. begin
  511. //!! To be implemented
  512. end;
  513. Procedure TDataset.InternalRefresh;
  514. begin
  515. //!! To be implemented
  516. end;
  517. Procedure TDataset.Loaded;
  518. begin
  519. //!! To be implemented
  520. end;
  521. Procedure TDataset.OpenCursor(InfoQuery: Boolean);
  522. begin
  523. //!! To be implemented
  524. end;
  525. Procedure TDataset.RefreshInternalCalcFields(Buffer: PChar);
  526. begin
  527. //!! To be implemented
  528. end;
  529. Procedure TDataset.RestoreState(const Value: TDataSetState);
  530. begin
  531. //!! To be implemented
  532. end;
  533. Procedure TDataset.SetActive (Value : Boolean);
  534. begin
  535. If Value<>Factive then
  536. If Value then
  537. DoInternalOpen
  538. else
  539. DoInternalClose;
  540. FActive:=Value;
  541. end;
  542. procedure TDataSet.SetBufferCount(const AValue: Longint);
  543. Var
  544. ShiftCount: Integer;
  545. begin
  546. If (FBufferCount=AValue) Then
  547. exit;
  548. If AValue<FRecordCount Then
  549. Begin
  550. If (AValue>0)And(ActiveRecord>AValue-1) Then
  551. begin
  552. // ActiveRecord Will be pointing to a deleted record
  553. // Move Buffers to a safe place and then adjust buffer count
  554. ShiftCount:=FActiveRecord - Avalue + 1;
  555. ShiftBuffers(0, ShiftCount);
  556. FActiveRecord:=AValue-1;
  557. End;
  558. FRecordCount:=AValue;
  559. // Current record Will be pointing to a invalid record
  560. // if we are not in BOF or EOF state then make current record point
  561. // to the last record in buffer
  562. If FCurrentRecord<>-1 Then
  563. Begin
  564. FCurrentRecord:=FRecordCount - 1;
  565. if FCurrentRecord=-1 Then
  566. InternalFirst;
  567. End;
  568. End;
  569. SetBufListSize(Avalue);
  570. GetNextRecords;
  571. {$Ifdef dsDebug}
  572. WriteLn(
  573. 'SetBufferCount: FActiveRecord=',FActiveRecord,
  574. ' FCurrentRecord=',FCurrentRecord,
  575. ' FBufferCount= ',FBufferCount,
  576. ' FRecordCount=',FRecordCount);
  577. {$Endif}
  578. end;
  579. Procedure TDataset.SetBookmarkStr(const Value: TBookmarkStr);
  580. begin
  581. GotoBookMark(Pointer(Value))
  582. end;
  583. Procedure TDataset.SetBufListSize(Value: Longint);
  584. Var I : longint;
  585. begin
  586. {$ifdef dsdebug}
  587. Writeln ('SetBufListSize: ',Value);
  588. {$endif}
  589. If Value=FBufferCount Then
  590. exit;
  591. If Value>FBufferCount then
  592. begin
  593. {$ifdef dsdebug}
  594. Writeln (' Reallocating memory :',(Value+1)*SizeOf(PChar));
  595. {$endif}
  596. ReAllocMem(FBuffers,(Value+1)*SizeOf(PChar));
  597. {$ifdef dsdebug}
  598. Writeln (' Filling memory :',(Value-FBufferCount)*SizeOf(PChar));
  599. {$endif}
  600. FillChar(FBuffers[FBufferCount],(Value+1-FBufferCount)*SizeOF(Pchar),#0);
  601. {$ifdef dsdebug}
  602. Writeln (' Filled memory :');
  603. {$endif}
  604. Try
  605. {$ifdef dsdebug}
  606. Writeln (' Assigning buffers :',(Value+1)*SizeOf(PChar));
  607. {$endif}
  608. For I:=FBufferCount to Value do
  609. FBuffers[i]:=AllocRecordBuffer;
  610. {$ifdef dsdebug}
  611. Writeln (' Assigned buffers ',FBufferCount,' :',(Value+1)*SizeOf(PChar));
  612. {$endif}
  613. except
  614. I:=FBufferCount;
  615. While (I<=Value) and (FBuffers[i]<>Nil) do
  616. begin
  617. FreeRecordBuffer(FBuffers[i]);
  618. Inc(i);
  619. end;
  620. raise;
  621. end;
  622. end
  623. else
  624. begin
  625. {$ifdef dsdebug}
  626. Writeln (' Freeing buffers :',FBufferCount-Value);
  627. {$endif}
  628. For I:=Value+1 to FBufferCount do
  629. FreeRecordBuffer(FBuffers[i]);
  630. ReAllocMem(FBuffers,(Value+1)*SizeOf(Pchar));
  631. end;
  632. FBufferCount:=Value;
  633. {$ifdef dsdebug}
  634. Writeln (' SetBufListSize: Final FBufferCount=',FBufferCount);
  635. {$endif}
  636. end;
  637. Procedure TDataset.SetChildOrder(Component: TComponent; Order: Longint);
  638. begin
  639. //!! To be implemented
  640. end;
  641. Procedure TDataset.SetCurrentRecord(Index: Longint);
  642. begin
  643. If FCurrentRecord<>Index then
  644. begin
  645. {$ifdef DSdebug}
  646. Writeln ('Setting current record to',index);
  647. {$endif}
  648. Case GetBookMarkFlag(FBuffers[Index]) of
  649. bfCurrent : InternalSetToRecord(FBuffers[Index]);
  650. bfBOF : InternalFirst;
  651. bfEOF : InternalLast;
  652. end;
  653. FCurrentRecord:=index;
  654. end;
  655. end;
  656. Procedure TDataset.SetField (Index : Longint;Value : TField);
  657. begin
  658. //!! To be implemented
  659. end;
  660. Procedure TDataset.SetFilterOptions(Value: TFilterOptions);
  661. begin
  662. //!! To be implemented
  663. end;
  664. Procedure TDataset.SetFilterText(const Value: string);
  665. begin
  666. //!! To be implemented
  667. end;
  668. Procedure TDataset.SetFiltered(Value: Boolean);
  669. begin
  670. //!! To be implemented
  671. end;
  672. Procedure TDataset.SetFound(const Value: Boolean);
  673. begin
  674. //!! To be implemented
  675. end;
  676. Procedure TDataset.SetModified(Value: Boolean);
  677. begin
  678. //!! To be implemented
  679. end;
  680. Procedure TDataset.SetName(const Value: TComponentName);
  681. begin
  682. //!! To be implemented
  683. inherited SetName(Value);
  684. end;
  685. Procedure TDataset.SetOnFilterRecord(const Value: TFilterRecordEvent);
  686. begin
  687. //!! To be implemented
  688. end;
  689. Procedure TDataset.SetRecNo(Value: Longint);
  690. begin
  691. //!! To be implemented
  692. end;
  693. Procedure TDataset.SetState(Value: TDataSetState);
  694. begin
  695. If Value<>FState then
  696. begin
  697. FState:=Value;
  698. DataEvent(deUpdateState,0);
  699. end;
  700. end;
  701. Function TDataset.SetTempState(const Value: TDataSetState): TDataSetState;
  702. begin
  703. //!! To be implemented
  704. end;
  705. Function TDataset.TempBuffer: PChar;
  706. begin
  707. //!! To be implemented
  708. end;
  709. Procedure TDataset.UpdateIndexDefs;
  710. begin
  711. //!! To be implemented
  712. end;
  713. Function TDataset.ControlsDisabled: Boolean;
  714. begin
  715. //!! To be implemented
  716. end;
  717. Function TDataset.ActiveBuffer: PChar;
  718. begin
  719. {$ifdef dsdebug}
  720. // Writeln ('Active buffer requested. Returning:',ActiveRecord);
  721. {$endif}
  722. Result:=FBuffers[ActiveRecord];
  723. end;
  724. Procedure TDataset.Append;
  725. begin
  726. DoInsertAppend(True);
  727. end;
  728. Procedure TDataset.AppendRecord(const Values: array of const);
  729. begin
  730. //!! To be implemented
  731. end;
  732. Function TDataset.BookmarkValid(ABookmark: TBookmark): Boolean;
  733. {
  734. Should be overridden by descendant objects.
  735. }
  736. begin
  737. Result:=False
  738. end;
  739. Procedure TDataset.Cancel;
  740. begin
  741. If State in [dsEdit,dsInsert] then
  742. begin
  743. DataEvent(deCheckBrowseMode,0);
  744. DoBeforeCancel;
  745. UpdateCursorPos;
  746. InternalCancel;
  747. FreeFieldBuffers;
  748. SetState(dsBrowse);
  749. Resync([]);
  750. DoAfterCancel;
  751. end;
  752. end;
  753. Procedure TDataset.CheckBrowseMode;
  754. begin
  755. CheckActive;
  756. DataEvent(deCheckBrowseMode,0);
  757. If State In [dsedit,dsinsert] then
  758. begin
  759. UpdateRecord;
  760. If Modified then
  761. Post
  762. else
  763. Cancel;
  764. end;
  765. end;
  766. Procedure TDataset.ClearFields;
  767. begin
  768. //!! To be implemented
  769. end;
  770. Procedure TDataset.Close;
  771. begin
  772. Active:=False;
  773. end;
  774. Function TDataset.CompareBookmarks(Bookmark1, Bookmark2: TBookmark): Longint;
  775. begin
  776. Result:=0;
  777. end;
  778. Function TDataset.CreateBlobStream(Field: TField; Mode: TBlobStreamMode): TStream;
  779. begin
  780. Result:=Nil;
  781. end;
  782. Procedure TDataset.CursorPosChanged;
  783. begin
  784. FCurrentRecord:=-1;
  785. end;
  786. Procedure TDataset.Delete;
  787. begin
  788. //!! To be implemented
  789. end;
  790. Procedure TDataset.DisableControls;
  791. begin
  792. If FDisableControlsCount=0 then
  793. begin
  794. { Save current state,
  795. needed to detect change of state when enabling controls.
  796. }
  797. FDisableControlsState:=FState;
  798. FEnableControlsEvent:=deDatasetChange;
  799. end;
  800. Inc(FDisableControlsCount);
  801. end;
  802. Procedure TDataset.DoInsertAppend(DoAppend : Boolean);
  803. Var Buffer : PChar;
  804. BookBeforeInsert : TBookmarkStr;
  805. begin
  806. If Not CanModify then
  807. DatabaseError(SDatasetReadOnly,Self);
  808. CheckBrowseMode;
  809. DoBeforeInsert;
  810. DoBeforeScroll;
  811. If Not DoAppend then
  812. begin
  813. {$ifdef dsdebug}
  814. Writeln ('going to insert mode');
  815. {$endif}
  816. // need to scroll up al buffers after current one,
  817. // but copy current bookmark to insert buffer.
  818. BookBeforeInsert:=Bookmark;
  819. ShiftBuffers(1,FActiveRecord);
  820. // Active buffer is now edit buffer. Initialize.
  821. InitRecord(ActiveBuffer);
  822. // Put bookmark in edit buffer.
  823. if FRecordCount=0 then
  824. SetBookmarkFlag(ActiveBuffer,bfBOF)
  825. else
  826. SetBookMarkData(ActiveBuffer,Pointer(BookBeforeInsert));
  827. // update buffer count.
  828. If FRecordCount<FBufferCount then
  829. Inc(FRecordCount);
  830. end
  831. else
  832. // Tricky, need to get last record and scroll down.
  833. begin
  834. {$ifdef dsdebug}
  835. Writeln ('going to append mode');
  836. {$endif}
  837. Buffer:=FBuffers[0];
  838. InitRecord(Buffer);
  839. // just mark buffer as last. GetPreviousrecords will do an internallast
  840. // Because of this...
  841. SetBookMarkFlag(Buffer,bfEOF);
  842. FRecordCount:=1;
  843. {$ifdef dsdebug}
  844. Writeln ('getting prior records');
  845. {$endif}
  846. GetPriorRecords;
  847. // update active record.
  848. FactiveRecord:=FRecordCount-1;
  849. end;
  850. SetState(dsInsert);
  851. try
  852. DoOnNewRecord;
  853. except
  854. UpdateCursorPos;
  855. resync([]);
  856. raise;
  857. end;
  858. // mark as not modified.
  859. FModified:=False;
  860. // Final events.
  861. DataEvent(deDatasetChange,0);
  862. DoAfterInsert;
  863. DoAfterScroll;
  864. {$ifdef dsdebug}
  865. Writeln ('Done with append');
  866. {$endif}
  867. end;
  868. Procedure TDataset.Edit;
  869. begin
  870. If Not CanModify then
  871. DatabaseError(SDatasetReadOnly,Self);
  872. If State in [dsedit,dsinsert] then exit;
  873. If FRecordCount = 0 then
  874. begin
  875. Insert;
  876. Exit;
  877. end;
  878. CheckBrowseMode;
  879. DoBeforeEdit;
  880. If Not TryDoing(@InternalEdit,OnEditError) then
  881. exit;
  882. SetState(dsedit);
  883. DataEvent(deRecordChange,0);
  884. DoAfterEdit;
  885. end;
  886. Procedure TDataset.EnableControls;
  887. begin
  888. If FDisableControlsCount>0 then
  889. begin
  890. Dec(FDisableControlsCount);
  891. If FDisableControlsCount=0 then
  892. begin
  893. // State changed since disablecontrols ?
  894. If FDisableControlsState<>FState then
  895. DataEvent(deUpdateState,0);
  896. If (FDisableControlsState<>dsInactive) and (FState<>dsInactive) then
  897. DataEvent(FEnableControlsEvent,0);
  898. end;
  899. end;
  900. end;
  901. Function TDataset.FieldByName(const FieldName: string): TField;
  902. begin
  903. Result:=FindField(FieldName);
  904. If Result=Nil then
  905. DatabaseErrorFmt(SFieldNotFound,[FieldName],Self);
  906. end;
  907. Function TDataset.FindField(const FieldName: string): TField;
  908. begin
  909. Result:=FFieldList.FindField(FieldName);
  910. end;
  911. Function TDataset.FindFirst: Boolean;
  912. begin
  913. //!! To be implemented
  914. end;
  915. Function TDataset.FindLast: Boolean;
  916. begin
  917. //!! To be implemented
  918. end;
  919. Function TDataset.FindNext: Boolean;
  920. begin
  921. //!! To be implemented
  922. end;
  923. Function TDataset.FindPrior: Boolean;
  924. begin
  925. //!! To be implemented
  926. end;
  927. Procedure TDataset.First;
  928. begin
  929. CheckBrowseMode;
  930. DoBeforeScroll;
  931. ClearBuffers;
  932. try
  933. InternalFirst;
  934. GetNextRecords;
  935. finally
  936. FBOF:=True;
  937. DataEvent(deDatasetChange,0);
  938. DoAfterScroll;
  939. end;
  940. end;
  941. Procedure TDataset.FreeBookmark(ABookmark: TBookmark);
  942. begin
  943. FreeMem(ABookMark,FBookMarkSize);
  944. end;
  945. Function TDataset.GetBookmark: TBookmark;
  946. begin
  947. if BookmarkAvailable then
  948. begin
  949. GetMem (Result,FBookMarkSize);
  950. GetBookMarkdata(ActiveBuffer,Result);
  951. end
  952. else
  953. Result:=Nil;
  954. end;
  955. Function TDataset.GetCurrentRecord(Buffer: PChar): Boolean;
  956. begin
  957. Result:=False;
  958. end;
  959. Procedure TDataset.GetFieldList(List: TList; const FieldNames: string);
  960. begin
  961. end;
  962. Procedure TDataset.GetFieldNames(List: TStrings);
  963. begin
  964. FFieldList.GetFieldNames(List);
  965. end;
  966. Procedure TDataset.GotoBookmark(ABookmark: TBookmark);
  967. begin
  968. If Assigned(ABookMark) then
  969. begin
  970. CheckBrowseMode;
  971. DoBeforeScroll;
  972. InternalGotoBookMark(ABookMark);
  973. Resync([rmExact,rmCenter]);
  974. DoAfterScroll;
  975. end;
  976. end;
  977. Procedure TDataset.Insert;
  978. begin
  979. DoInsertAppend(False);
  980. end;
  981. Procedure TDataset.InsertRecord(const Values: array of const);
  982. begin
  983. //!! To be implemented
  984. end;
  985. Function TDataset.IsEmpty: Boolean;
  986. begin
  987. Result:=(Bof and Eof);
  988. end;
  989. Function TDataset.IsSequenced: Boolean;
  990. begin
  991. //!! To be implemented
  992. end;
  993. Procedure TDataset.Last;
  994. begin
  995. CheckBrowseMode;
  996. DoBeforeScroll;
  997. ClearBuffers;
  998. try
  999. InternalLast;
  1000. GetPriorRecords;
  1001. FActiveRecord:=FRecordCount-1;
  1002. finally
  1003. FEOF:=true;
  1004. DataEvent(deDataSetChange, 0);
  1005. DoAfterScroll;
  1006. end;
  1007. end;
  1008. Function TDataset.MoveBy(Distance: Longint): Longint;
  1009. Var
  1010. TheResult: Integer;
  1011. Function Scrollforward : Integer;
  1012. begin
  1013. Result:=0;
  1014. {$ifdef dsdebug}
  1015. Writeln('Scrolling forward :',Distance);
  1016. Writeln('Active buffer : ',FActiveRecord);
  1017. Writeln('RecordCount : ',FRecordCount);
  1018. WriteLn('BufferCount : ',FBufferCount);
  1019. {$endif}
  1020. FBOF:=False;
  1021. While (Distance>0) and not FEOF do
  1022. begin
  1023. If FActiveRecord<FRecordCount-1 then
  1024. begin
  1025. Inc(FActiveRecord);
  1026. Dec(Distance);
  1027. Inc(TheResult); //Inc(Result);
  1028. end
  1029. else
  1030. begin
  1031. {$ifdef dsdebug}
  1032. Writeln('Moveby : need next record');
  1033. {$endif}
  1034. If GetNextRecord then
  1035. begin
  1036. Dec(Distance);
  1037. Dec(Result);
  1038. Inc(TheResult); //Inc(Result);
  1039. end
  1040. else
  1041. FEOF:=true;
  1042. end;
  1043. end
  1044. end;
  1045. Function ScrollBackward : Integer;
  1046. begin
  1047. Result:=0;
  1048. {$ifdef dsdebug}
  1049. Writeln('Scrolling backward:',Abs(Distance));
  1050. Writeln('Active buffer : ',FActiveRecord);
  1051. Writeln('RecordCunt : ',FRecordCount);
  1052. WriteLn('BufferCount : ',FBufferCount);
  1053. {$endif}
  1054. FEOF:=False;
  1055. While (Distance<0) and not FBOF do
  1056. begin
  1057. If FActiveRecord>0 then
  1058. begin
  1059. Dec(FActiveRecord);
  1060. Inc(Distance);
  1061. Dec(TheResult); //Dec(Result);
  1062. end
  1063. else
  1064. begin
  1065. {$ifdef dsdebug}
  1066. Writeln('Moveby : need next record');
  1067. {$endif}
  1068. If GetPriorRecord then
  1069. begin
  1070. Inc(Distance);
  1071. Inc(Result);
  1072. Dec(TheResult); //Dec(Result);
  1073. end
  1074. else
  1075. FBOF:=true;
  1076. end;
  1077. end
  1078. end;
  1079. Var
  1080. PrevRecordCount : Integer;
  1081. Scrolled : Integer;
  1082. begin
  1083. CheckBrowseMode;
  1084. Result:=0; TheResult:=0;
  1085. PrevRecordCount:=FRecordCount;
  1086. DoBeforeScroll;
  1087. If ((Distance>0) and FEOF) or
  1088. ((Distance<0) and FBOF) then
  1089. exit;
  1090. Try
  1091. If Distance>0 then
  1092. Scrolled:=ScrollForward
  1093. else
  1094. Scrolled:=ScrollBackward;
  1095. finally
  1096. {$ifdef dsdebug}
  1097. WriteLn('ActiveRecord=', FActiveRecord,' FEOF=',FEOF,' FBOF=',FBOF);
  1098. {$Endif}
  1099. If FRecordCount<>PrevRecordCount then
  1100. DataEvent(deDatasetChange,0)
  1101. else
  1102. DataEvent(deDatasetScroll,Scrolled);
  1103. DoAfterScroll;
  1104. end;
  1105. Result:=TheResult;
  1106. end;
  1107. Procedure TDataset.Next;
  1108. begin
  1109. MoveBy(1);
  1110. end;
  1111. Procedure TDataset.Open;
  1112. begin
  1113. Active:=True;
  1114. end;
  1115. Procedure TDataset.Post;
  1116. Procedure Checkrequired;
  1117. Var I : longint;
  1118. begin
  1119. For I:=0 to FFieldList.Count-1 do
  1120. With FFieldList[i] do
  1121. // Required fields that are NOT autoinc !! Autoinc cannot be set !!
  1122. if Required and not ReadOnly and
  1123. (FieldKind=fkData) and Not (DataType=ftAutoInc) then
  1124. DatabaseErrorFmt(SNeedField,[DisplayName],Self);
  1125. end;
  1126. begin
  1127. if State in [dsEdit,dsInsert] then
  1128. begin
  1129. DataEvent(deCheckBrowseMode,0);
  1130. {$ifdef dsdebug}
  1131. writeln ('Post: checking required fields');
  1132. {$endif}
  1133. CheckRequired;
  1134. DoBeforePost;
  1135. If Not TryDoing(@InternalPost,OnPostError) then exit;
  1136. {$ifdef dsdebug}
  1137. writeln ('Post: Internalpost succeeded');
  1138. {$endif}
  1139. FreeFieldBuffers;
  1140. {$ifdef dsdebug}
  1141. writeln ('Post: Freeing field buffers');
  1142. {$endif}
  1143. SetState(dsBrowse);
  1144. {$ifdef dsdebug}
  1145. writeln ('Post: Browse mode set');
  1146. {$endif}
  1147. Resync([]);
  1148. DoAfterPost;
  1149. end;
  1150. end;
  1151. Procedure TDataset.Prior;
  1152. begin
  1153. MoveBy(-1);
  1154. end;
  1155. Procedure TDataset.Refresh;
  1156. begin
  1157. CheckbrowseMode;
  1158. UpdateCursorPos;
  1159. InternalRefresh;
  1160. Resync([]);
  1161. end;
  1162. procedure TDataSet.RecalcBufListSize;
  1163. var
  1164. i, j, MaxValue: Integer;
  1165. DataLink: TDataLink;
  1166. begin
  1167. If Not IsCursorOpen Then
  1168. Exit;
  1169. MaxValue := 0;
  1170. for i := 0 to FDataSources.Count - 1 do
  1171. for j := 0 to TDataSource(FDataSources[i]).DataLinks.Count - 1 do
  1172. begin
  1173. DataLink:=TDataLink(TDataSource(FDataSources[i]).DataLinks[j]);
  1174. if DataLink.BufferCount>MaxValue then
  1175. MaxValue:=DataLink.BufferCount;
  1176. end;
  1177. SetBufferCount(MaxValue); //SetBufListSize(MaxValue);
  1178. end;
  1179. Procedure TDataset.RegisterDataSource(ADatasource : TDataSource);
  1180. begin
  1181. FDatasources.Add(ADataSource);
  1182. RecalcBufListSize;
  1183. end;
  1184. Procedure TDataset.Resync(Mode: TResyncMode);
  1185. Var Count,ShiftCount : Longint;
  1186. begin
  1187. // See if we can find the requested record.
  1188. If rmExact in Mode then
  1189. begin
  1190. { throw an exception if not found.
  1191. Normally the descendant should do this if DoCheck is true. }
  1192. If GetRecord(Fbuffers[FRecordCount-1],gmcurrent,True)<>grOk Then
  1193. DatabaseError(SNoSuchRecord,Self);
  1194. end
  1195. else
  1196. { Can we find a record in the neighbourhood ?
  1197. Use Shortcut evaluation for this, or we'll have some funny results. }
  1198. If (GetRecord(Fbuffers[FRecordCount-1],gmcurrent,True)<>grOk) and
  1199. (GetRecord(Fbuffers[FRecordCount-1],gmprior,True)<>grOk) and
  1200. (GetRecord(Fbuffers[FRecordCount-1],gmprior,True)<>grOk) then
  1201. begin
  1202. // nothing found, invalidate buffer and bail out.
  1203. ClearBuffers;
  1204. DataEvent(deDatasetChange,0);
  1205. Exit;
  1206. end;
  1207. If (rmCenter in Mode) then
  1208. ShiftCount:=FbufferCount div 2
  1209. else
  1210. // keep current position.
  1211. ShiftCount:=FActiveRecord;
  1212. // Reposition on 0
  1213. ShiftBuffers(0,FRecordCount-1);
  1214. ActivateBuffers;
  1215. try
  1216. Count:=0;
  1217. {$ifdef dsdebug}
  1218. Writeln ('Getting previous',ShiftCount,' records');
  1219. {$endif}
  1220. While (Count<ShiftCount) and GetPriorRecord do
  1221. Inc(Count);
  1222. FActiveRecord:=Count;
  1223. // fill rest of buffers, adjust ActiveBuffer.
  1224. SetCurrentRecord(FRecordCount-1);
  1225. GetNextRecords;
  1226. Inc(FActiveRecord,GetPriorRecords);
  1227. finally
  1228. // Notify Everyone
  1229. DataEvent(deDatasetChange,0);
  1230. end;
  1231. end;
  1232. Procedure TDataset.SetFields(const Values: array of const);
  1233. Var I : longint;
  1234. begin
  1235. For I:=0 to high(Values) do
  1236. Case Values[I].vtype of
  1237. vtInteger : FieldByNumber(i).AsLongInt:=Values[I].VInteger;
  1238. // needs Completion..
  1239. end;
  1240. end;
  1241. Procedure TDataset.Translate(Src, Dest: PChar; ToOem: Boolean);
  1242. begin
  1243. //!! To be implemented
  1244. end;
  1245. Function Tdataset.TryDoing (P : TDataOperation; Ev : TDatasetErrorEvent) : Boolean;
  1246. Var Retry : TDataAction;
  1247. begin
  1248. {$ifdef dsdebug}
  1249. Writeln ('Trying to do');
  1250. If P=Nil then writeln ('Procedure to call is nil !!!');
  1251. {$endif dsdebug}
  1252. Result:=True;
  1253. Retry:=daRetry;
  1254. while Retry=daRetry do
  1255. Try
  1256. {$ifdef dsdebug}
  1257. Writeln ('Trying : updatecursorpos');
  1258. {$endif dsdebug}
  1259. UpdateCursorPos;
  1260. {$ifdef dsdebug}
  1261. Writeln ('Trying to do it');
  1262. {$endif dsdebug}
  1263. P;
  1264. exit;
  1265. except
  1266. On E : EDatabaseError do
  1267. begin
  1268. retry:=daFail;
  1269. If Assigned(Ev) then
  1270. Ev(Self,E,Retry);
  1271. Case Retry of
  1272. daFail : Raise;
  1273. daAbort : Result:=False;
  1274. end;
  1275. end;
  1276. else
  1277. Raise;
  1278. end;
  1279. {$ifdef dsdebug}
  1280. Writeln ('Exit Trying to do');
  1281. {$endif dsdebug}
  1282. end;
  1283. Procedure TDataset.UpdateCursorPos;
  1284. begin
  1285. If FRecordCount>0 then
  1286. SetCurrentRecord(FactiveRecord);
  1287. end;
  1288. Procedure TDataset.UpdateRecord;
  1289. begin
  1290. if not (State in dsEditModes) then
  1291. DatabaseError(SNotInEditState, Self);
  1292. DataEvent(deUpdateRecord, 0);
  1293. end;
  1294. Procedure TDataset.RemoveField (Field : TField);
  1295. begin
  1296. //!! To be implemented
  1297. end;
  1298. Function TDataset.Getfieldcount : Longint;
  1299. begin
  1300. Result:=FFieldList.Count;
  1301. end;
  1302. Procedure TDataset.ShiftBuffers (Offset, Distance : longint);
  1303. Var Temp : Pointer;
  1304. MoveSize : Longint;
  1305. Procedure ShiftBuffersUp;
  1306. begin
  1307. {$ifdef DSDEBUG}
  1308. writeln ('Shifting buffers up from ',OffSet,' with distance :',Distance);
  1309. writeln ('Moving ',(FBufferCount-Distance), ' Buffers at ',Distance);
  1310. {$endif}
  1311. Move(FBuffers[Offset],Temp^,MoveSize);
  1312. Move(FBuffers[Offset+Distance],FBuffers[Offset],(FBufferCount-Distance-Offset)*SizeOf(Pchar));
  1313. Move(Temp^,FBuffers[FBufferCount-Distance-Offset],MoveSize);
  1314. end;
  1315. Procedure ShiftBuffersDown;
  1316. begin
  1317. // Distance is NEGATIVE
  1318. {$ifdef DSDEBUG}
  1319. writeln ('Shifting buffers down with distance :',Abs(Distance));
  1320. writeln ('Moving ',Movesize div 4,' Buffers at ',FBufferCount+Distance);
  1321. {$endif}
  1322. Move(FBuffers[FbufferCount+Distance],Temp^ ,MoveSize);
  1323. Move(FBuffers[0],FBuffers[Abs(Distance)],(FBufferCount+Distance)*SizeOf(Pchar));
  1324. Move(Temp^ ,FBuffers[0],MoveSize);
  1325. end;
  1326. begin
  1327. If Abs(Distance)>=BufferCount then
  1328. Exit;
  1329. try
  1330. MoveSize:=SizeOf(Pchar)*Abs(Distance);
  1331. GetMem(Temp,MoveSize);
  1332. If Distance<0 Then
  1333. ShiftBuffersDown
  1334. else If Distance>0 then
  1335. ShiftBuffersUp;
  1336. Finally
  1337. FreeMem(temp);
  1338. end;
  1339. end;
  1340. Procedure TDataset.UnRegisterDataSource(ADatasource : TDatasource);
  1341. begin
  1342. FDataSources.Remove(ADataSource);
  1343. end;
  1344. {
  1345. $Log$
  1346. Revision 1.7 2003-02-20 19:25:19 michael
  1347. + Fixes from Jesus Reyes
  1348. Revision 1.6 2002/09/07 15:15:22 peter
  1349. * old logs removed and tabs fixed
  1350. }