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 + -
显示快捷键?