📄 jvdbcontrols.pas
字号:
procedure TJvDBComboEdit.CMGetDataLink(var Msg: TMessage);
begin
Msg.Result := Integer(FDataLink);
end;
function TJvDBComboEdit.UseRightToLeftAlignment: Boolean;
begin
Result := DBUseRightToLeftAlignment(Self, Field);
end;
function TJvDBComboEdit.ExecuteAction(Action: TBasicAction): Boolean;
begin
Result := inherited ExecuteAction(Action) or (FDataLink <> nil) and
FDataLink.ExecuteAction(Action);
end;
function TJvDBComboEdit.UpdateAction(Action: TBasicAction): Boolean;
begin
Result := inherited UpdateAction(Action) or (FDataLink <> nil) and
FDataLink.UpdateAction(Action);
end;
//=== { TJvDBDateEdit } ======================================================
constructor TJvDBDateEdit.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
ControlStyle := ControlStyle + [csReplicatable];
FCanvas := TControlCanvas.Create;
FCanvas.Control := Self;
FInReset := False; // Polaris
FDataLink := TFieldDataLink.Create;
FDataLink.Control := Self;
FDataLink.OnDataChange := DataChange;
FDataLink.OnEditingChange := EditingChange;
FDataLink.OnUpdateData := UpdateData;
Self.OnAcceptDate := AfterPopup;
AlwaysEnableButton := True;
AlwaysShowPopup := False;
inherited ReadOnly := True;
UpdateMask;
end;
destructor TJvDBDateEdit.Destroy;
begin
FDataLink.Free;
FDataLink := nil;
inherited Destroy;
// (rom) destroy Canvas AFTER inherited Destroy
FCanvas.Free;
end;
procedure TJvDBDateEdit.AfterPopup(Sender: TObject; var Date: TDateTime;
var Action: Boolean);
begin
Action := Action and (DataSource <> nil) and (DataSource.DataSet <> nil) and
DataSource.DataSet.CanModify;
if Action then
Action := EditCanModify;
end;
procedure TJvDBDateEdit.Notification(AComponent: TComponent;
Operation: TOperation);
begin
inherited Notification(AComponent, Operation);
if (Operation = opRemove) and (FDataLink <> nil) and
(AComponent = DataSource) then
DataSource := nil;
end;
procedure TJvDBDateEdit.KeyDown(var Key: Word; Shift: TShiftState);
begin
inherited KeyDown(Key, Shift);
if not ReadOnly and
((Key = VK_DELETE) and (Shift * KeyboardShiftStates = [])) or
((Key = VK_INSERT) and (Shift * KeyboardShiftStates = [ssShift])) then
FDataLink.Edit;
end;
procedure TJvDBDateEdit.KeyPress(var Key: Char);
begin
inherited KeyPress(Key);
if (Key in [#32..#255]) and (FDataLink.Field <> nil) and
not (Key in DigitChars) and (Key <> DateSeparator) then
begin
DoBeepOnError;
Key := #0;
end;
case Key of
CtrlH, CtrlV, CtrlX, '0'..'9':
FDataLink.Edit;
Esc:
begin
Reset;
Key := #0;
end;
end;
end;
function TJvDBDateEdit.EditCanModify: Boolean;
begin
Result := FDataLink.Edit;
end;
procedure TJvDBDateEdit.Reset;
begin
FInReset := True; // Polaris
try
FDataLink.Reset;
SelectAll;
finally
FInReset := False; // Polaris
end;
end;
// Polaris begin
function TJvDBDateEdit.IsValidDate(Value: TDateTime): Boolean;
begin
Result := FDateAutoBetween;
if not Result then
if not FInReset and FDataLink.Editing then
try
if Value <> NullDate then
begin
if (MinDate <> NullDate) and (MaxDate <> NullDate) and
((Value < MinDate) or (Value > MaxDate)) then
raise EJVCLException.CreateResFmt(@RsEDateOutOfRange, [FormatDateTime(GetDateFormat, Value),
FormatDateTime(GetDateFormat, MinDate), FormatDateTime(GetDateFormat, MaxDate)])
else
if (MinDate <> NullDate) and (Value < MinDate) then
raise EJVCLException.CreateResFmt(@RsEDateOutOfMin, [FormatDateTime(GetDateFormat, Value),
FormatDateTime(GetDateFormat, MinDate)])
else
if (MaxDate <> NullDate) and (Value > MaxDate) then
raise EJVCLException.CreateResFmt(@RsEDateOutOfMax, [FormatDateTime(GetDateFormat, Value),
FormatDateTime(GetDateFormat, MaxDate)]);
end;
Result := True;
except
Reset;
raise;
end;
end;
procedure TJvDBDateEdit.SetDate(Value: TDateTime);
begin
IsValidDate(Value);
inherited SetDate(Value);
end;
// Polaris end
procedure TJvDBDateEdit.Change;
begin
if not Formatting then
FDataLink.Modified;
inherited Change;
end;
procedure TJvDBDateEdit.PopupDropDown(DisableEdit: Boolean);
begin
{if not ReadOnly then} // checked in FDataLink.Edit via CanModify
if AlwaysShowPopup or FDataLink.Edit then
inherited PopupDropDown(DisableEdit);
end;
function TJvDBDateEdit.GetCanvas: TCanvas;
begin
Result := FCanvas;
end;
function TJvDBDateEdit.GetDataSource: TDataSource;
begin
Result := FDataLink.DataSource;
end;
procedure TJvDBDateEdit.SetDataSource(Value: TDataSource);
begin
if not (FDataLink.DataSourceFixed and (csLoading in ComponentState)) then
FDataLink.DataSource := Value;
if Value <> nil then
Value.FreeNotification(Self);
end;
function TJvDBDateEdit.GetDataField: string;
begin
Result := FDataLink.FieldName;
end;
procedure TJvDBDateEdit.SetDataField(const Value: string);
begin
FDataLink.FieldName := Value;
end;
function TJvDBDateEdit.GetReadOnly: Boolean;
begin
Result := FDataLink.ReadOnly;
end;
procedure TJvDBDateEdit.SetReadOnly(Value: Boolean);
begin
FDataLink.ReadOnly := Value;
end;
function TJvDBDateEdit.GetField: TField;
begin
Result := FDataLink.Field;
end;
procedure TJvDBDateEdit.UpdateMask;
begin
UpdateFormat;
UpdatePopup;
DataChange(nil);
end;
procedure TJvDBDateEdit.DataChange(Sender: TObject);
begin
if FDataLink.Field <> nil then
begin
EditMask := GetDateMask;
// Polaris
inherited SetDate(FDataLink.Field.AsDateTime);
// Self.Date := FDataLink.Field.AsDateTime;
// SetDate(FDataLink.Field.AsDateTime);
// Polaris
end
else
begin
if csDesigning in ComponentState then
begin
EditMask := '';
EditText := Name;
end
else
begin
EditMask := GetDateMask;
if DefaultToday then
Date := SysUtils.Date
else
Date := NullDate;
end;
end;
end;
procedure TJvDBDateEdit.EditingChange(Sender: TObject);
begin
inherited ReadOnly := not FDataLink.Editing;
if FDataLink.Editing and DefaultToday and (FDataLink.Field <> nil) and
(FDataLink.Field.AsDateTime = NullDate) then
FDataLink.Field.AsDateTime := SysUtils.Now;
end;
procedure TJvDBDateEdit.UpdateData(Sender: TObject);
var
D: TDateTime;
begin
ValidateEdit;
D := Self.Date;
if D <> NullDate then
begin // Polaris
if Int(FDataLink.Field.AsDateTime) <> D then
FDataLink.Field.AsDateTime := D + Frac(FDataLink.Field.AsDateTime)
end
else
FDataLink.Field.Clear;
end;
procedure TJvDBDateEdit.CMGetDataLink(var Msg: TMessage);
begin
Msg.Result := Integer(FDataLink);
end;
procedure TJvDBDateEdit.WMPaint(var Msg: TWMPaint);
var
S: string;
begin
if csDestroying in ComponentState then
Exit;
if (csPaintCopy in ControlState) and (FDataLink.Field <> nil) then
begin
if FDataLink.Field.IsNull then
begin
S := GetDateFormat;
S := ReplaceStr(ReplaceStr(ReplaceStr(ReplaceStr(S, '/', DateSeparator),
'Y', ' '), 'M', ' '), 'D', ' ');
end
else
S := FormatDateTime(GetDateFormat, FDataLink.Field.AsDateTime);
end
else
S := EditText;
if not PaintComboEdit(Self, S, Alignment, True, FCanvas, Msg) then
inherited;
end;
procedure TJvDBDateEdit.AcceptValue(const Value: Variant);
begin
if VarIsNull(Value) or VarIsEmpty(Value) then
FDataLink.Field.Clear
else
FDataLink.Field.AsDateTime :=
VarToDateTime(Value) + Frac(FDataLink.Field.AsDateTime);
DoChange;
end;
procedure TJvDBDateEdit.ApplyDate(Value: TDateTime);
begin
FDataLink.Edit;
inherited ApplyDate(Value);
end;
procedure TJvDBDateEdit.WMPaste(var Msg: TMessage);
begin
FDataLink.Edit;
inherited;
end;
procedure TJvDBDateEdit.WMCut(var Msg: TMessage);
begin
FDataLink.Edit;
inherited;
end;
procedure TJvDBDateEdit.DoExit;
begin
try
if not (csDesigning in ComponentState) and CheckOnExit then
CheckValidDate;
FDataLink.UpdateRecord;
except
SelectAll;
if CanFocus then
SetFocus;
raise;
end;
CheckCursor;
inherited DoExit;
end;
function TJvDBDateEdit.UseRightToLeftAlignment: Boolean;
begin
Result := DBUseRightToLeftAlignment(Self, Field);
end;
function TJvDBDateEdit.ExecuteAction(Action: TBasicAction): Boolean;
begin
Result := inherited ExecuteAction(Action) or (FDataLink <> nil) and
FDataLink.ExecuteAction(Action);
end;
function TJvDBDateEdit.UpdateAction(Action: TBasicAction): Boolean;
begin
Result := inherited UpdateAction(Action) or (FDataLink <> nil) and
FDataLink.UpdateAction(Action);
end;
//Polaris
//=== { TJvDBCalcEdit } ======================================================
constructor TJvDBCalcEdit.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
ControlStyle := ControlStyle + [csReplicatable];
//Polaris
FEmptyIsNull := ZeroEmpty;
FLEmptyIsNull := True;
//Polaris
FDataLink := TFieldDataLink.Create;
FDataLink.Control := Self;
FDataLink.OnDataChange := DataChange;
FDataLink.OnEditingChange := EditingChange;
FDataLink.OnUpdateData := UpdateFieldData;
inherited ReadOnly := True;
AlwaysShowPopup := False;
AlwaysEnableButton := True;
end;
destructor TJvDBCalcEdit.Destroy;
begin
FDataLink.Free;
FDataLink := nil;
inherited Destroy;
end;
procedure TJvDBCalcEdit.Loaded;
begin
inherited Loaded;
FLEmptyIsNull := True;
end;
procedure TJvDBCalcEdit.SetEmptyIsNull(Value: Boolean);
begin
if Value <> FEmptyIsNull then
begin
FEmptyIsNull := Value;
if csLoading in ComponentState then
FLEmptyIsNull := False;
end;
end;
function TJvDBCalcEdit.GetZeroEmpty: Boolean;
begin
Result := inherited ZeroEmpty;
end;
procedure TJvDBCalcEdit.SetZeroEmpty(Value: Boolean);
begin
inherited ZeroEmpty := Value;
if FLEmptyIsNull then
SetEmptyIsNull(ZeroEmpty)
end;
function TJvDBCalcEdit.StoreEmptyIsNull: Boolean;
begin
Result := FEmptyIsNull <> ZeroEmpty;
end;
//Polaris
procedure TJvDBCalcEdit.Notification(AComponent: TComponent;
Operation: TOperation);
begin
inherited Notification(AComponent, Operation);
if (Operation = opRemove) and (FDataLink <> nil) and
(AComponent = DataSource) then
DataSource := nil;
end;
procedure TJvDBCalcEdit.KeyDown(var Key: Word; Shift: TShiftState);
begin
inherited KeyDown(Key, Shift);
if not ReadOnly and
((Key = VK_DELETE) and (Shift * KeyboardShiftStates = [])) or
((Key = VK_INSERT) and (Shift * KeyboardShiftStates = [ssShift])) then
FDataLink.Edit;
end;
procedure TJvDBCalcEdit.KeyPress(var Key: Char);
begin
inherited KeyPress(Key);
case Key of
CtrlH, CtrlV, CtrlX, #32..#255:
if not PopupVisible then
FDataLink.Edit;
Esc:
begin
FDataLink.Reset;
SelectAll;
Key := #0;
end;
end;
end;
function TJvDBCalcEdit.IsValidChar(Key: Char): Boolean;
begin
Result := inherited IsValidChar(Key);
if Result and (FDataLink.Field <> nil) then
Result := FDataLink.Field.IsValidChar(Key);
end;
procedure TJvDBCalcEdit.UpdatePopup;
var
Precision: Byte;
begin
Precision := DefCalcPrecision;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -