cxdb.pas
来自「胜天进销存源码,国产优秀的进销存」· PAS 代码 · 共 874 行 · 第 1/2 页
PAS
874 行
var
I: Integer;
AItem: TcxDBAdapterItem;
begin
Result := False;
for I := FItems.Count - 1 downto 0 do
begin
AItem := TcxDBAdapterItem(FItems[I]);
if ADataSetClass.InheritsFrom(AItem.DataSetClass) then
begin
AIndex := I;
Result := True;
Break;
end
else
if AItem.DataSetClass.InheritsFrom(ADataSetClass) then
AIndex := I;
end;
end;
procedure TcxDBAdapterList.RegisterAdapter(ADataSetClass: TDataSetClass;
AItemClass: TcxDBAdapterItemClass);
var
AIndex: Integer;
begin
AIndex := -1;
if FindAdapter(ADataSetClass, AIndex) then
FItems.Insert(AIndex + 1, AItemClass.Create(ADataSetClass))
else
if AIndex <> -1 then
FItems.Insert(AIndex, AItemClass.Create(ADataSetClass))
else
FItems.Add(AItemClass.Create(ADataSetClass));
end;
procedure TcxDBAdapterList.UnregisterAdapter(ADataSetClass: TDataSetClass;
AItemClass: TcxDBAdapterItemClass);
var
I: Integer;
AItem: TcxDBAdapterItem;
begin
for I := FItems.Count - 1 downto 0 do
begin
AItem := TcxDBAdapterItem(FItems[I]);
if (AItem.DataSetClass = ADataSetClass) and (AItem.ClassType = AItemClass) then
begin
AItem.Free;
FItems.Delete(I);
end;
end;
end;
function TcxDBAdapterList.GetItem(Index: Integer): TcxDBAdapterItem;
begin
Result := TcxDBAdapterItem(FItems[Index]);
end;
function TcxDBAdapterList.GetItemCount: Integer;
begin
Result := FItems.Count;
end;
{ TcxCustomFieldDataLink }
constructor TcxCustomFieldDataLink.Create(ADataBinding: TcxCustomDBDataBinding);
begin
inherited Create;
VisualControl := False;
FDataBinding := ADataBinding;
end;
function TcxCustomFieldDataLink.Edit: Boolean;
begin
if CanModify then
inherited Edit;
Result := FEditing;
end;
procedure TcxCustomFieldDataLink.Modified;
begin
FModified := True;
end;
procedure TcxCustomFieldDataLink.Reset;
begin
RecordChanged(nil);
end;
procedure TcxCustomFieldDataLink.ActiveChanged;
begin
UpdateField;
FDataBinding.DataSetChange;
end;
procedure TcxCustomFieldDataLink.DataEvent(Event: TDataEvent;
Info: Longint);
begin
if Event = deDataSetChange then
UpdateField;
inherited DataEvent(Event, Info);
if Event = deDataSetChange then
FDataBinding.DataSetChange;
end;
procedure TcxCustomFieldDataLink.EditingChanged;
begin
SetEditing(inherited Editing and CanModify);
end;
(*procedure TcxCustomFieldDataLink.FocusControl(Field: TFieldRef);
begin
if (Field^ <> nil) and (Field^ = FField) and (FDataComponent is TWinControl) then
if TWinControl(FDataComponent).CanFocus then
begin
Field^ := nil;
TWinControl(FDataComponent).SetFocus;
end;
end;*)
procedure TcxCustomFieldDataLink.LayoutChanged;
begin
UpdateField;
end;
procedure TcxCustomFieldDataLink.RecordChanged(Field: TField);
begin
if (Field = nil) or (Field = FField) then
begin
FDataBinding.InternalDataChange;
if not FDataBinding.IsRefreshDisabled then
FModified := False;
end;
end;
procedure TcxCustomFieldDataLink.UpdateData;
begin
if FModified then
begin
if Field <> nil then
FDataBinding.UpdateData;
if not FDataBinding.IsRefreshDisabled then
FModified := False;
end;
end;
procedure TcxCustomFieldDataLink.DataComponentChanged;
begin
end;
procedure TcxCustomFieldDataLink.UpdateRightToLeft;
begin
end;
procedure TcxCustomFieldDataLink.VisualControlChanged;
begin
end;
function TcxCustomFieldDataLink.GetCanModify: Boolean;
begin
Result := not ReadOnly and (Field <> nil) and (Field.CanModify or
(Field.Lookup and CanModifyLookupField(Field)));
end;
function TcxCustomFieldDataLink.GetDataComponent: TComponent;
begin
Result := FDataBinding.DataComponent;
end;
procedure TcxCustomFieldDataLink.SetEditing(Value: Boolean);
begin
if FEditing <> Value then
begin
FEditing := Value;
if not FDataBinding.IsRefreshDisabled then
FModified := False;
end;
end;
procedure TcxCustomFieldDataLink.SetField(Value: TField);
begin
if FField <> Value then
begin
FField := Value;
FDataBinding.DataSetChange;
EditingChanged;
RecordChanged(nil);
UpdateRightToLeft;
end;
end;
procedure TcxCustomFieldDataLink.SetFieldName(const Value: string);
begin
if FFieldName <> Value then
begin
FFieldName := Value;
UpdateField;
end;
end;
procedure TcxCustomFieldDataLink.UpdateField;
begin
if Active and (FFieldName <> '') then
begin
FField := nil;
if Assigned(DataComponent) then
SetField(GetFieldProperty(DataSource.DataSet, DataComponent, FFieldName))
else
SetField(DataSource.DataSet.FieldByName(FFieldName));
end
else
SetField(nil);
end;
{ TcxCustomDBDataBinding }
constructor TcxCustomDBDataBinding.Create(AOwner, ADataComponent: TComponent);
begin
inherited Create(AOwner, ADataComponent);
FDataLink := GetDataLinkClass.Create(Self);
// TODO SetReplicatable
end;
destructor TcxCustomDBDataBinding.Destroy;
begin
FDataLink.Free;
inherited Destroy;
end;
function TcxCustomDBDataBinding.CanModify: Boolean;
begin
Result := IsDataSourceLive and not Field.ReadOnly;
Result := Result and (Field.CanModify or (Field.Lookup and CanModifyLookupField(Field)));
end;
function TcxCustomDBDataBinding.ExecuteAction(Action: TBasicAction): Boolean;
begin
Result := FDataLink.ExecuteAction(Action);
end;
function TcxCustomDBDataBinding.IsControlReadOnly: Boolean;
begin
Result := ReadOnly;
if not Result and IsDataSourceLive then
Result := Field.ReadOnly;
end;
function TcxCustomDBDataBinding.IsDataSourceLive: Boolean;
begin
Result := (FDataLink.FField <> nil) and (FDataLink.FField <> nil) and
(FDataLink.FField.DataSet.State <> dsInactive);
end;
function TcxCustomDBDataBinding.IsDataStorage: Boolean;
begin
Result := True;
end;
procedure TcxCustomDBDataBinding.Reset;
begin
FDataLink.Reset;
end;
function TcxCustomDBDataBinding.SetEditMode: Boolean;
begin
Result := inherited SetEditMode;
if not Result then
Exit;
DisableRefresh;
try
FDatalink.Edit;
Result := FDatalink.Editing;
if Result then
FDatalink.Modified;
finally
EnableRefresh;
end;
end;
procedure TcxCustomDBDataBinding.UpdateDataSource;
begin
FDataLink.UpdateRecord;
end;
function TcxCustomDBDataBinding.GetModified: Boolean;
begin
Result := IsDataSourceLive and FDataLink.Editing and FDataLink.FModified;
end;
function TcxCustomDBDataBinding.GetReadOnly: Boolean;
begin
Result := FDataLink.ReadOnly;
end;
function TcxCustomDBDataBinding.GetStoredValue(AValueSource: TcxDataEditValueSource;
AFocused: Boolean): Variant;
begin
if not IsDataSourceLive or (Field.IsNull and (AValueSource <> evsText)) then
Result := Null
else
case AValueSource of
evsKey:
if Field.KeyFields <> '' then
Result := Field.DataSet.FieldValues[Field.KeyFields]
else
Result := Field.Value;
evsText:
if AFocused and FDataLink.CanModify then
Result := Field.Text
else
Result := Field.DisplayText;
else {evsValue:}
Result := Field.Value;
end;
end;
procedure TcxCustomDBDataBinding.SetReadOnly(Value: Boolean);
begin
if Value <> ReadOnly then
begin
FDataLink.ReadOnly := Value;
DataSetChange;
end;
end;
procedure TcxCustomDBDataBinding.VisualControlChanged;
begin
FDataLink.VisualControlChanged;
end;
procedure TcxCustomDBDataBinding.SetStoredValue(AValueSource: TcxDataEditValueSource;
const Value: Variant);
procedure SetFieldValueEx(AField: TField; const AValue: Variant);
begin
if VarIsStr(Value) and (Value = '') and not(Field.DataType in [ftString{$IFDEF DELPHI4}, ftWideString{$ENDIF}]) then
AField.Value := Null
else
AField.Value := Value;
end;
var
AFieldList: TList;
I: Integer;
begin
if IsDataSourceLive then
begin
DisableRefresh;
try
if FDataLink.Edit then
begin
if (*(*)AValueSource = evsText(*) or Assigned(Field.OnSetText)*) then
Field.Text := VarToStr(Value)
else
if (AValueSource = evsKey) and (Field.KeyFields <> '') then
if Pos(';', Field.KeyFields) = 0 then
SetFieldValueEx(Field.DataSet.FieldByName(Field.KeyFields), Value)
else
begin
AFieldList := TList.Create;
try
Field.DataSet.GetFieldList(AFieldList, Field.KeyFields);
for I := 0 to AFieldList.Count - 1 do
SetFieldValueEx(TField(AFieldList[I]), Value[I]);
finally
AFieldList.Free;
end;
Field.DataSet.FieldValues[Field.KeyFields] := Value;
end
else
SetFieldValueEx(Field, Value);
end;
finally
EnableRefresh;
end;
end;
end;
function TcxCustomDBDataBinding.UpdateAction(Action: TBasicAction): Boolean;
begin
Result := FDataLink.UpdateAction(Action);
end;
procedure TcxCustomDBDataBinding.DisableRefresh;
begin
Inc(FRefreshCount);
end;
procedure TcxCustomDBDataBinding.EnableRefresh;
begin
if FRefreshCount > 0 then
Dec(FRefreshCount);
end;
function TcxCustomDBDataBinding.GetDataLinkClass: TcxCustomFieldDataLinkClass;
begin
Result := TcxCustomFieldDataLink;
end;
function TcxCustomDBDataBinding.IsRefreshDisabled: Boolean;
begin
Result := FRefreshCount > 0;
end;
function TcxCustomDBDataBinding.GetDataField: string;
begin
Result := FDataLink.FieldName;
end;
function TcxCustomDBDataBinding.GetDataSource: TDataSource;
begin
Result := FDataLink.DataSource;
end;
function TcxCustomDBDataBinding.GetField: TField;
begin
Result := FDataLink.Field;
end;
procedure TcxCustomDBDataBinding.InternalDataChange;
begin
if not IsRefreshDisabled then
DataChange;
end;
procedure TcxCustomDBDataBinding.SetDataField(const Value: string);
begin
FDataLink.FieldName := Value;
end;
procedure TcxCustomDBDataBinding.SetDataSource(Value: TDataSource);
begin
FDataLink.DataSource := Value;
end;
end.
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?