ksskindbcontrols.pas
来自「小区水费管理系统源代码水费收费管理系统 水费收费管理系统」· PAS 代码 · 共 2,189 行 · 第 1/5 页
PAS
2,189 行
end;
procedure TSeSkinDBEdit.Notification(AComponent: TComponent;
Operation: TOperation);
begin
inherited Notification(AComponent, Operation);
if (Operation = opRemove) and (FDataLink <> nil) and
(AComponent = DataSource) then DataSource := nil;
end;
function TSeSkinDBEdit.UseRightToLeftAlignment: Boolean;
begin
Result := DBUseRightToLeftAlignment(Self, Field);
end;
procedure TSeSkinDBEdit.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 TSeSkinDBEdit.KeyPress(var Key: Char);
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, ^V, ^X, #32..#255:
FDataLink.Edit;
#27:
begin
FDataLink.Reset;
SelectAll;
Key := #0;
end;
end;
inherited KeyPress(Key);
end;
procedure TSeSkinDBEdit.Change;
begin
if FDataChanging then
begin
inherited Change;
CaretPosition := 0;
end
else
begin
FDataLink.Modified;
inherited Change;
end;
end;
procedure TSeSkinDBEdit.ActiveChange(Sender: TObject);
begin
ResetMaxLength;
end;
procedure TSeSkinDBEdit.DataChange(Sender: TObject);
begin
FDataChanging := true;
try
if FDataLink.Field <> nil then
begin
if TextAlignment <> FDataLink.Field.Alignment then
begin
Text := ''; {forces update}
TextAlignment := FDataLink.Field.Alignment;
end;
// EditMask := FDataLink.Field.EditMask;
if not (csDesigning in ComponentState) then
begin
if (FDataLink.Field.DataType in [ftString, ftWideString]) and (MaxLength = 0) then
MaxLength := FDataLink.Field.Size;
end;
if Focused and FDataLink.CanModify then
begin
Text := FDataLink.Field.Text
end
else
begin
Text := FDataLink.Field.DisplayText;
{ if FDataLink.Editing and FDataLink.FModified then
Modified := True;}
end;
end
else
begin
TextAlignment := taLeftJustify;
// EditMask := '';
if csDesigning in ComponentState then
Text := Name
else
Text := '';
end;
finally
FDataChanging := false;
end;
end;
procedure TSeSkinDBEdit.EditingChange(Sender: TObject);
begin
inherited ReadOnly := not FDataLink.Editing;
end;
procedure TSeSkinDBEdit.UpdateData(Sender: TObject);
begin
// ValidateEdit;
FDataLink.Field.Text := Text;
end;
procedure TSeSkinDBEdit.WMUndo(var Message: TMessage);
begin
FDataLink.Edit;
inherited;
end;
procedure TSeSkinDBEdit.WMPaste(var Message: TMessage);
begin
FDataLink.Edit;
inherited;
end;
procedure TSeSkinDBEdit.WMCut(var Message: TMessage);
begin
FDataLink.Edit;
inherited;
end;
procedure TSeSkinDBEdit.HasFocus;
begin
inherited;
if SysLocale.FarEast and FDataLink.CanModify then
inherited ReadOnly := False;
end;
procedure TSeSkinDBEdit.KillFocus;
begin
try
FDataLink.UpdateRecord;
except
SelectAll;
SetFocus;
raise;
end;
inherited ;
end;
procedure TSeSkinDBEdit.CMGetDataLink(var Message: TMessage);
begin
Message.Result := Integer(FDataLink);
end;
function TSeSkinDBEdit.ExecuteAction(Action: TBasicAction): Boolean;
begin
Result := inherited ExecuteAction(Action) or (FDataLink <> nil) and
FDataLink.ExecuteAction(Action);
end;
function TSeSkinDBEdit.UpdateAction(Action: TBasicAction): Boolean;
begin
Result := inherited UpdateAction(Action) or (FDataLink <> nil) and
FDataLink.UpdateAction(Action);
end;
procedure TSeSkinDBEdit.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;
function TSeSkinDBEdit.GetDataSource: TDataSource;
begin
Result := FDataLink.DataSource;
end;
procedure TSeSkinDBEdit.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 TSeSkinDBEdit.GetDataField: string;
begin
Result := FDataLink.FieldName;
end;
procedure TSeSkinDBEdit.SetDataField(const Value: string);
begin
if not (csDesigning in ComponentState) then
ResetMaxLength;
FDataLink.FieldName := Value;
end;
function TSeSkinDBEdit.GetReadOnly: Boolean;
begin
Result := FDataLink.ReadOnly;
end;
procedure TSeSkinDBEdit.SetReadOnly(Value: Boolean);
begin
FDataLink.ReadOnly := Value;
end;
function TSeSkinDBEdit.GetField: TField;
begin
Result := FDataLink.Field;
end;
{ TSeSkinDBCheckBox ==========================================================}
constructor TSeSkinDBCheckBox.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FValueCheck := STextTrue;
FValueUncheck := STextFalse;
FDataLink := TFieldDataLink.Create;
FDataLink.Control := Self;
FDataLink.OnDataChange := DataChange;
FDataLink.OnUpdateData := UpdateData;
// State := cbUnchecked;
end;
destructor TSeSkinDBCheckBox.Destroy;
begin
FDataLink.Free;
FDataLink := nil;
inherited Destroy;
end;
procedure TSeSkinDBCheckBox.Notification(AComponent: TComponent;
Operation: TOperation);
begin
inherited Notification(AComponent, Operation);
if (Operation = opRemove) and (FDataLink <> nil) and
(AComponent = DataSource) then DataSource := nil;
end;
function TSeSkinDBCheckBox.UseRightToLeftAlignment: Boolean;
begin
Result := DBUseRightToLeftAlignment(Self, Field);
end;
function TSeSkinDBCheckBox.GetFieldState: TCheckBoxState;
var
Text: string;
begin
if FDatalink.Field <> nil then
if FDataLink.Field.IsNull then
Result := cbGrayed
else if FDataLink.Field.DataType = ftBoolean then
if FDataLink.Field.AsBoolean then
Result := cbChecked
else
Result := cbUnchecked
else
begin
Result := cbGrayed;
Text := FDataLink.Field.Text;
if ValueMatch(FValueCheck, Text) then Result := cbChecked else
if ValueMatch(FValueUncheck, Text) then Result := cbUnchecked;
end
else
Result := cbUnchecked;
end;
procedure TSeSkinDBCheckBox.DataChange(Sender: TObject);
begin
FDataChanging := true;
try
State := GetFieldState;
finally
FDataChanging := false;
end;
end;
procedure TSeSkinDBCheckBox.UpdateData(Sender: TObject);
var
Pos: Integer;
S: string;
begin
if State = cbGrayed then
FDataLink.Field.Clear
else
if FDataLink.Field.DataType = ftBoolean then
FDataLink.Field.AsBoolean := Checked
else
begin
if Checked then S := FValueCheck else S := FValueUncheck;
Pos := 1;
FDataLink.Field.Text := ExtractFieldName(S, Pos);
end;
end;
function TSeSkinDBCheckBox.ValueMatch(const ValueList, Value: string): Boolean;
var
Pos: Integer;
begin
Result := False;
Pos := 1;
while Pos <= Length(ValueList) do
if AnsiCompareText(ExtractFieldName(ValueList, Pos), Value) = 0 then
begin
Result := True;
Break;
end;
end;
procedure TSeSkinDBCheckBox.Toggle;
begin
if FDataChanging then inherited Toggle
else
if FDataLink.Edit then
begin
inherited Toggle;
FDataLink.Modified;
end;
end;
procedure TSeSkinDBCheckBox.Click;
begin
if FDataChanging then inherited Click
else
if FDataLink.Edit then
begin
inherited Click;
FDataLink.Modified;
end;
end;
function TSeSkinDBCheckBox.GetDataSource: TDataSource;
begin
Result := FDataLink.DataSource;
end;
procedure TSeSkinDBCheckBox.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 TSeSkinDBCheckBox.GetDataField: string;
begin
Result := FDataLink.FieldName;
end;
procedure TSeSkinDBCheckBox.SetDataField(const Value: string);
begin
FDataLink.FieldName := Value;
end;
function TSeSkinDBCheckBox.GetReadOnly: Boolean;
begin
Result := FDataLink.ReadOnly;
end;
procedure TSeSkinDBCheckBox.SetReadOnly(Value: Boolean);
begin
FDataLink.ReadOnly := Value;
end;
function TSeSkinDBCheckBox.GetField: TField;
begin
Result := FDataLink.Field;
end;
procedure TSeSkinDBCheckBox.KeyPress(var Key: Char);
begin
inherited KeyPress(Key);
case Key of
#8, ' ':
FDataLink.Edit;
#27:
FDataLink.Reset;
end;
end;
procedure TSeSkinDBCheckBox.SetValueCheck(const Value: string);
begin
FValueCheck := Value;
DataChange(Self);
end;
procedure TSeSkinDBCheckBox.SetValueUncheck(const Value: string);
begin
FValueUncheck := Value;
DataChange(Self);
end;
procedure TSeSkinDBCheckBox.KillFocus;
begin
try
FDataLink.UpdateRecord;
except
SetFocus;
raise;
end;
inherited ;
end;
procedure TSeSkinDBCheckBox.CMGetDataLink(var Message: TMessage);
begin
Message.Result := Integer(FDataLink);
end;
function TSeSkinDBCheckBox.ExecuteAction(Action: TBasicAction): Boolean;
begin
Result := inherited ExecuteAction(Action) or (FDataLink <> nil) and
FDataLink.ExecuteAction(Action);
end;
function TSeSkinDBCheckBox.UpdateAction(Action: TBasicAction): Boolean;
begin
Result := inherited UpdateAction(Action) or (FDataLink <> nil) and
FDataLink.UpdateAction(Action);
end;
{ TSeSkinDBComboBox ================================================================}
constructor TSeSkinDBComboBox.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
ControlStyle := ControlStyle + [csR
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?