cxdbedit.pas

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

PAS
2,143
字号
        not AIsRightAligned and AUseRightToLeftAlignment then
          AVisualControl.Perform(CM_RECREATEWND, 0, 0);
    end;
  end;
end;

{ TcxDBDataBinding }

function TcxDBDataBinding.GetDataLinkClass: TcxCustomFieldDataLinkClass;
begin
  Result := TcxDBFieldDataLink;
end;

{ TcxEditFieldDataLink }

constructor TcxEditFieldDataLink.Create(ADataBinding: TcxDBEditDataBinding);
begin
  inherited Create;
  VisualControl := True;
  FDataBinding := ADataBinding;
  FFreeNotifier := TcxFreeNotificator.Create(nil);
  FFreeNotifier.OnFreeNotification := FieldFreeNotification;
end;

destructor TcxEditFieldDataLink.Destroy;
begin
  InternalSetField(nil);
  FreeAndNil(FFreeNotifier);
  inherited Destroy;
end;

function TcxEditFieldDataLink.Edit: Boolean;
begin
  if CanModify then
    inherited Edit;
  Result := FEditing;
end;

procedure TcxEditFieldDataLink.Modified;
begin
  FModified := True;
end;

procedure TcxEditFieldDataLink.Reset;
begin
  RecordChanged(nil);
end;

procedure TcxEditFieldDataLink.ActiveChanged;
begin
  FDataBinding.DefaultValuesProvider.DataSource := DataSource;
  FDataBinding.DisableRefresh;
  try
    UpdateField;
    FDataBinding.DataSetChange;
  finally
    FDataBinding.EnableRefresh;
    FModified := False;
    FDataBinding.DataChanged;
  end;
end;

procedure TcxEditFieldDataLink.DataEvent(Event: TDataEvent;
  Info: Longint);
begin
  inherited DataEvent(Event, Info);
  if Event = deDataSetChange then
  begin
    FDataBinding.DisableRefresh;
    try
      FDataBinding.DataSetChange;
    finally
      FDataBinding.EnableRefresh;
      FModified := False;
    end;
  end;
end;

procedure TcxEditFieldDataLink.EditingChanged;
begin
  SetEditing(inherited Editing and CanModify);
  FDataBinding.EditingChanged;
end;

procedure TcxEditFieldDataLink.FocusControl(Field: TFieldRef);
begin
  if (Field^ <> nil) and (Field^ = FField) and (FControl is TWinControl) then
    if TWinControl(FControl).CanFocus then
    begin
      Field^ := nil;
      TWinControl(FControl).SetFocus;
    end;
end;

procedure TcxEditFieldDataLink.LayoutChanged;
begin
  UpdateField;
end;

procedure TcxEditFieldDataLink.RecordChanged(Field: TField);
begin
  if (Field = nil) or (Field = FMasterField) then
  begin
    FDataBinding.DataChanged;
    if not FDataBinding.IsRefreshDisabled then
      FModified := False;
  end;
end;

procedure TcxEditFieldDataLink.UpdateData;
begin
  if FModified then
  begin
    if Field <> nil then
      FDataBinding.UpdateData;
    if not FDataBinding.IsRefreshDisabled then
      FModified := False;
  end;
end;

procedure TcxEditFieldDataLink.ResetModified;
begin
  FModified := False;
end;

procedure TcxEditFieldDataLink.FieldFreeNotification(Sender: TComponent);
begin
  InternalSetField(nil);
end;

function TcxEditFieldDataLink.GetCanModify: Boolean;
begin
  Result := not ReadOnly and (Field <> nil) and (Field.CanModify or
    (Field.Lookup and CanModifyLookupField(Field)));
end;

procedure TcxEditFieldDataLink.InternalSetField(Value: TField);
begin
  if Value <> FField then
  begin
    if FField <> nil then
      FFreeNotifier.RemoveSender(FField);
    FField := Value;
    if FField <> nil then
      FFreeNotifier.AddSender(FField);
    UpdateMasterField;
  end;
end;

procedure TcxEditFieldDataLink.SetEditing(Value: Boolean);
begin
  if FEditing <> Value then
  begin
    FEditing := Value;
    if not FDataBinding.IsRefreshDisabled then
      FModified := False;
  end;
end;

procedure TcxEditFieldDataLink.SetField(Value: TField);
begin
  if FField <> Value then
  begin
    InternalSetField(Value);
    FDataBinding.DefaultValuesChanged;
    EditingChanged;
    RecordChanged(nil);
    UpdateRightToLeft;
  end;
end;

procedure TcxEditFieldDataLink.SetFieldName(const Value: string);
begin
  if FFieldName <> Value then
  begin
    FFieldName :=  Value;
    UpdateField;
  end;
end;

procedure TcxEditFieldDataLink.UpdateField;
begin
  if Active and (FFieldName <> '') then
  begin
    InternalSetField(nil);
    if Assigned(FControl) then
      SetField(GetFieldProperty(DataSource.DataSet, FControl, FFieldName))
    else
      SetField(DataSource.DataSet.FieldByName(FFieldName));
  end
  else
    SetField(nil);
end;

procedure TcxEditFieldDataLink.UpdateMasterField;
begin
  if FField = nil then
    FMasterField := nil
  else
    if not FDataBinding.IsLookupControl or (FField.FieldKind <> fkLookup) or
      (Pos(';', FField.KeyFields) > 0) then
        FMasterField := FField
    else
      if Assigned(FControl) then
        FMasterField := GetFieldProperty(DataSource.DataSet, FControl,
          FField.KeyFields)
      else
        FMasterField := DataSource.DataSet.FieldByName(FField.KeyFields);
end;

procedure TcxEditFieldDataLink.UpdateRightToLeft;
var
  AIsRightAligned: Boolean;
  AUseRightToLeftAlignment: Boolean;
begin
  if Assigned(FControl) and (FControl is TWinControl) and
    TWinControl(FControl).IsRightToLeft then
  begin
    AIsRightAligned :=
      (GetWindowLong(TWinControl(FControl).Handle, GWL_EXSTYLE) and WS_EX_RIGHT) = WS_EX_RIGHT;
    AUseRightToLeftAlignment :=
      DBUseRightToLeftAlignment(TControl(FControl), Field);
    if (AIsRightAligned and (not AUseRightToLeftAlignment)) or
       ((not AIsRightAligned) and AUseRightToLeftAlignment) then
      TWinControl(FControl).Perform(CM_RECREATEWND, 0, 0);
  end;
end;

{ TcxDBEditDataBinding }

constructor TcxDBEditDataBinding.Create(AEdit: TcxCustomEdit);
begin
  inherited Create(AEdit);
  FDataLink := TcxEditFieldDataLink.Create(Self);
  if AEdit.InnerControl <> nil then
    FDataLink.Control := AEdit.InnerControl
  else
    FDataLink.Control := AEdit;
end;

destructor TcxDBEditDataBinding.Destroy;
begin
  FreeAndNil(FDataLink);
  inherited Destroy;
end;

procedure TcxDBEditDataBinding.Assign(Source: TPersistent);
begin
  if Source is TcxDBTextEditDataBinding then
  begin
    DataField := TcxDBTextEditDataBinding(Source).DataField;
    DataSource := TcxDBTextEditDataBinding(Source).DataSource;
    DataChanged;
  end;
  inherited Assign(Source);
end;

function TcxDBEditDataBinding.CanCheckEditorValue: Boolean;
begin
  Result := False;
end;

function TcxDBEditDataBinding.CanPostEditorValue: Boolean;
begin
  Result := Editing and DataLink.FModified;
end;

function TcxDBEditDataBinding.ExecuteAction(Action: TBasicAction): Boolean;
begin
  Result := FDataLink.ExecuteAction(Action);
end;

class function TcxDBEditDataBinding.GetDefaultValuesProviderClass: TcxCustomEditDefaultValuesProviderClass;
begin
  Result := TcxCustomDBEditDefaultValuesProvider;
end;

procedure TcxDBEditDataBinding.SetModified;
begin
  if Editing then
    DataLink.Modified;
end;

function TcxDBEditDataBinding.UpdateAction(Action: TBasicAction): Boolean;
begin
  Result := FDataLink.UpdateAction(Action);
end;

procedure TcxDBEditDataBinding.UpdateDisplayValue;
begin
  Edit.LockClick(True);
  try
    if IsDataAvailable then
      FDataLink.Reset
    else
      inherited UpdateDisplayValue;
  finally
    Edit.LockClick(False);
  end;
end;

procedure TcxDBEditDataBinding.DefaultValuesChanged;
begin
  DefaultValuesProvider.Field := Field;
  inherited DefaultValuesChanged;
end;

procedure TcxDBEditDataBinding.DisableRefresh;
begin
  Inc(FRefreshCount);
end;

procedure TcxDBEditDataBinding.EnableRefresh;
begin
  if FRefreshCount > 0 then
    Dec(FRefreshCount);
end;

function TcxDBEditDataBinding.GetEditing: Boolean;
begin
  Result := IsDataAvailable and FDataLink.Editing;
end;

function TcxDBEditDataBinding.GetModified: Boolean;
begin
  Result := GetEditing and FDataLink.FModified;
end;

function TcxDBEditDataBinding.GetStoredValue: TcxEditValue;
var
  AEditValueSource: TcxDataEditValueSource;
begin
  AEditValueSource := Edit.ActiveProperties.GetEditValueSource(Edit.InternalFocused);
  if not IsDataAvailable or (Field.IsNull and
    ((AEditValueSource <> evsText) or not Assigned(Field.OnGetText))) then
      Result := Null
  else
  begin
    Result := Null;
    case AEditValueSource of
      evsKey:
        if Field.KeyFields <> '' then
          Result := Field.DataSet.FieldValues[Field.KeyFields]
        else
          Result := Field.Value;
      evsText:
        if Edit.Focused and FDataLink.CanModify then
          Result := Field.Text
        else
          if Field.IsBlob then
            Result := Field.AsString
          else
            Result := Field.DisplayText;
      evsValue:
        Result := Field.Value;
    end;
  end;
end;

function TcxDBEditDataBinding.IsRefreshDisabled: Boolean;
begin
  Result := FRefreshCount > 0;
end;

procedure TcxDBEditDataBinding.Reset;
begin
  if IsDataAvailable then
  begin
    FDataLink.Reset;
    Edit.SelectAll;
  end;
end;

procedure TcxDBEditDataBinding.SetDisplayValue(const Value: TcxEditValue);
begin
  if IsDataAvailable then
    SetInternalDisplayValue(Value)
  else
    SetInternalDisplayValue('');
end;

function TcxDBEditDataBinding.SetEditMode: Boolean;
begin
  Result := IDefaultValuesProvider.DefaultCanModify;
  if not Result then
    Exit;

  DisableRefresh;
  try
    FDatalink.Edit;
    Result := FDatalink.Editing;
    if Result then
      FDatalink.Modified;
  finally
    EnableRefresh;
  end;
end;

procedure TcxDBEditDataBinding.SetStoredValue(const Value: TcxEditValue);

  procedure SetFieldValue(AField: TField; const AValue: TcxEditValue);
  begin
    if VarIsStr(AValue) and (AValue = '') and
      not (Field.DataType in [ftString{$IFDEF DELPHI4}, ftWideString{$ENDIF}]) then
        AField.Value := Null
  {$IFDEF DELPHI6}
    else
      if (Field is TFMTBCDField) and VarIsType(AValue, varDouble) then
        AField.Value := FloatToStrF(AValue, ffFixed, 15, 18) // bug in VarToBcd when the type AValue is double: VarToStr(0.000012) returns 1.2E-05 which is incorrect for StrToBcd
  {$ENDIF}
      else
        AField.Value := AValue;
  end;

var
  AEditValueSource: TcxDataEditValueSource;
  AFieldList: TList;
  I: Integer;
begin
  if IsDataAvailable then
  begin
    DisableRefresh;
    try
      if FDataLink.Edit then
      begin
        AEditValueSource := Edit.ActiveProperties.GetEditValueSource(True(*Edit.InternalFocused*));
       

⌨️ 快捷键说明

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