{ --------------------------------------------------------------------- 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 ABufferCount 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;