📄 kxedit.pas
字号:
end;
inherited;
end;
function TKXCustomEdit.AsInteger : Longint;
begin
Result := Trunc(FValue);
end;
function TKXCustomEdit.AsString : string;
begin
if FEditType = ETString then Result := Text
else Result := FloatToStr(FValue);
end;
function TKXCustomEdit.AsFloat : Extended;
begin
Result := FValue;
end;
function TKXCustomEdit.AsCurrency: Currency;
begin
Result := FValue;
end;
{2000.2.眠啊}
//家箭痢 磊府荐
procedure TKXCustomEdit.SetKeyPos(var Value : integer);
begin
FKeyPos := Value;
end;
//例荤, 例惑, 馆棵覆
procedure TKXCustomEdit.SetKeyOption(var Value : integer);
begin
FKeyOption := Value;
end;
procedure TKXCustomEdit.SetLabelCtl(Value : TLabel);
begin
FLabelCtl := Value;
end;
procedure TKXCustomEdit.SetLabelCtltype(Value : TLabelColorType);
begin
FLabelCtlType := Value;
end;
procedure TKXCustomEdit.SetLabelFColor(Value : TColor);
begin
FLabelFColor := Value;
end;
procedure TKXCustomEdit.SetLabelEColor(Value : TColor);
begin
FLabelEColor := Value;
end;
procedure TKXCustomEdit.SetFocusCtl(Value : Boolean);
Begin
FFocusCtl := Value;
End;
procedure TKXCustomEdit.SetFocusprior(Value : TWincontrol);
Begin
FFocusprior := Value;
inherited;
End;
procedure TKXCustomEdit.SetFocusNext(Value : TWincontrol);
Begin
FFocusNext := Value;
inherited;
End;
//****************************************************************//
procedure ResetMaxLength(DBEdit: TKXDBEdit);
var
F: TField;
begin
with DBEdit do
if (MaxLength > 0) and Assigned(DataSource) and Assigned(DataSource.DataSet) then
begin
F := DataSource.DataSet.FindField(DataField);
if Assigned(F) and (F.DataType = ftString) and (F.Size = MaxLength) then
MaxLength := 0;
end;
end;
constructor TKXDBEdit.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
inherited ReadOnly := True;
ControlStyle := ControlStyle + [csReplicatable];
FDataLink := TKXFieldDataLink.Create;
FDataLink.Control := Self;
FDataLink.OnDataChange := DataChange;
FDataLink.OnEditingChange := EditingChange;
FDataLink.OnUpdateData := UpdateData;
end;
destructor TKXDBEdit.Destroy;
begin
FDataLink.Free;
FDataLink := nil;
inherited Destroy;
end;
procedure TKXDBEdit.Loaded;
begin
inherited Loaded;
ResetMaxLength(Self);
if (csDesigning in ComponentState) then DataChange(Self);
end;
procedure TKXDBEdit.Notification(AComponent: TComponent;
Operation: TOperation);
begin
inherited Notification(AComponent, Operation);
if (Operation = opRemove) and (FDataLink <> nil) and
(AComponent = DataSource) then DataSource := nil;
end;
procedure TKXDBEdit.KeyDown(var Key: Word; Shift: TShiftState);
begin
if (Key = VK_DELETE) or ((Key = VK_INSERT) and (ssShift in Shift)) then
FDataLink.Edit;
inherited KeyDown(Key, Shift);
end;
procedure TKXDBEdit.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;
function TKXDBEdit.EditCanModify: Boolean;
begin
Result := FDataLink.Edit;
end;
procedure TKXDBEdit.Reset;
begin
FDataLink.Reset;
SelectAll;
end;
procedure TKXDBEdit.SetFocused(Value: Boolean);
begin
if FFocused <> Value then
begin
FFocused := Value;
if (Alignment <> taLeftJustify) and not IsMasked then Invalidate;
FDataLink.Reset;
end;
end;
procedure TKXDBEdit.Change;
begin
FDataLink.Modified;
inherited Change;
end;
function TKXDBEdit.GetDataSource: TDataSource;
begin
Result := FDataLink.DataSource;
end;
procedure TKXDBEdit.SetDataSource(Value: TDataSource);
begin
FDataLink.DataSource := Value;
if Value <> nil then Value.FreeNotification(Self);
end;
function TKXDBEdit.GetDataField: string;
begin
Result := FDataLink.FieldName;
end;
procedure TKXDBEdit.SetDataField(const Value: string);
begin
if not (csDesigning in ComponentState) then
ResetMaxLength(Self);
FDataLink.FieldName := Value;
end;
procedure TKXDBEdit.SetEditType( Value : TEditTypes );
begin
if FDataLink.Field <> nil then
if not(FDataLink.Field.DataType in
[ftSmallint,ftInteger,ftWord,ftFloat,ftCurrency]) then Value := ETString
else if(FDataLink.Field.DataType in [ftSmallint,ftInteger,ftWord])and
(Value in [ETFloat,ETFloatCurrency]) then Value := EditType;
inherited;
end;
function TKXDBEdit.GetReadOnly: Boolean;
begin
Result := FDataLink.ReadOnly;
end;
procedure TKXDBEdit.SetReadOnly(Value: Boolean);
begin
FDataLink.ReadOnly := Value;
end;
function TKXDBEdit.GetField: TField;
begin
Result := FDataLink.Field;
end;
procedure TKXDBEdit.DataChange(Sender: TObject);
begin
if FDataLink.Field <> nil then
begin
if Alignment <> FDataLink.Field.Alignment then
begin
inherited EditText := '';
Alignment := FDataLink.Field.Alignment;
end;
EditMask := FDataLink.Field.EditMask;
if not(FDataLink.Field.DataType in
[ftSmallint,ftInteger,ftWord,ftFloat,ftCurrency]) then EditType := ETString;
if not (csDesigning in ComponentState) then
begin
if (FDataLink.Field.DataType = ftString) and (MaxLength = 0) then
MaxLength := FDataLink.Field.Size;
end;
if FDataLink.CanModify and not IsMasked and (FEditType <> ETString) then
begin
ConvertValue(FDataLink.Field.Text);
if FDataLink.Editing and FDataLink.FModified then
Modified := True;
end else begin
inherited EditText := FDataLink.Field.DisplayText;
if FDataLink.Editing and FDataLink.FModified then
Modified := True;
end;
end else begin
Alignment := taLeftJustify;
EditMask := '';
if csDesigning in ComponentState then inherited EditText := Name
else inherited EditText := '';
end;
end;
procedure TKXDBEdit.EditingChange(Sender: TObject);
begin
inherited ReadOnly := not FDataLink.Editing;
end;
procedure TKXDBEdit.UpdateData(Sender: TObject);
begin
ValidateEdit;
FDataLink.Field.Text := AsString;
end;
procedure TKXDBEdit.WMPaste(var Message: TMessage);
begin
FDataLink.Edit;
inherited;
end;
procedure TKXDBEdit.WMCut(var Message: TMessage);
begin
FDataLink.Edit;
inherited;
end;
procedure TKXDBEdit.CMEnter(var Message: TCMEnter);
begin
SetFocused(True);
inherited;
if SysLocale.FarEast and FDataLink.CanModify then
inherited ReadOnly := False;
end;
procedure TKXDBEdit.CMExit(var Message: TCMExit);
begin
try
FDataLink.UpdateRecord;
except
SelectAll;
SetFocus;
raise;
end;
SetFocused(False);
CheckCursor;
DoExit;
end;
procedure TKXDBEdit.CMGetDataLink(var Message: TMessage);
begin
Message.Result := Integer(FDataLink);
end;
procedure TKXDBEdit.SetEditText(const Value: string);
begin
FDataLink.Edit;
inherited EditText := Value;
end;
function TKXDBEdit.GetEditText: string;
begin
Result := inherited EditText;
end;
procedure TKXDBEdit.SetText(const Value: string);
begin
FDataLink.Edit;
inherited Text := Value;
end;
function TKXDBEdit.GetText: string;
begin
Result := inherited Text;
end;
procedure TKXFieldDataLink.SetEditing(Value: Boolean);
begin
if FEditing <> Value then
begin
FEditing := Value;
FModified := False;
if Assigned(FOnEditingChange) then FOnEditingChange(Self);
end;
end;
procedure TKXFieldDataLink.SetFieldName(const Value: string);
begin
if FFieldName <> Value then
begin
FFieldName := Value;
UpdateField;
end;
end;
procedure TKXFieldDataLink.SetField(Value: TField);
begin
if FField <> Value then
begin
FField := Value;
EditingChanged;
RecordChanged(nil);
end;
end;
procedure TKXFieldDataLink.UpdateField;
begin
SetField(nil);
if Active and (FFieldName <> '') then
begin
if Assigned(FControl) then
SetField(GetFieldProperty(DataSource.DataSet, FControl, FFieldName)) else
SetField(DataSource.DataSet.FieldByName(FFieldName));
end;
end;
function TKXFieldDataLink.Edit: Boolean;
begin
if CanModify then inherited Edit;
Result := FEditing;
end;
function TKXFieldDataLink.GetCanModify: Boolean;
begin
Result := not ReadOnly and (Field <> nil) and Field.CanModify;
end;
procedure TKXFieldDataLink.Modified;
begin
FModified := True;
end;
procedure TKXFieldDataLink.Reset;
begin
RecordChanged(nil);
end;
procedure TKXFieldDataLink.ActiveChanged;
begin
UpdateField;
if Assigned(FOnActiveChange) then FOnActiveChange(Self);
end;
procedure TKXFieldDataLink.EditingChanged;
begin
SetEditing(inherited Editing and CanModify);
end;
procedure TKXFieldDataLink.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 TKXFieldDataLink.RecordChanged(Field: TField);
begin
if (Field = nil) or (Field = FField) then
begin
if Assigned(FOnDataChange) then FOnDataChange(Self);
FModified := False;
end;
end;
procedure TKXFieldDataLink.LayoutChanged;
begin
UpdateField;
end;
procedure TKXFieldDataLink.UpdateData;
begin
if FModified then
begin
if (Field <> nil) and Assigned(FOnUpdateData) then FOnUpdateData(Self);
FModified := False;
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -