mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-13 10:59:18 +02:00
* merged from 1.0.x
This commit is contained in:
parent
32b9cdb7cf
commit
547300c891
497
fcl/db/datasource.inc
Normal file
497
fcl/db/datasource.inc
Normal file
@ -0,0 +1,497 @@
|
|||||||
|
{ ---------------------------------------------------------------------
|
||||||
|
TDatalink
|
||||||
|
---------------------------------------------------------------------}
|
||||||
|
|
||||||
|
Constructor TDataLink.Create;
|
||||||
|
|
||||||
|
begin
|
||||||
|
Inherited Create;
|
||||||
|
FBufferCount:=1;
|
||||||
|
FDatasourceFixed:=False;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
Destructor TDataLink.Destroy;
|
||||||
|
|
||||||
|
begin
|
||||||
|
Factive:=False;
|
||||||
|
FEditing:=False;
|
||||||
|
FDataSourceFixed:=False;
|
||||||
|
DataSource:=Nil;
|
||||||
|
Inherited Destroy;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
Procedure TDataLink.ActiveChanged;
|
||||||
|
|
||||||
|
begin
|
||||||
|
end;
|
||||||
|
|
||||||
|
Procedure TDataLink.CheckActiveAndEditing;
|
||||||
|
|
||||||
|
Var
|
||||||
|
B : Boolean;
|
||||||
|
|
||||||
|
begin
|
||||||
|
B:=Assigned(DataSource) and (DataSource.State<>dsInactive);
|
||||||
|
If B<>FActive then
|
||||||
|
begin
|
||||||
|
FActive:=B;
|
||||||
|
ActiveChanged;
|
||||||
|
end;
|
||||||
|
B:=Assigned(DataSource) and (DataSource.State in dsEditModes) and Not FReadOnly;
|
||||||
|
If B<>FEditing Then
|
||||||
|
begin
|
||||||
|
FEditing:=B;
|
||||||
|
EditingChanged;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
Procedure TDataLink.CheckBrowseMode;
|
||||||
|
|
||||||
|
begin
|
||||||
|
end;
|
||||||
|
|
||||||
|
Function TDataLink.CalcFirstRecord(Index : Integer) : Integer;
|
||||||
|
|
||||||
|
{ recalculates index of first record in buffer,
|
||||||
|
and returns number of record scrolled.}
|
||||||
|
|
||||||
|
Var
|
||||||
|
A, // Index of active record in buffer
|
||||||
|
F, // Index of current first record in buffer
|
||||||
|
L : Integer; // index of Last (for us) record in buffer;
|
||||||
|
|
||||||
|
begin
|
||||||
|
A:=DataSource.DataSet.FActiveRecord;
|
||||||
|
F:=FFirstRecord+Index;
|
||||||
|
L:=F+FBufferCount-1;
|
||||||
|
If A>L Then
|
||||||
|
Result:=A-L
|
||||||
|
else If A<F Then
|
||||||
|
Result:=A-F;
|
||||||
|
FFirstRecord:=F+Result;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
Procedure TDataLink.DataEvent(Event: TDataEvent; Info: Longint);
|
||||||
|
|
||||||
|
|
||||||
|
begin
|
||||||
|
Case Event of
|
||||||
|
deFieldChange,
|
||||||
|
deRecordChange :
|
||||||
|
If Not FUpdatingRecord then
|
||||||
|
RecordChanged(TField(Info));
|
||||||
|
deDataSetChange:
|
||||||
|
begin
|
||||||
|
CalcFirstRecord(Info);
|
||||||
|
DatasetChanged;
|
||||||
|
end;
|
||||||
|
deDataSetScroll:
|
||||||
|
DatasetScrolled(CalcFirstRecord(Info));
|
||||||
|
deLayoutChange:
|
||||||
|
begin
|
||||||
|
CalcFirstRecord(Info);
|
||||||
|
LayoutChanged;
|
||||||
|
end;
|
||||||
|
deUpdateRecord:
|
||||||
|
UpdateRecord;
|
||||||
|
deUpdateState:
|
||||||
|
CheckActiveAndEditing;
|
||||||
|
deCheckBrowseMode:
|
||||||
|
CheckBrowseMode;
|
||||||
|
deFocusControl:
|
||||||
|
FocusControl(TFieldRef(Info));
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
Procedure TDataLink.DataSetChanged;
|
||||||
|
|
||||||
|
begin
|
||||||
|
RecordChanged(Nil);
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
Procedure TDataLink.DataSetScrolled(Distance: Integer);
|
||||||
|
|
||||||
|
begin
|
||||||
|
DataSetChanged;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
Procedure TDataLink.EditingChanged;
|
||||||
|
|
||||||
|
begin
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
Procedure TDataLink.FocusControl(Field: TFieldRef);
|
||||||
|
|
||||||
|
begin
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
Function TDataLink.GetActiveRecord: Integer;
|
||||||
|
|
||||||
|
begin
|
||||||
|
Result:=Dataset.FActiveRecord;
|
||||||
|
end;
|
||||||
|
|
||||||
|
Function TDatalink.GetDataSet : TDataset;
|
||||||
|
|
||||||
|
begin
|
||||||
|
Result:=FDataSource.DataSet
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
Function TDataLink.GetBOF: Boolean;
|
||||||
|
|
||||||
|
begin
|
||||||
|
Result:=DataSet.BOF
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
Function TDataLink.GetBufferCount: Integer;
|
||||||
|
|
||||||
|
begin
|
||||||
|
Result:=FBufferCount;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
Function TDataLink.GetEOF: Boolean;
|
||||||
|
|
||||||
|
begin
|
||||||
|
Result:=DataSet.EOF
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
Function TDataLink.GetRecordCount: Integer;
|
||||||
|
|
||||||
|
Var D : TDataSet;
|
||||||
|
|
||||||
|
begin
|
||||||
|
Result:=Dataset.RecordCount;
|
||||||
|
If Result>BufferCount then
|
||||||
|
Result:=BufferCount;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
Procedure TDataLink.LayoutChanged;
|
||||||
|
|
||||||
|
begin
|
||||||
|
DataSetChanged;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
Function TDataLink.MoveBy(Distance: Integer): Integer;
|
||||||
|
|
||||||
|
begin
|
||||||
|
DataSet.MoveBy(Distance);
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
Procedure TDataLink.RecordChanged(Field: TField);
|
||||||
|
|
||||||
|
begin
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
Procedure TDataLink.SetActiveRecord(Value: Integer);
|
||||||
|
|
||||||
|
begin
|
||||||
|
Dataset.FActiveRecord:=Value;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
Procedure TDataLink.SetBufferCount(Value: Integer);
|
||||||
|
|
||||||
|
begin
|
||||||
|
If FBUfferCount<>Value then
|
||||||
|
begin
|
||||||
|
FBufferCount:=Value;
|
||||||
|
Dataset.SetBufListSize(Value);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
Procedure TDataLink.SetDataSource(Value : TDatasource);
|
||||||
|
|
||||||
|
begin
|
||||||
|
if not FDataSourceFixed then
|
||||||
|
begin
|
||||||
|
if Assigned(DataSource) then
|
||||||
|
DataSource.UnregisterDatalink(Self);
|
||||||
|
FDataSource := Value;
|
||||||
|
if Assigned(DataSource) then
|
||||||
|
DataSource.RegisterDatalink(Self);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
Procedure TDatalink.SetReadOnly(Value : Boolean);
|
||||||
|
|
||||||
|
begin
|
||||||
|
If FReadOnly<>Value then
|
||||||
|
begin
|
||||||
|
FReadOnly:=Value;
|
||||||
|
CheckActiveAndEditing;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
Procedure TDataLink.UpdateData;
|
||||||
|
|
||||||
|
begin
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Function TDataLink.Edit: Boolean;
|
||||||
|
|
||||||
|
begin
|
||||||
|
If Not FReadOnly then
|
||||||
|
DataSource.Edit;
|
||||||
|
// Triggered event will set FEditing
|
||||||
|
Result:=FEditing;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
Procedure TDataLink.UpdateRecord;
|
||||||
|
|
||||||
|
begin
|
||||||
|
FUpdatingRecord:=True;
|
||||||
|
Try
|
||||||
|
UpdateData;
|
||||||
|
finally
|
||||||
|
FUpdatingRecord:=False;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{ ---------------------------------------------------------------------
|
||||||
|
TDetailDataLink
|
||||||
|
---------------------------------------------------------------------}
|
||||||
|
|
||||||
|
Function TDetailDataLink.GetDetailDataSet: TDataSet;
|
||||||
|
|
||||||
|
begin
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
{ ---------------------------------------------------------------------
|
||||||
|
TMasterDataLink
|
||||||
|
---------------------------------------------------------------------}
|
||||||
|
|
||||||
|
constructor TMasterDataLink.Create(ADataSet: TDataSet);
|
||||||
|
|
||||||
|
begin
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
destructor TMasterDataLink.Destroy;
|
||||||
|
|
||||||
|
begin
|
||||||
|
inherited Destroy;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
Procedure TMasterDataLink.ActiveChanged;
|
||||||
|
|
||||||
|
begin
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
Procedure TMasterDataLink.CheckBrowseMode;
|
||||||
|
|
||||||
|
begin
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
Function TMasterDataLink.GetDetailDataSet: TDataSet;
|
||||||
|
|
||||||
|
begin
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
Procedure TMasterDataLink.LayoutChanged;
|
||||||
|
|
||||||
|
begin
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
Procedure TMasterDataLink.RecordChanged(Field: TField);
|
||||||
|
|
||||||
|
begin
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TMasterDatalink.SetFieldNames(const Value: string);
|
||||||
|
|
||||||
|
begin
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
{ ---------------------------------------------------------------------
|
||||||
|
TDatasource
|
||||||
|
---------------------------------------------------------------------}
|
||||||
|
|
||||||
|
Constructor TDataSource.Create(AOwner: TComponent);
|
||||||
|
|
||||||
|
begin
|
||||||
|
Inherited Create(AOwner);
|
||||||
|
FDatalinks:=TList.Create;
|
||||||
|
FEnabled:=True;
|
||||||
|
FAutoEdit:=True;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
Destructor TDataSource.Destroy;
|
||||||
|
|
||||||
|
begin
|
||||||
|
FOnStateCHange:=Nil;
|
||||||
|
Dataset:=Nil;
|
||||||
|
With FDataLinks do
|
||||||
|
While Count>0 do
|
||||||
|
TDatalink(Items[Count - 1]).DataSource:=Nil;
|
||||||
|
FDatalinks.Free;
|
||||||
|
inherited Destroy;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
Procedure TDatasource.Edit;
|
||||||
|
|
||||||
|
begin
|
||||||
|
If (State=dsBrowse) and AutoEdit Then
|
||||||
|
Dataset.Edit;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
Function TDataSource.IsLinkedTo(ADataSet: TDataSet): Boolean;
|
||||||
|
|
||||||
|
begin
|
||||||
|
Result:=False;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
procedure TDatasource.DistributeEvent(Event: TDataEvent; Info: Longint);
|
||||||
|
|
||||||
|
|
||||||
|
Var
|
||||||
|
i : Longint;
|
||||||
|
|
||||||
|
begin
|
||||||
|
With FDatalinks do
|
||||||
|
begin
|
||||||
|
For I:=0 to Count-1 do
|
||||||
|
With TDatalink(Items[i]) do
|
||||||
|
If Not VisualControl Then
|
||||||
|
DataEvent(Event,Info);
|
||||||
|
For I:=0 to Count-1 do
|
||||||
|
With TDatalink(Items[i]) do
|
||||||
|
If VisualControl Then
|
||||||
|
DataEvent(Event,Info);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TDatasource.RegisterDataLink(DataLink: TDataLink);
|
||||||
|
|
||||||
|
begin
|
||||||
|
FDatalinks.Add(DataLink);
|
||||||
|
If DataSet<>Nil then
|
||||||
|
Dataset.SetBufListSize(Datalink.BufferCount);
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
procedure TDatasource.SetDataSet(ADataSet: TDataSet);
|
||||||
|
|
||||||
|
begin
|
||||||
|
If FDataset<>Nil Then
|
||||||
|
FDataset.UnRegisterDataSource(Self);
|
||||||
|
If ADataset<>Nil Then
|
||||||
|
ADataset.RegisterDatasource(Self);
|
||||||
|
FDataSet:=ADAtaset;
|
||||||
|
ProcessEvent(deUpdateState,0);
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
procedure TDatasource.SetEnabled(Value: Boolean);
|
||||||
|
|
||||||
|
begin
|
||||||
|
FEnabled:=Value;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
Procedure TDatasource.DoDataChange (Info : Pointer);
|
||||||
|
|
||||||
|
begin
|
||||||
|
If Assigned(OnDataChange) Then
|
||||||
|
OnDataChange(Self,TField(Info));
|
||||||
|
end;
|
||||||
|
|
||||||
|
Procedure TDatasource.DoStateChange;
|
||||||
|
|
||||||
|
begin
|
||||||
|
If Assigned(OnStateChange) Then
|
||||||
|
OnStateChange(Self);
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
Procedure TDatasource.DoUpdateData;
|
||||||
|
|
||||||
|
begin
|
||||||
|
If Assigned(OnUpdateData) Then
|
||||||
|
OnUpdateData(Self);
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
procedure TDatasource.UnregisterDataLink(DataLink: TDataLink);
|
||||||
|
|
||||||
|
begin
|
||||||
|
FDatalinks.Remove(Datalink);
|
||||||
|
If Dataset<>Nil then
|
||||||
|
Dataset.SetBufListSize(DataLink.BufferCount);
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
procedure TDataSource.ProcessEvent(Event : TDataEvent; Info : longint);
|
||||||
|
|
||||||
|
Const
|
||||||
|
OnDataChangeEvents = [deRecordChange, deDataSetChange,
|
||||||
|
deDataSetScroll,
|
||||||
|
deLayoutChange,deUpdateState];
|
||||||
|
|
||||||
|
Var
|
||||||
|
NeedDataChange : Boolean;
|
||||||
|
FLastState : TdataSetState;
|
||||||
|
|
||||||
|
begin
|
||||||
|
// Special UpdateState handling.
|
||||||
|
If Event=deUpdateState then
|
||||||
|
begin
|
||||||
|
NeedDataChange:=(FState=dsInactive);
|
||||||
|
FLastState:=FState;
|
||||||
|
If Assigned(Dataset) then
|
||||||
|
FState:=Dataset.State
|
||||||
|
else
|
||||||
|
FState:=dsInactive;
|
||||||
|
// Don't do events if nothing changed.
|
||||||
|
If FState<>FlastState then
|
||||||
|
exit;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
NeedDataChange:=True;
|
||||||
|
DistributeEvent(Event,Info);
|
||||||
|
// Extra handlers
|
||||||
|
If Not (csDestroying in ComponentState) then
|
||||||
|
begin
|
||||||
|
If (Event=deUpdateState) then
|
||||||
|
DoStateChange;
|
||||||
|
If (Event in OnDataChangeEvents) and
|
||||||
|
NeedDataChange Then
|
||||||
|
DoDataChange(Nil);
|
||||||
|
If (Event = deFieldChange) Then
|
||||||
|
DoDataCHange(Pointer(Info));
|
||||||
|
If (Event=deUpdateRecord) then
|
||||||
|
DoUpdateData;
|
||||||
|
end;
|
||||||
|
end;
|
Loading…
Reference in New Issue
Block a user