📄 lbdbctrls.pas
字号:
else
Result := '';
Result := ',0.' + Result;
CurrStr := '';
for I := 1 to Length(CurrencyString) do
begin
C := CurrencyString[I];
if C in [',', '.'] then CurrStr := CurrStr + '''' + C + ''''
else CurrStr := CurrStr + C;
end;
if Length(CurrStr) > 0 then
case CurrencyFormat of
0: Result := CurrStr + Result; { '$1' }
1: Result := Result + CurrStr; { '1$' }
2: Result := CurrStr + ' ' + Result; { '$ 1' }
3: Result := Result + ' ' + CurrStr; { '1 $' }
end;
Result := Format('%s;-%s', [Result, Result]);
end;
{ TFieldDataLink }
constructor TFieldDataLink.Create;
begin
inherited Create;
VisualControl := True;
end;
procedure TFieldDataLink.SetEditing(Value: Boolean);
begin
if FEditing <> Value then
begin
FEditing := Value;
FModified := False;
if Assigned(FOnEditingChange) then FOnEditingChange(Self);
end;
end;
procedure TFieldDataLink.SetFieldName(const Value: string);
begin
if FFieldName <> Value then
begin
FFieldName := Value;
UpdateField;
end;
end;
procedure TFieldDataLink.SetField(Value: TField);
begin
if FField <> Value then
begin
FField := Value;
EditingChanged;
RecordChanged(nil);
UpdateRightToLeft;
end;
end;
procedure TFieldDataLink.UpdateField;
begin
if Active and (FFieldName <> '') then
begin
FField := nil;
if Assigned(FControl) then
SetField(GetFieldProperty(DataSource.DataSet, FControl, FFieldName)) else
SetField(DataSource.DataSet.FieldByName(FFieldName));
end else
SetField(nil);
end;
procedure TFieldDataLink.UpdateRightToLeft;
var
IsRightAligned: Boolean;
AUseRightToLeftAlignment: Boolean;
begin
if Assigned(FControl) and (FControl is TWinControl) then
with FControl as TWinControl do
if IsRightToLeft then
begin
IsRightAligned :=
(GetWindowLong(Handle, GWL_EXSTYLE) and WS_EX_RIGHT) = WS_EX_RIGHT;
AUseRightToLeftAlignment :=
DBUseRightToLeftAlignment(TControl(FControl), Field);
if (IsRightAligned and (not AUseRightToLeftAlignment)) or
((not IsRightAligned) and AUseRightToLeftAlignment) then
Perform(CM_RECREATEWND, 0, 0);
end;
end;
function TFieldDataLink.Edit: Boolean;
begin
if CanModify then inherited Edit;
Result := FEditing;
end;
function TFieldDataLink.GetCanModify: Boolean;
begin
Result := not ReadOnly and (Field <> nil) and Field.CanModify;
end;
procedure TFieldDataLink.Modified;
begin
FModified := True;
end;
procedure TFieldDataLink.Reset;
begin
RecordChanged(nil);
end;
procedure TFieldDataLink.ActiveChanged;
begin
UpdateField;
if Assigned(FOnActiveChange) then FOnActiveChange(Self);
end;
procedure TFieldDataLink.EditingChanged;
begin
SetEditing(inherited Editing and CanModify);
end;
procedure TFieldDataLink.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 TFieldDataLink.RecordChanged(Field: TField);
begin
if (Field = nil) or (Field = FField) then
begin
if Assigned(FOnDataChange) then FOnDataChange(Self);
FModified := False;
end;
end;
procedure TFieldDataLink.LayoutChanged;
begin
UpdateField;
end;
procedure TFieldDataLink.UpdateData;
begin
if FModified then
begin
if (Field <> nil) and Assigned(FOnUpdateData) then FOnUpdateData(Self);
FModified := False;
end;
end;
procedure TFieldDataLink.DataEvent(Event: TDataEvent; Info: Integer);
begin
inherited;
if Event = deDisabledStateChange then
begin
if Boolean(Info) then
UpdateField
else
FField := nil;
end;
end;
{ TPaintControl }
type
TWinControlAccess = class(TWinControl);
constructor TPaintControl.Create(AOwner: TWinControl; const ClassName: string);
begin
FOwner := AOwner;
FClassName := ClassName;
end;
destructor TPaintControl.Destroy;
begin
DestroyHandle;
end;
procedure TPaintControl.DestroyHandle;
begin
if FHandle <> 0 then DestroyWindow(FHandle);
FreeObjectInstance(FObjectInstance);
FHandle := 0;
FObjectInstance := nil;
end;
function TPaintControl.GetHandle: HWnd;
var
Params: TCreateParams;
begin
if FHandle = 0 then
begin
FObjectInstance := MakeObjectInstance(WndProc);
TWinControlAccess(FOwner).CreateParams(Params);
Params.Style := Params.Style and not (WS_HSCROLL or WS_VSCROLL);
with Params do
FHandle := CreateWindowEx(ExStyle, PChar(FClassName),
PChar(TWinControlAccess(FOwner).Text), Style or WS_VISIBLE,
X, Y, Width, Height, Application.Handle, 0, HInstance, nil);
FDefWindowProc := Pointer(GetWindowLong(FHandle, GWL_WNDPROC));
SetWindowLong(FHandle, GWL_WNDPROC, Integer(FObjectInstance));
SendMessage(FHandle, WM_SETFONT,
TWinControlAccess(FOwner).Font.Handle, 1);
end;
Result := FHandle;
end;
procedure TPaintControl.SetCtl3DButton(Value: Boolean);
begin
if FHandle <> 0 then DestroyHandle;
FCtl3DButton := Value;
end;
procedure TPaintControl.WndProc(var Message: TMessage);
begin
with Message do
if (Msg >= CN_CTLCOLORMSGBOX) and (Msg <= CN_CTLCOLORSTATIC) then
Result := FOwner.Perform(Msg, WParam, LParam) else
Result := CallWindowProc(FDefWindowProc, FHandle, Msg, WParam, LParam);
end;
{ TLBDBEdit }
procedure TLBDBEdit.ResetMaxLength;
var
F: TField;
begin
if (MaxLength > 0) and Assigned(DataSource) and Assigned(DataSource.DataSet) then
begin
F := DataSource.DataSet.FindField(DataField);
if Assigned(F) and (F.DataType in [ftString, ftWideString]) and (F.Size = MaxLength) then
MaxLength := 0;
end;
end;
constructor TLBDBEdit.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
inherited ReadOnly := True;
ControlStyle := ControlStyle + [csReplicatable];
FDataLink := TFieldDataLink.Create;
FDataLink.Control := Self;
FDataLink.OnDataChange := DataChange;
FDataLink.OnEditingChange := EditingChange;
FDataLink.OnUpdateData := UpdateData;
FDataLink.OnActiveChange := ActiveChange;
end;
destructor TLBDBEdit.Destroy;
begin
FDataLink.Free;
FDataLink := nil;
FCanvas.Free;
inherited Destroy;
end;
procedure TLBDBEdit.Loaded;
begin
inherited Loaded;
ResetMaxLength;
if (csDesigning in ComponentState) then DataChange(Self);
end;
procedure TLBDBEdit.Notification(AComponent: TComponent;
Operation: TOperation);
begin
inherited Notification(AComponent, Operation);
if (Operation = opRemove) and (FDataLink <> nil) and
(AComponent = DataSource) then DataSource := nil;
end;
function TLBDBEdit.UseRightToLeftAlignment: Boolean;
begin
Result := DBUseRightToLeftAlignment(Self, Field);
end;
procedure TLBDBEdit.KeyDown(var Key: Word; Shift: TShiftState);
begin
inherited KeyDown(Key, Shift);
if (Key = VK_DELETE) or ((Key = VK_INSERT) and (ssShift in Shift)) then
FDataLink.Edit;
end;
procedure TLBDBEdit.KeyPress(var Key: Char);
begin
inherited KeyPress(Key);
if (Key in [#32..#255]) and (FDataLink.Field <> nil) and
not FDataLink.Field.IsValidChar(Key) then
begin
MessageBeep(0);
Key := #0;
end;
case Key of
^H, ^V, ^X, #32..#255:
FDataLink.Edit;
#27:
begin
FDataLink.Reset;
SelectAll;
Key := #0;
end;
end;
end;
procedure TLBDBEdit.SetFocused(Value: Boolean);
begin
if FFocused <> Value then
begin
FFocused := Value;
if (FAlignment <> taLeftJustify) then Invalidate;
FDataLink.Reset;
end;
end;
procedure TLBDBEdit.Change;
begin
FDataLink.Modified;
inherited Change;
end;
function TLBDBEdit.GetDataSource: TDataSource;
begin
Result := FDataLink.DataSource;
end;
procedure TLBDBEdit.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 TLBDBEdit.GetDataField: string;
begin
Result := FDataLink.FieldName;
end;
procedure TLBDBEdit.SetDataField(const Value: string);
begin
if not (csDesigning in ComponentState) then
ResetMaxLength;
FDataLink.FieldName := Value;
end;
function TLBDBEdit.GetReadOnly: Boolean;
begin
Result := FDataLink.ReadOnly;
end;
procedure TLBDBEdit.SetReadOnly(Value: Boolean);
begin
FDataLink.ReadOnly := Value;
end;
function TLBDBEdit.GetField: TField;
begin
Result := FDataLink.Field;
end;
procedure TLBDBEdit.ActiveChange(Sender: TObject);
begin
ResetMaxLength;
end;
procedure TLBDBEdit.DataChange(Sender: TObject);
begin
if FDataLink.Field <> nil then
begin
if FAlignment <> FDataLink.Field.Alignment then
begin
Text := ''; {forces update}
FAlignment := FDataLink.Field.Alignment;
end;
if not (csDesigning in ComponentState) then
begin
if (FDataLink.Field.DataType in [ftString, ftWideString]) and (MaxLength = 0) then
MaxLength := FDataLink.Field.Size;
end;
if FFocused and FDataLink.CanModify then
Text := FDataLink.Field.Text
else
begin
Text := FDataLink.Field.DisplayText;
if FDataLink.Editing and FDataLink.FModified then
Modified := True;
end;
end else
begin
FAlignment := taLeftJustify;
if csDesigning in ComponentState then
Text := Name else
Text := '';
end;
end;
procedure TLBDBEdit.EditingChange(Sender: TObject);
begin
inherited ReadOnly := not FDataLink.Editing;
end;
procedure TLBDBEdit.UpdateData(Sender: TObject);
begin
FDataLink.Field.Text := Text;
end;
procedure TLBDBEdit.WMUndo(var Message: TMessage);
begin
FDataLink.Edit;
inherited;
end;
procedure TLBDBEdit.WMPaste(var Message: TMessage);
begin
FDataLink.Edit;
inherited;
end;
procedure TLBDBEdit.WMCut(var Message: TMessage);
begin
FDataLink.Edit;
inherited;
end;
procedure TLBDBEdit.CMEnter(var Message: TCMEnter);
begin
SetFocused(True);
inherited;
if SysLocale.FarEast and FDataLink.CanModify then
inherited ReadOnly := False;
end;
procedure TLBDBEdit.CMExit(var Message: TCMExit);
begin
try
FDataLink.UpdateRecord;
except
SelectAll;
SetFocus;
raise;
end;
SetFocused(False);
DoExit;
end;
procedure TLBDBEdit.WMPaint(var Message: TWMPaint);
const
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -