cxdbdata.pas

来自「胜天进销存源码,国产优秀的进销存」· PAS 代码 · 共 1,895 行 · 第 1/5 页

PAS
1,895
字号
  end;
  {$ENDIF}
  Provider.LayoutChanged([lcStructure, lcData]);
  {$IFDEF DELPHI7}
  FLayoutChangedFlag := False;
  {$ENDIF}
end;

procedure TcxDBDataLink.RecordChanged(Field: TField);
begin
  Provider.RecordChanged(Field);
end;

procedure TcxDBDataLink.UpdateData;
begin
  Provider.DoUpdateData;
  // A2136!!!
//  if Provider.IsSmartRefresh then
    RecordChanged(nil);
  Provider.ResetChanging;
end;

procedure TcxDBDataLink.DoInsertingRecord;
begin
  Provider.FInInserting := True;
  try
    Provider.InsertingRecord(Provider.IsEOF and not Provider.FInsertOperation);
  finally
    Provider.FInInserting := False;
  end;
end;

{ TcxDBDataAssignedFieldNames }

constructor TcxDBDataAssignedFields.Create;
begin
  inherited;
  FFields := TList.Create;
end;

destructor TcxDBDataAssignedFields.Destroy;
begin
  FFields.Free;
  FFields := nil;
  inherited Destroy;
end;

procedure TcxDBDataAssignedFields.AddField(AField: TField);
begin
  if FFields.IndexOf(AField) = -1 then
    FFields.Add(AField);
end;

procedure TcxDBDataAssignedFields.AddFieldsByFieldList(AFieldList: TList);
var
  I: Integer;
begin
  for I := 0 to AFieldList.Count - 1 do
    if AFieldList[I] <> nil then
      FFields.Add(AFieldList[I]);
end;

procedure TcxDBDataAssignedFields.AddFieldsByFieldNames(ADataSet: TDataSet; const AFieldNames: string);
begin
    ADataSet.GetFieldList(FFields, AFieldNames);
end;

procedure TcxDBDataAssignedFields.Clear;
begin
  FFields.Clear;
end;

function TcxDBDataAssignedFields.IsEmpty: Boolean;
begin
  Result := FFields.Count = 0;
end;

function TcxDBDataAssignedFields.IsFieldExists(AField: TField): Boolean;
begin
  Result := FFields.IndexOf(AField) <> -1;
end;

{ TcxDBDataProvider }

constructor TcxDBDataProvider.Create(ADataController: TcxCustomDataController);
begin
  inherited Create(ADataController);
  FAssignedFields := TcxDBDataAssignedFields.Create;
  if DBDataProviders = nil then
    DBDataProviders := TList.Create;
  DBDataProviders.Add(Self);
  FDataLink := TcxDBDataLink.Create(Self);
  FUpdatingRecordIndex := cxNullEditingRecordIndex;
  FUpdatingNewRecordIndex := -1;
  FListeners := TList.Create;
end;

destructor TcxDBDataProvider.Destroy;
begin
  RemoveFromListeners;
  FListeners.Free;
  FListeners := nil;
  FDataLink.Free;
  FDataLink := nil;
  DBDataProviders.Remove(Self);
  if DBDataProviders.Count = 0 then
  begin
    DBDataProviders.Free;
    DBDataProviders := nil;
  end;
  FAssignedFields.Free;
  FAssignedFields := nil;
  inherited Destroy;
end;

function TcxDBDataProvider.IsCanInitEditingBusy: Boolean;
var
  I: Integer;
  ADBDataProvider: TcxDBDataProvider;
begin
  Result := False;
  for I := 0 to DBDataProviders.Count - 1 do
  begin
    ADBDataProvider := TcxDBDataProvider(DBDataProviders[I]);
    if (ADBDataProvider.DataSet = Self.DataSet) and
      ADBDataProvider.FInCanInitEditing then
    begin
      Result := True;
      Break;
    end;
  end;
end;

function TcxDBDataProvider.IsDataSetBusy: Boolean;
var
  I: Integer;
  ADBDataProvider: TcxDBDataProvider;
begin
  Result := False;
  for I := 0 to DBDataProviders.Count - 1 do
  begin
    ADBDataProvider := TcxDBDataProvider(DBDataProviders[I]);
    if {(ADBDataProvider <> Self) and}
      (ADBDataProvider.DataSet = Self.DataSet) and
       ((ADBDataProvider.LockCount <> 0) or ADBDataProvider.FInNotify or
        ((Self.IsKeyNavigation or Self.DataController.IsGridMode) and (ADBDataProvider.LocateCount <> 0))) then
    begin
      if ADBDataProvider.FInNotify then
      begin
        if not FPostLocateFlag then
          Result := True;
      end
      else
        if not FPostLocateFlag then
        begin
          Result := True;
          if Self.DataController.IsGridMode and (Self.DataController.LockGridModeNotifyCount <> 0) then
            Result := False;
        end;
      Break;
    end;
  end;
end;

function TcxDBDataProvider.IsDetailDataSetBusy: Boolean;
var
  I: Integer;
  ADBDataProvider: TcxDBDataProvider;
begin
  Result := False;
  for I := 0 to DBDataProviders.Count - 1 do
  begin
    ADBDataProvider := TcxDBDataProvider(DBDataProviders[I]);
    if (ADBDataProvider.DataSet = Self.DataSet) and
      ((ADBDataProvider.LockCount <> 0){ or ADBDataProvider.FInFirst}) and
      ADBDataProvider.DataController.IsDetailMode {ADBDataProvider.FInFirst} then
    begin
      Result := True;
      Break;
    end;
  end;
end;

function TcxDBDataProvider.IsOtherDataControllerUpdating: Boolean;
var
  I: Integer;
  ADBDataProvider: TcxDBDataProvider;
begin
  Result := False;
  for I := 0 to DBDataProviders.Count - 1 do
  begin
    ADBDataProvider := TcxDBDataProvider(DBDataProviders[I]);
    if (ADBDataProvider <> Self) and
      (ADBDataProvider.DataSet = Self.DataSet) and
      ((ADBDataProvider.LockCount <> 0) or
       (Self.IsKeyNavigation and (ADBDataProvider.LocateCount <> 0))) then
    begin
      if ADBDataProvider.DataController.LockGridModeNotifyCount = 0 then
        ADBDataProvider.AddListener(Self);
      Result := True;
      Break;
    end;
  end;
end;

function TcxDBDataProvider.IsOtherDetailDataSetInInsert: Boolean;
var
  I: Integer;
  ADBDataProvider: TcxDBDataProvider;
begin
  Result := False;
  for I := 0 to DBDataProviders.Count - 1 do
  begin
    ADBDataProvider := TcxDBDataProvider(DBDataProviders[I]);
    if (ADBDataProvider <> Self) and (ADBDataProvider.DataSet = Self.DataSet) and
      ADBDataProvider.FInInsert then
    begin
      Result := True;
      Break;
    end;
  end;
end;

function TcxDBDataProvider.IsOtherDetailChanged: Boolean;
begin
  Result := DataController.IsOtherDetailChanged;
end;

function TcxDBDataProvider.IsUniDirectional: Boolean;
begin
  {$IFDEF DELPHI6}
  if Assigned(DataSet) and DataSet.IsUniDirectional then
    Result := True
  else
  {$ENDIF}
    Result := False;
end;

function TcxDBDataProvider.IsCustomDataSourceSupported: Boolean;
begin
  Result := False;
end;

function TcxDBDataProvider.IsGridMode: Boolean;
begin
  Result := DataController.DataModeController.GridMode and
    not IsUniDirectional and not FLoadAllNeeded and
    {not DataController.IsDetailMode}
    (DataController.DetailMode <> dcdmPattern);
end;

function TcxDBDataProvider.IsDataSource: Boolean;
begin
  Result := (DataSet <> nil) and (DataSet.State <> dsInactive);
end;

function TcxDBDataProvider.IsKeyNavigation: Boolean;
begin
  Result := DataController.IsKeyNavigation;
end;

function TcxDBDataProvider.IsOtherInsert: Boolean;
var
  I: Integer;
  ADBDataProvider: TcxDBDataProvider;
begin
  Result := False;
  for I := 0 to DBDataProviders.Count - 1 do
  begin
    ADBDataProvider := TcxDBDataProvider(DBDataProviders[I]);
    if (ADBDataProvider <> Self) and
      (ADBDataProvider.DataSet = Self.DataSet) and ADBDataProvider.FInInsert then
    begin
      Result := True;
      Break;
    end;
  end;
end;

function TcxDBDataProvider.IsSyncInsert: Boolean;
begin
  Result := not DataController.IsPattern and
    DataController.DataModeController.SyncInsert and
    IsSyncMode;
end;

function TcxDBDataProvider.IsSyncMode: Boolean;
begin
  Result := Assigned(DataSet) and DataSet.Active and
    (IsGridMode or DataController.DataModeController.SyncMode) and
    not IsUniDirectional;
  if DataController.IsDetailMode then
  begin
    if not DataController.DataModeController.DetailInSyncMode then
      Result := False
    else
      if DataController.DataModeController.DetailInSQLMode then
      begin
        if not IsDataSetCurrent then
          Result := False;
      end
      else
        if not (IsKeyNavigation or IsGridMode) then
          Result := False;
  end;
end;

function TcxDBDataProvider.DataSet_ActiveRecord: Integer;
begin
  Result := TDataSetAccess(DataSet).ActiveRecord;
end;

function TcxDBDataProvider.DataSet_BookmarkAvailable: Boolean;
begin
  Result := TDataSetAccess(DataSet).BookmarkAvailable;
end;

function TcxDBDataProvider.DataSet_BufferCount: Integer;
begin
  Result := TDataSetAccess(DataSet).BufferCount;
end;

function TcxDBDataProvider.IsActive: Boolean;
begin
  Result := Assigned(DataSet) and DataSet.Active; // WARNING: DataLink.Active <> DataSet.Active!
  Result := Result and not DataSet.ControlsDisabled;
end;

function TcxDBDataProvider.IsActiveDataSet: Boolean;
begin
  Result := Assigned(DataSet) and (DataSet.FieldCount > 0) and
    (DataSet.Active or not DataSet.DefaultFields);
end;

function TcxDBDataProvider.IsBOF: Boolean;
begin
  if Assigned(DataSet) then
    Result := DataSet.BOF or not DataLink.Active
  else
    Result := inherited IsBOF;
end;

function TcxDBDataProvider.IsChanging: Boolean;
begin
  Result := inherited IsChanging;
end;

function TcxDBDataProvider.IsEditing: Boolean;
begin
  if IsUnboundColumnMode then
    Result := inherited IsEditing
  else
    Result := Assigned(DataSet) and (DataSet.State in dsEditModes);
end;

function TcxDBDataProvider.IsEOF: Boolean;
begin
  if Assigned(DataSet) then
  begin
    with DataController do
    begin
      if IsDetailMode and not IsGridMode then
      begin
        if not VarIsEmpty(MasterDetailKeyValues) then
          Result := DataSet.EOF or
            (not (DataSet.State in dsEditModes) and
             not VarEquals(GetDataSetValues(DataSet, MasterDetailKeyFields), MasterDetailKeyValues))
        else
          Result := True;
      end                              
      else
        Result := DataSet.EOF or not DataLink.Active;
    end;
  end
  else
    Result := inherited IsEOF;
end;

function TcxDBDataPr

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?