📄 valedit.pas
字号:
procedure TValueListEditor.SetKey(Index: Integer; const Value: string);
begin
SetCell(0, Index, Value);
end;
function TValueListEditor.GetValue(const Key: string): string;
var
I: Integer;
begin
if FindRow(Key, I) then
Result := Cells[1, I] else
Result := '';
end;
procedure TValueListEditor.SetValue(const Key, Value: string);
var
I: Integer;
begin
if FindRow(Key, I) then Cells[1, I] := Value
else InsertRow(Key, Value, True);
end;
procedure TValueListEditor.SetTitleCaptions(const Value: TStrings);
begin
FTitleCaptions.Assign(Value);
Refresh;
end;
function TValueListEditor.TitleCaptionsStored: Boolean;
begin
Result := TitleCaptions.Text <> (SKeyCaption+SLineBreak+SValueCaption+SLineBreak);
end;
function TValueListEditor.GetStrings: TStrings;
begin
Result := FStrings;
end;
procedure TValueListEditor.SetStrings(const Value: TStrings);
begin
FStrings.Assign(Value);
end;
procedure TValueListEditor.SetDisplayOptions(const Value: TDisplayOptions);
procedure SetColumnTitles(Visible: Boolean);
begin
if Visible then
begin
if RowCount < 2 then inherited RowCount := 2;
FixedRows := 1;
end else
FixedRows := 0;
end;
begin
if (doColumnTitles in DisplayOptions) <> (doColumnTitles in Value) then
SetColumnTitles(doColumnTitles in Value);
FDisplayOptions := Value;
AdjustColWidths;
Refresh;
end;
function TValueListEditor.GetItemProp(const KeyOrIndex: Variant): TItemProp;
begin
Result := FStrings.GetItemProp(KeyOrIndex);
end;
procedure TValueListEditor.PutItemProp(const KeyOrIndex: Variant; const Value: TItemProp);
begin
FStrings.PutItemProp(KeyOrIndex, Value);
end;
procedure TValueListEditor.SetKeyOptions(Value: TKeyOptions);
begin
{ Need to be able to Edit when you can Add }
if not (keyEdit in Value) and (keyEdit in FKeyOptions) then
Value := Value - [keyAdd];
if (keyAdd in Value) and not (keyAdd in FKeyOptions) then
Value := Value + [keyEdit];
if not (keyEdit in Value) and (Col = 0) then
Col := 1;
FKeyOptions := Value;
end;
function TValueListEditor.GetOnStringsChange: TNotifyEvent;
begin
Result := FStrings.OnChange;
end;
function TValueListEditor.GetOnStringsChanging: TNotifyEvent;
begin
Result := FStrings.OnChanging;
end;
procedure TValueListEditor.SetOnStringsChange(const Value: TNotifyEvent);
begin
FStrings.OnChange := Value;
end;
procedure TValueListEditor.SetOnStringsChanging(const Value: TNotifyEvent);
begin
FStrings.OnChanging := Value;
end;
procedure TValueListEditor.SetOnEditButtonClick(const Value: TNotifyEvent);
begin
FOnEditButtonClick := Value;
if Assigned(EditList) then
EditList.OnEditButtonClick := FOnEditButtonClick;
end;
{ Display / Refresh }
procedure TValueListEditor.DrawCell(ACol, ARow: Integer; ARect: TRect;
AState: TGridDrawState);
var
CellText: string;
ItemProp: TItemProp;
begin
if DefaultDrawing then
begin
if (ACol = 0) and (ARow > FixedRows-1) then
ItemProp := FStrings.FindItemProp(ARow-FixedRows, False)
else
ItemProp := nil;
if (ItemProp <> nil) and (ItemProp.KeyDesc <> '') then
CellText := ItemProp.KeyDesc
else
CellText := Cells[ACol, ARow];
Canvas.TextRect(ARect, ARect.Left+2, ARect.Top+2, CellText);
end;
inherited DrawCell(ACol, ARow, ARect, AState);
end;
procedure TValueListEditor.AdjustColWidths;
begin
if not FAdjustingColWidths and HandleAllocated and Showing and
(doAutoColResize in DisplayOptions) then
begin
FAdjustingColWidths := True;
try
if (ColWidths[0] + ColWidths[1]) <> (ClientWidth - 2) then
begin
if doKeyColFixed in DisplayOptions then
ColWidths[1] := ClientWidth - ColWidths[0] - 2
else
begin
ColWidths[0] := (ClientWidth - 2) div 2;
ColWidths[1] := ColWidths[0] + ((ClientWidth - 2) mod 2);
end;
end;
finally
FAdjustingColWidths := False;
end;
end;
end;
procedure TValueListEditor.AdjustRowCount;
var
NewRowCount: Integer;
begin
if Strings.Count > 0 then
NewRowCount := Strings.Count + FixedRows else
NewRowCount := FixedRows + 1;
if NewRowCount <> RowCount then
begin
if NewRowCount < Row then
Row := NewRowCount - 1;
if (doColumnTitles in DisplayOptions) and (Row = 0) then Row := 1;
inherited RowCount := NewRowCount;
end;
end;
procedure TValueListEditor.Resize;
begin
inherited;
AdjustColWidths;
end;
procedure TValueListEditor.ColWidthsChanged;
begin
AdjustColWidths;
inherited;
end;
procedure TValueListEditor.Refresh;
begin
if FEditUpdate = 0 then
begin
AdjustRowCount;
Invalidate;
InvalidateEditor;
end;
end;
procedure TValueListEditor.StringsChanging;
begin
HideEdit;
end;
{ Editing }
function TValueListEditor.CanEditModify: Boolean;
var
ItemProp: TItemProp;
begin
Result := inherited CanEditModify;
if Result then
begin
ItemProp := FStrings.FindItemProp(Row-FixedRows);
if Assigned(ItemProp) then
Result := not ItemProp.ReadOnly;
end;
end;
procedure TValueListEditor.DisableEditUpdate;
begin
if FEditUpdate = 0 then
FCountSave := Strings.Count;
Inc(FEditUpdate);
end;
procedure TValueListEditor.EnableEditUpdate;
begin
Dec(FEditUpdate);
if (FEditUpdate = 0) and (FCountSave <> Strings.Count) then
Refresh;
end;
function TValueListEditor.GetEditLimit: Integer;
var
ItemProp: TItemProp;
begin
ItemProp := FStrings.FindItemProp(Row-FixedRows);
if Assigned(ItemProp) then
Result := ItemProp.MaxLength else
Result := inherited GetEditLimit;
end;
function TValueListEditor.GetEditMask(ACol, ARow: Integer): string;
var
ItemProp: TItemProp;
begin
ItemProp := FStrings.FindItemProp(Row-FixedRows);
if Assigned(ItemProp) then
Result := ItemProp.EditMask else
Result := '';
if Assigned(OnGetEditMask) then
OnGetEditMask(Self, ACol, ARow, Result);
end;
function TValueListEditor.GetEditStyle(ACol, ARow: Integer): TEditStyle;
var
ItemProp: TItemProp;
begin
Result := esSimple;
if (ACol <> 0) then
begin
ItemProp := FStrings.FindItemProp(Row-FixedRows);
if Assigned(ItemProp) and (ItemProp.EditStyle <> esSimple) then
Result := ItemProp.EditStyle
else if GetPickList(EditList.PickList.Items) then
Result := esPickList;
end;
end;
function TValueListEditor.GetEditText(ACol, ARow: Longint): string;
begin
Result := Cells[ACol, ARow];
if Assigned(OnGetEditText) then OnGetEditText(Self, ACol, ARow, Result);
end;
procedure TValueListEditor.SetEditText(ACol, ARow: Longint; const Value: string);
begin
inherited SetEditText(ACol, ARow, Value);
DisableEditUpdate;
try
if ((ARow - FixedRows) >= Strings.Count) and (Value <> '') then
begin
Strings.Append('');
FCountSave := FStrings.Count;
end;
if (Value <> Cells[ACol, ARow]) then
begin
{ If the Key is being updated, defer any error about duplicates until
we try to we try to write it a second time (which will happen when
the user tries to move to a different cell) }
if (ACol = 0) and not FStrings.KeyIsValid(Value, False) and
(FDupKeySave <> Value) then
FDupKeySave := Value
else
begin
FDupKeySave := '';
Cells[ACol, ARow] := Value;
end;
end;
finally
EnableEditUpdate;
end;
end;
procedure TValueListEditor.EditListGetItems(ACol, ARow: Integer;
Items: TStrings);
var
ItemProp: TItemProp;
begin
if (ACol <> 0) then
begin
ItemProp := FStrings.FindItemProp(Row-FixedRows);
if Assigned(ItemProp) and ItemProp.HasPickList then
Items.Assign(ItemProp.PickList)
else
Items.Clear;
GetPickList(Items, False);
end;
end;
function TValueListEditor.GetPickList(Values: TStrings;
ClearFirst: Boolean = True): Boolean;
begin
if Assigned(FOnGetPickList) and (Keys[Row] <> '') then
begin
Values.BeginUpdate;
try
if ClearFirst then
Values.Clear;
FOnGetPickList(Self, Keys[Row], Values);
Result := Values.Count > 0;
EditList.PickListLoaded := Result;
finally
Values.EndUpdate;
end
end
else
Result := False;
end;
function TValueListEditor.InsertRow(const KeyName, Value: string;
Append: Boolean): Integer;
begin
Result := Row;
{ If row is empty, use it, otherwise add a new row }
if (Result > Strings.Count) or not IsEmptyRow then
begin
Strings.BeginUpdate;
try
if Append then
Result := Strings.Add(FormatLine(KeyName, Value)) + FixedRows else
Strings.Insert(Result - FixedRows, FormatLine(KeyName, Value));
finally
Strings.EndUpdate;
end;
end else
begin
Cells[0, Result] := KeyName;
Cells[1, Result] := Value;
end;
end;
procedure TValueListEditor.DeleteRow(ARow: Integer);
begin
if FDeleting then Exit;
FDeleting := True;
try
if (Row >= RowCount - 1) and (Strings.Count > 1) then
Row := Row - 1;
Strings.Delete(ARow - FixedRows);
finally
FDeleting := False;
end;
end;
function TValueListEditor.RestoreCurrentRow: Boolean;
function RestoreInplaceEditor: Boolean;
var
ChangedText: string;
begin
Result := False;
if Assigned(EditList) and EditList.Modified then
begin
ChangedText := EditList.EditText;
EditList.RestoreContents;
Result := ChangedText <> EditList.EditText;
if Result then
EditList.SelectAll;
end;
end;
begin
Result := RestoreInplaceEditor;
if not Result and IsEmptyRow then
begin
DeleteRow(Row);
Result := True;
end
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -