📄 tntdbctrls.pas
字号:
begin
if (Key = VK_DELETE) or ((Key = VK_INSERT) and (ssShift in Shift)) then
FDataLink.Edit;
end;
end;
procedure TTntDBMemo.KeyPress(var Key: Char{TNT-ALLOW Char});
begin
inherited KeyPress(Key);
if FMemoLoaded then
begin
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, ^I, ^J, ^M, ^V, ^X, #32..#255:
FDataLink.Edit;
#27:
FDataLink.Reset;
end;
end else
begin
if Key = #13 then LoadMemo;
Key := #0;
end;
end;
procedure TTntDBMemo.Change;
begin
if FMemoLoaded then FDataLink.Modified;
FMemoLoaded := True;
inherited Change;
end;
function TTntDBMemo.GetDataSource: TDataSource;
begin
Result := FDataLink.DataSource;
end;
procedure TTntDBMemo.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 TTntDBMemo.GetDataField: WideString;
begin
Result := FDataLink.FieldName;
end;
procedure TTntDBMemo.SetDataField(const Value: WideString);
begin
FDataLink.FieldName := Value;
end;
function TTntDBMemo.GetReadOnly: Boolean;
begin
Result := FDataLink.ReadOnly;
end;
procedure TTntDBMemo.SetReadOnly(Value: Boolean);
begin
FDataLink.ReadOnly := Value;
end;
function TTntDBMemo.GetField: TField;
begin
Result := FDataLink.Field;
end;
procedure TTntDBMemo.LoadMemo;
begin
if not FMemoLoaded and Assigned(FDataLink.Field) and FieldIsBlobLike(FDataLink.Field) then
begin
try
Lines.Text := GetAsWideString(FDataLink.Field);
FMemoLoaded := True;
except
{ Memo too large }
on E:EInvalidOperation do
Lines.Text := WideFormat('(%s)', [E.Message]);
end;
EditingChange(Self);
end;
end;
procedure TTntDBMemo.DataChange(Sender: TObject);
begin
if FDataLink.Field <> nil then
if FieldIsBlobLike(FDataLink.Field) then
begin
if FAutoDisplay or (FDataLink.Editing and FMemoLoaded) then
begin
FMemoLoaded := False;
LoadMemo;
end else
begin
Text := WideFormat('(%s)', [FDataLink.Field.DisplayName]);
FMemoLoaded := False;
EditingChange(Self);
end;
end else
begin
if FFocused and FDataLink.CanModify then
Text := GetWideText(FDataLink.Field)
else
Text := GetWideDisplayText(FDataLink.Field);
FMemoLoaded := True;
end
else
begin
if csDesigning in ComponentState then Text := Name else Text := '';
FMemoLoaded := False;
end;
if HandleAllocated then
RedrawWindow(Handle, nil, 0, RDW_INVALIDATE or RDW_ERASE or RDW_FRAME);
end;
procedure TTntDBMemo.EditingChange(Sender: TObject);
begin
inherited ReadOnly := not (FDataLink.Editing and FMemoLoaded);
end;
procedure TTntDBMemo.UpdateData(Sender: TObject);
begin
SetAsWideString(FDataLink.Field, Text);
end;
procedure TTntDBMemo.SetFocused(Value: Boolean);
begin
if FFocused <> Value then
begin
FFocused := Value;
if not Assigned(FDataLink.Field) or not FieldIsBlobLike(FDataLink.Field) then
FDataLink.Reset;
end;
end;
procedure TTntDBMemo.WndProc(var Message: TMessage);
begin
with Message do
if (Msg = WM_CREATE) or (Msg = WM_WINDOWPOSCHANGED) or
(Msg = CM_FONTCHANGED) then FPaintControl.DestroyHandle;
inherited;
end;
procedure TTntDBMemo.CMEnter(var Message: TCMEnter);
begin
SetFocused(True);
inherited;
end;
procedure TTntDBMemo.CMExit(var Message: TCMExit);
begin
try
FDataLink.UpdateRecord;
except
SetFocus;
raise;
end;
SetFocused(False);
inherited;
end;
procedure TTntDBMemo.SetAutoDisplay(Value: Boolean);
begin
if FAutoDisplay <> Value then
begin
FAutoDisplay := Value;
if Value then LoadMemo;
end;
end;
procedure TTntDBMemo.WMLButtonDblClk(var Message: TWMLButtonDblClk);
begin
if not FMemoLoaded then LoadMemo else inherited;
end;
procedure TTntDBMemo.WMCut(var Message: TMessage);
begin
FDataLink.Edit;
inherited;
end;
procedure TTntDBMemo.WMUndo(var Message: TMessage);
begin
FDataLink.Edit;
inherited;
end;
procedure TTntDBMemo.WMPaste(var Message: TMessage);
begin
FDataLink.Edit;
inherited;
end;
procedure TTntDBMemo.CMGetDataLink(var Message: TMessage);
begin
Message.Result := Integer(FDataLink);
end;
procedure TTntDBMemo.WMPaint(var Message: TWMPaint);
var
S: WideString;
begin
if not (csPaintCopy in ControlState) then
inherited
else begin
if FDataLink.Field <> nil then
if FieldIsBlobLike(FDataLink.Field) then
begin
if FAutoDisplay then
S := TntAdjustLineBreaks(GetAsWideString(FDataLink.Field)) else
S := WideFormat('(%s)', [FDataLink.Field.DisplayName]);
end else
S := GetWideDisplayText(FDataLink.Field);
if (not Win32PlatformIsUnicode) then
SendMessageA(FPaintControl.Handle, WM_SETTEXT, 0, Integer(PAnsiChar(AnsiString(S))))
else begin
SendMessageW(FPaintControl.Handle, WM_SETTEXT, 0, Integer(PWideChar(S)));
end;
SendMessage(FPaintControl.Handle, WM_ERASEBKGND, Integer(Message.DC), 0);
SendMessage(FPaintControl.Handle, WM_PAINT, Integer(Message.DC), 0);
end;
end;
function TTntDBMemo.ExecuteAction(Action: TBasicAction): Boolean;
begin
Result := inherited ExecuteAction(Action) or (FDataLink <> nil) and
FDataLink.ExecuteAction(Action);
end;
function TTntDBMemo.UpdateAction(Action: TBasicAction): Boolean;
begin
Result := inherited UpdateAction(Action) or (FDataLink <> nil) and
FDataLink.UpdateAction(Action);
end;
{ TTntDBRadioGroup }
constructor TTntDBRadioGroup.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FDataLink := TFieldDataLink.Create;
FDataLink.Control := Self;
FDataLink.OnDataChange := DataChange;
FDataLink.OnUpdateData := UpdateData;
FValues := TTntStringList.Create;
end;
destructor TTntDBRadioGroup.Destroy;
begin
FDataLink.Free;
FDataLink := nil;
FValues.Free;
inherited Destroy;
end;
procedure TTntDBRadioGroup.Notification(AComponent: TComponent;
Operation: TOperation);
begin
inherited Notification(AComponent, Operation);
if (Operation = opRemove) and (FDataLink <> nil) and
(AComponent = DataSource) then DataSource := nil;
end;
function TTntDBRadioGroup.UseRightToLeftAlignment: Boolean;
begin
Result := inherited UseRightToLeftAlignment;
end;
procedure TTntDBRadioGroup.DataChange(Sender: TObject);
begin
if FDataLink.Field <> nil then
Value := GetWideText(FDataLink.Field) else
Value := '';
end;
procedure TTntDBRadioGroup.UpdateData(Sender: TObject);
begin
if FDataLink.Field <> nil then
SetWideText(FDataLink.Field, Value);
end;
function TTntDBRadioGroup.GetDataSource: TDataSource;
begin
Result := FDataLink.DataSource;
end;
procedure TTntDBRadioGroup.SetDataSource(Value: TDataSource);
begin
FDataLink.DataSource := Value;
if Value <> nil then Value.FreeNotification(Self);
end;
function TTntDBRadioGroup.GetDataField: WideString;
begin
Result := FDataLink.FieldName;
end;
procedure TTntDBRadioGroup.SetDataField(const Value: WideString);
begin
FDataLink.FieldName := Value;
end;
function TTntDBRadioGroup.GetReadOnly: Boolean;
begin
Result := FDataLink.ReadOnly;
end;
procedure TTntDBRadioGroup.SetReadOnly(Value: Boolean);
begin
FDataLink.ReadOnly := Value;
end;
function TTntDBRadioGroup.GetField: TField;
begin
Result := FDataLink.Field;
end;
function TTntDBRadioGroup.GetButtonValue(Index: Integer): WideString;
begin
if (Index < FValues.Count) and (FValues[Index] <> '') then
Result := FValues[Index]
else if Index < Items.Count then
Result := Items[Index]
else
Result := '';
end;
procedure TTntDBRadioGroup.SetValue(const Value: WideString);
var
WasFocused: Boolean;
I, Index: Integer;
begin
if FValue <> Value then
begin
FInSetValue := True;
try
WasFocused := (ItemIndex > -1) and (Buttons[ItemIndex].Focused);
Index := -1;
for I := 0 to Items.Count - 1 do
if Value = GetButtonValue(I) then
begin
Index := I;
Break;
end;
ItemIndex := Index;
// Move the focus rect along with the selected index
if WasFocused then
Buttons[ItemIndex].SetFocus;
finally
FInSetValue := False;
end;
FValue := Value;
Change;
end;
end;
procedure TTntDBRadioGroup.CMExit(var Message: TCMExit);
begin
try
FDataLink.UpdateRecord;
except
if ItemIndex >= 0 then
(Controls[ItemIndex] as TTntRadioButton).SetFocus else
(Controls[0] as TTntRadioButton).SetFocus;
raise;
end;
inherited;
end;
procedure TTntDBRadioGroup.CMGetDataLink(var Message: TMessage);
begin
Message.Result := Integer(FDataLink);
end;
procedure TTntDBRadioGroup.Click;
begin
if not FInSetValue then
begin
inherited Click;
if ItemIndex >= 0 then Value := GetButtonValue(ItemIndex);
if FDataLink.Editing then FDataLink.Modified;
end;
end;
procedure TTntDBRadioGroup.SetItems(Value: TTntStrings);
begin
Items.Assign(Value);
DataChange(Self);
end;
procedure TTntDBRadioGroup.SetValues(Value: TTntStrings);
begin
FValues.Assign(Value);
DataChange(Self);
end;
procedure TTntDBRadioGroup.Change;
begin
if Assigned(FOnChange) then FOnChange(Self);
end;
procedure TTntDBRadioGroup.KeyPress(var Key: Char{TNT-ALLOW Char});
begin
inherited KeyPress(Key);
case Key of
#8, ' ': FDataLink.Edit;
#27: FDataLink.Reset;
end;
end;
function TTntDBRadioGroup.CanModify: Boolean;
begin
Result := FDataLink.Edit;
end;
function TTntDBRadioGroup.ExecuteAction(Action: TBasicAction): Boolean;
begin
Result := inherited ExecuteAction(Action) or (DataLink <> nil) and
DataLink.ExecuteAction(Action);
end;
function TTntDBRadioGroup.UpdateAction(Action: TBasicAction): Boolean;
begin
Result := inherited UpdateAction(Action) or (DataLink <> nil) and
DataLink.UpdateAction(Action);
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -