mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-19 12:19:18 +02:00
LCL: add ItemProps to ValueListEditor
git-svn-id: trunk@39659 -
This commit is contained in:
parent
b9f6d06750
commit
074f42f249
226
lcl/valedit.pas
226
lcl/valedit.pas
@ -5,26 +5,71 @@ unit ValEdit;
|
|||||||
interface
|
interface
|
||||||
|
|
||||||
uses
|
uses
|
||||||
Classes, SysUtils, Grids, LResources, Dialogs, LazUtf8;
|
Classes, SysUtils, Grids, LResources, Dialogs, LazUtf8, variants;
|
||||||
|
|
||||||
type
|
type
|
||||||
|
|
||||||
{ TValueListStrings }
|
TValueListEditor = class; // Forward declaration
|
||||||
|
|
||||||
TValueListEditor = class;
|
TEditStyle = (esSimple, esEllipsis, esPickList);
|
||||||
|
|
||||||
|
{ TItemProp }
|
||||||
|
|
||||||
|
TItemProp = class(TPersistent)
|
||||||
|
private
|
||||||
|
FOwner: TValueListEditor;
|
||||||
|
FEditMask: string;
|
||||||
|
FEditStyle: TEditStyle;
|
||||||
|
FPickList: TStrings;
|
||||||
|
FMaxLength: Integer;
|
||||||
|
FReadOnly: Boolean;
|
||||||
|
FKeyDesc: string;
|
||||||
|
function GetPickList: TStrings;
|
||||||
|
procedure PickListChange(Sender: TObject);
|
||||||
|
procedure SetEditMask(const AValue: string);
|
||||||
|
procedure SetMaxLength(const AValue: Integer);
|
||||||
|
procedure SetReadOnly(const AValue: Boolean);
|
||||||
|
procedure SetEditStyle(const AValue: TEditStyle);
|
||||||
|
procedure SetPickList(const AValue: TStrings);
|
||||||
|
procedure SetKeyDesc(const AValue: string);
|
||||||
|
protected
|
||||||
|
// procedure AssignTo(Dest: TPersistent); override;
|
||||||
|
public
|
||||||
|
constructor Create(AOwner: TValueListEditor);
|
||||||
|
destructor Destroy; override;
|
||||||
|
// function HasPickList: Boolean;
|
||||||
|
published
|
||||||
|
property EditMask: string read FEditMask write SetEditMask;
|
||||||
|
property EditStyle: TEditStyle read FEditStyle write SetEditStyle;
|
||||||
|
property KeyDesc: string read FKeyDesc write SetKeyDesc;
|
||||||
|
property PickList: TStrings read GetPickList write SetPickList;
|
||||||
|
property MaxLength: Integer read FMaxLength write SetMaxLength;
|
||||||
|
property ReadOnly: Boolean read FReadOnly write SetReadOnly;
|
||||||
|
end;
|
||||||
|
|
||||||
|
TItemProps = array of TItemProp;
|
||||||
|
|
||||||
|
{ TValueListStrings }
|
||||||
|
|
||||||
TValueListStrings = class(TStringList)
|
TValueListStrings = class(TStringList)
|
||||||
private
|
private
|
||||||
FOwner: TValueListEditor;
|
FOwner: TValueListEditor;
|
||||||
|
FItemProps: TItemProps;
|
||||||
|
function GetItemProp(const AKeyOrIndex: Variant): TItemProp;
|
||||||
protected
|
protected
|
||||||
procedure SetTextStr(const Value: string); override;
|
procedure SetTextStr(const Value: string); override;
|
||||||
|
procedure InsertItem(Index: Integer; const S: string; AObject: TObject); override;
|
||||||
|
procedure Put(Index: Integer; const S: String); override;
|
||||||
public
|
public
|
||||||
constructor Create(AOwner: TValueListEditor);
|
constructor Create(AOwner: TValueListEditor);
|
||||||
destructor Destroy; override;
|
destructor Destroy; override;
|
||||||
procedure Assign(Source: TPersistent); override;
|
procedure Assign(Source: TPersistent); override;
|
||||||
|
procedure Clear; override;
|
||||||
|
procedure CustomSort(Compare: TStringListSortCompare); override;
|
||||||
|
procedure Delete(Index: Integer); override;
|
||||||
|
procedure Exchange(Index1, Index2: Integer); override;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ TValueListEditor }
|
|
||||||
|
|
||||||
TDisplayOption = (doColumnTitles, doAutoColResize, doKeyColFixed);
|
TDisplayOption = (doColumnTitles, doAutoColResize, doKeyColFixed);
|
||||||
TDisplayOptions = set of TDisplayOption;
|
TDisplayOptions = set of TDisplayOption;
|
||||||
@ -38,6 +83,8 @@ type
|
|||||||
TOnValidateEvent = procedure(Sender: TObject; ACol, ARow: Longint;
|
TOnValidateEvent = procedure(Sender: TObject; ACol, ARow: Longint;
|
||||||
const KeyName, KeyValue: string) of object;
|
const KeyName, KeyValue: string) of object;
|
||||||
|
|
||||||
|
{ TValueListEditor }
|
||||||
|
|
||||||
TValueListEditor = class(TCustomStringGrid)
|
TValueListEditor = class(TCustomStringGrid)
|
||||||
private
|
private
|
||||||
FTitleCaptions: TStrings;
|
FTitleCaptions: TStrings;
|
||||||
@ -51,7 +98,9 @@ type
|
|||||||
FOnStringsChanging: TNotifyEvent;
|
FOnStringsChanging: TNotifyEvent;
|
||||||
FOnValidate: TOnValidateEvent;
|
FOnValidate: TOnValidateEvent;
|
||||||
function GetFixedRows: Integer;
|
function GetFixedRows: Integer;
|
||||||
|
function GetItemProp(const AKeyOrIndex: Variant): TItemProp;
|
||||||
procedure SetFixedRows(AValue: Integer);
|
procedure SetFixedRows(AValue: Integer);
|
||||||
|
procedure SetItemProp(const AKeyOrIndex: Variant; AValue: TItemProp);
|
||||||
procedure StringsChange(Sender: TObject);
|
procedure StringsChange(Sender: TObject);
|
||||||
procedure StringsChanging(Sender: TObject);
|
procedure StringsChanging(Sender: TObject);
|
||||||
function GetOptions: TGridOptions;
|
function GetOptions: TGridOptions;
|
||||||
@ -88,6 +137,7 @@ type
|
|||||||
property Modified;
|
property Modified;
|
||||||
property Keys[Index: Integer]: string read GetKey write SetKey;
|
property Keys[Index: Integer]: string read GetKey write SetKey;
|
||||||
property Values[const Key: string]: string read GetValue write SetValue;
|
property Values[const Key: string]: string read GetValue write SetValue;
|
||||||
|
property ItemProps[const AKeyOrIndex: Variant]: TItemProp read GetItemProp write SetItemProp;
|
||||||
published
|
published
|
||||||
// Same as in TStringGrid
|
// Same as in TStringGrid
|
||||||
property Align;
|
property Align;
|
||||||
@ -216,6 +266,87 @@ procedure Register;
|
|||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
|
{ TItemProp }
|
||||||
|
|
||||||
|
constructor TItemProp.Create(AOwner: TValueListEditor);
|
||||||
|
begin
|
||||||
|
inherited Create;
|
||||||
|
FOwner := AOwner;
|
||||||
|
end;
|
||||||
|
|
||||||
|
destructor TItemProp.Destroy;
|
||||||
|
begin
|
||||||
|
FPickList.Free;
|
||||||
|
inherited Destroy;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TItemProp.GetPickList: TStrings;
|
||||||
|
begin
|
||||||
|
if FPickList = Nil then
|
||||||
|
begin
|
||||||
|
FPickList := TStringList.Create;
|
||||||
|
TStringList(FPickList).OnChange := @PickListChange;
|
||||||
|
end;
|
||||||
|
Result := FPickList;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TItemProp.PickListChange(Sender: TObject);
|
||||||
|
begin
|
||||||
|
if PickList.Count > 0 then begin
|
||||||
|
if EditStyle = esSimple then
|
||||||
|
EditStyle := esPickList;
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
if EditStyle = esPickList then
|
||||||
|
EditStyle := esSimple;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TItemProp.SetEditMask(const AValue: string);
|
||||||
|
begin
|
||||||
|
FEditMask := AValue;
|
||||||
|
with FOwner do
|
||||||
|
if EditorMode and (FStrings.UpdateCount = 0) then
|
||||||
|
InvalidateCell(Col, Row);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TItemProp.SetMaxLength(const AValue: Integer);
|
||||||
|
begin
|
||||||
|
FMaxLength := AValue;
|
||||||
|
with FOwner do
|
||||||
|
if EditorMode and (FStrings.UpdateCount = 0) then
|
||||||
|
InvalidateCell(Col, Row);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TItemProp.SetReadOnly(const AValue: Boolean);
|
||||||
|
begin
|
||||||
|
FReadOnly := AValue;
|
||||||
|
with FOwner do
|
||||||
|
if EditorMode and (FStrings.UpdateCount = 0) then
|
||||||
|
InvalidateCell(Col, Row);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TItemProp.SetEditStyle(const AValue: TEditStyle);
|
||||||
|
begin
|
||||||
|
FEditStyle := AValue;
|
||||||
|
with FOwner do
|
||||||
|
if EditorMode and (FStrings.UpdateCount = 0) then
|
||||||
|
InvalidateCell(Col, Row);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TItemProp.SetPickList(const AValue: TStrings);
|
||||||
|
begin
|
||||||
|
GetPickList.Assign(AValue);
|
||||||
|
with FOwner do
|
||||||
|
if EditorMode and (FStrings.UpdateCount = 0) then
|
||||||
|
InvalidateCell(Col, Row);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TItemProp.SetKeyDesc(const AValue: string);
|
||||||
|
begin
|
||||||
|
FKeyDesc := AValue;
|
||||||
|
end;
|
||||||
|
|
||||||
{ TValueListStrings }
|
{ TValueListStrings }
|
||||||
|
|
||||||
procedure TValueListStrings.SetTextStr(const Value: string);
|
procedure TValueListStrings.SetTextStr(const Value: string);
|
||||||
@ -232,6 +363,26 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TValueListStrings.InsertItem(Index: Integer; const S: string; AObject: TObject);
|
||||||
|
var
|
||||||
|
i: Integer;
|
||||||
|
begin
|
||||||
|
// ToDo: Check validity of key
|
||||||
|
Changing;
|
||||||
|
inherited InsertItem(Index, S, AObject);
|
||||||
|
SetLength(FItemProps, Count);
|
||||||
|
for i := Count-2 downto Index do
|
||||||
|
FItemProps[i+1] := FItemProps[i];
|
||||||
|
FItemProps[Index] := nil;
|
||||||
|
Changed;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TValueListStrings.Put(Index: Integer; const S: String);
|
||||||
|
begin
|
||||||
|
// ToDo: Check validity of key
|
||||||
|
inherited Put(Index, S);
|
||||||
|
end;
|
||||||
|
|
||||||
constructor TValueListStrings.Create(AOwner: TValueListEditor);
|
constructor TValueListStrings.Create(AOwner: TValueListEditor);
|
||||||
begin
|
begin
|
||||||
inherited Create;
|
inherited Create;
|
||||||
@ -251,12 +402,69 @@ begin
|
|||||||
// Don't show editor while changing values. Edited cell would not be changed.
|
// Don't show editor while changing values. Edited cell would not be changed.
|
||||||
IsShowingEditor := goAlwaysShowEditor in Options;
|
IsShowingEditor := goAlwaysShowEditor in Options;
|
||||||
Options := Options - [goAlwaysShowEditor];
|
Options := Options - [goAlwaysShowEditor];
|
||||||
|
// ToDo: Assign also ItemProps if Source is TValueListStrings
|
||||||
inherited Assign(Source);
|
inherited Assign(Source);
|
||||||
if IsShowingEditor then
|
if IsShowingEditor then
|
||||||
Options := Options + [goAlwaysShowEditor];
|
Options := Options + [goAlwaysShowEditor];
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TValueListStrings.Clear;
|
||||||
|
var
|
||||||
|
i: Integer;
|
||||||
|
begin
|
||||||
|
inherited Clear;
|
||||||
|
for i := 0 to Length(FItemProps)-1 do
|
||||||
|
FItemProps[i].Free;
|
||||||
|
SetLength(FItemProps, 0);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TValueListStrings.CustomSort(Compare: TStringListSortCompare);
|
||||||
|
begin
|
||||||
|
inherited CustomSort(Compare);
|
||||||
|
// ToDo: Sort also ItemProps using a copy of the orignal order
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TValueListStrings.Delete(Index: Integer);
|
||||||
|
begin
|
||||||
|
Changing;
|
||||||
|
inherited Delete(Index);
|
||||||
|
// ToDo: Delete also ItemProps
|
||||||
|
Changed;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TValueListStrings.Exchange(Index1, Index2: Integer);
|
||||||
|
begin
|
||||||
|
Changing;
|
||||||
|
inherited Exchange(Index1, Index2);
|
||||||
|
// ToDo: Exchange also ItemProps
|
||||||
|
Changed;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TValueListStrings.GetItemProp(const AKeyOrIndex: Variant): TItemProp;
|
||||||
|
var
|
||||||
|
i: Integer;
|
||||||
|
s: string;
|
||||||
|
begin
|
||||||
|
Result := Nil;
|
||||||
|
if Count > 0 then
|
||||||
|
begin
|
||||||
|
if VarIsOrdinal(AKeyOrIndex) then
|
||||||
|
i := AKeyOrIndex
|
||||||
|
else begin
|
||||||
|
s := AKeyOrIndex;
|
||||||
|
i := IndexOfName(s);
|
||||||
|
if i = -1 then
|
||||||
|
raise Exception.Create('TValueListStrings.GetItemProp: Key not found: '+s);
|
||||||
|
end;
|
||||||
|
Result := FItemProps[i];
|
||||||
|
if not Assigned(Result) then begin
|
||||||
|
Result := TItemProp.Create(FOwner);
|
||||||
|
FItemProps[i] := Result;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
{ TValueListEditor }
|
{ TValueListEditor }
|
||||||
|
|
||||||
constructor TValueListEditor.Create(AOwner: TComponent);
|
constructor TValueListEditor.Create(AOwner: TComponent);
|
||||||
@ -334,6 +542,16 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function TValueListEditor.GetItemProp(const AKeyOrIndex: Variant): TItemProp;
|
||||||
|
begin
|
||||||
|
Result := FStrings.GetItemProp(AKeyOrIndex);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TValueListEditor.SetItemProp(const AKeyOrIndex: Variant; AValue: TItemProp);
|
||||||
|
begin
|
||||||
|
FStrings.GetItemProp(AKeyOrIndex).Assign(AValue);
|
||||||
|
end;
|
||||||
|
|
||||||
function TValueListEditor.GetOptions: TGridOptions;
|
function TValueListEditor.GetOptions: TGridOptions;
|
||||||
begin
|
begin
|
||||||
Result := inherited Options;
|
Result := inherited Options;
|
||||||
|
Loading…
Reference in New Issue
Block a user