CaseInsensetive sort in RxDBGrid

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@1042 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
alexs75
2009-12-10 22:02:14 +00:00
parent 3901fd6ed8
commit 02c77e92db
10 changed files with 217 additions and 149 deletions

View File

@@ -35,22 +35,29 @@ unit exsortfb;
interface interface
uses uses
Classes, SysUtils, DB, RxDBGrid; Classes, SysUtils, DB,
{$IFDEF FPC}
RxDBGrid
{$ELSE}
exDBGrid
{$ENDIF}
;
type type
{ TFBDataSetSortEngine } { TFBDataSetSortEngine }
TFBDataSetSortEngine = class(TExDBGridSortEngine) TFBDataSetSortEngine = class(TRxDBGridSortEngine)
public public
procedure Sort(Field:TField; ADataSet:TDataSet; Asc:boolean);override; procedure Sort(Field:TField; ADataSet:TDataSet; Asc:boolean; SortOptions:TRxSortEngineOptions);override;
procedure SortList(ListField:string; ADataSet:TDataSet; Asc:boolean);override; procedure SortList(ListField:string; ADataSet:TDataSet; Asc:boolean);override;
end; end;
implementation implementation
uses FBCustomDataSet; uses FBCustomDataSet;
procedure TFBDataSetSortEngine.Sort(Field:TField; ADataSet:TDataSet; Asc:boolean); procedure TFBDataSetSortEngine.Sort(Field: TField; ADataSet: TDataSet;
Asc: boolean; SortOptions: TRxSortEngineOptions);
begin begin
if Assigned(ADataSet) then if Assigned(ADataSet) then
(ADataSet as TFBDataSet).SortOnField(Field.FieldName, Asc); (ADataSet as TFBDataSet).SortOnField(Field.FieldName, Asc);
@@ -64,6 +71,6 @@ begin
end; end;
initialization initialization
RegisterExDBGridSortEngine(TFBDataSetSortEngine, TFBDataSet); RegisterRxDBGridSortEngine(TFBDataSetSortEngine, TFBDataSet);
end. end.

View File

@@ -361,6 +361,10 @@ msgstr "&Orden de Ordenamiento :"
msgid "Sort on field" msgid "Sort on field"
msgstr "Ordenar por Columnas" msgstr "Ordenar por Columnas"
#: rxdconst.srxsortbyformcaseinsens
msgid "&Case insensitive sort"
msgstr ""
#: rxdconst.srxsortbyformmovednfield #: rxdconst.srxsortbyformmovednfield
msgid "&Down" msgid "&Down"
msgstr "A&bajo" msgstr "A&bajo"
@@ -378,7 +382,9 @@ msgid "&Selected fields:"
msgstr "&Campos Disponibles :" msgstr "&Campos Disponibles :"
#: rxdconst.srxsortbyformsortorder #: rxdconst.srxsortbyformsortorder
msgid "Select field for sort data:" #, fuzzy
#| msgid "Select field for sort data:"
msgid "Select f&ield for sort data:"
msgstr "Seleccionar Dirección de Ordenamiento :" msgstr "Seleccionar Dirección de Ordenamiento :"
#: rxdconst.srxsoursedataset #: rxdconst.srxsoursedataset

View File

@@ -361,6 +361,10 @@ msgstr ""
msgid "Sort on field" msgid "Sort on field"
msgstr "" msgstr ""
#: rxdconst.srxsortbyformcaseinsens
msgid "&Case insensitive sort"
msgstr ""
#: rxdconst.srxsortbyformmovednfield #: rxdconst.srxsortbyformmovednfield
msgid "&Down" msgid "&Down"
msgstr "" msgstr ""
@@ -378,7 +382,7 @@ msgid "&Selected fields:"
msgstr "" msgstr ""
#: rxdconst.srxsortbyformsortorder #: rxdconst.srxsortbyformsortorder
msgid "Select field for sort data:" msgid "Select f&ield for sort data:"
msgstr "" msgstr ""
#: rxdconst.srxsoursedataset #: rxdconst.srxsoursedataset

View File

@@ -361,6 +361,10 @@ msgstr "&Поля в таблице"
msgid "Sort on field" msgid "Sort on field"
msgstr "Сортировать по полям" msgstr "Сортировать по полям"
#: rxdconst.srxsortbyformcaseinsens
msgid "&Case insensitive sort"
msgstr "&Сортировка без учёта регистра"
#: rxdconst.srxsortbyformmovednfield #: rxdconst.srxsortbyformmovednfield
msgid "&Down" msgid "&Down"
msgstr "&Вниз" msgstr "&Вниз"
@@ -378,7 +382,9 @@ msgid "&Selected fields:"
msgstr "&Выбранные поля" msgstr "&Выбранные поля"
#: rxdconst.srxsortbyformsortorder #: rxdconst.srxsortbyformsortorder
msgid "Select field for sort data:" #, fuzzy
#| msgid "Select field for sort data:"
msgid "Select f&ield for sort data:"
msgstr "Укажите поля для сортировки данных :" msgstr "Укажите поля для сортировки данных :"
#: rxdconst.srxsoursedataset #: rxdconst.srxsoursedataset

View File

@@ -44,7 +44,8 @@ type
rdgAllowQuickSearch, rdgAllowQuickSearch,
rdgAllowFilterForm, rdgAllowFilterForm,
rdgAllowSortForm, rdgAllowSortForm,
rdgAllowToolMenu rdgAllowToolMenu,
rdgCaseInsensitiveSort
); );
TOptionsRx = set of TOptionRx; TOptionsRx = set of TOptionRx;
@@ -55,17 +56,20 @@ type
TRxColumn = class; TRxColumn = class;
{ TExDBGridSortEngine } { TRxDBGridSortEngine }
TRxSortEngineOption =
(seoCaseInsensitiveSort);
TRxSortEngineOptions = set of TRxSortEngineOption;
TExDBGridSortEngine = class TRxDBGridSortEngine = class
private private
FDataSetClass:TDataSetClass; FDataSetClass:TDataSetClass;
public public
procedure Sort(Field:TField; ADataSet:TDataSet; Asc:boolean);virtual;abstract; procedure Sort(Field:TField; ADataSet:TDataSet; Asc:boolean; SortOptions:TRxSortEngineOptions);virtual;abstract;
procedure SortList(ListField:string; ADataSet:TDataSet; Asc:boolean);virtual; procedure SortList(ListField:string; ADataSet:TDataSet; Asc:boolean);virtual;
end; end;
TExDBGridSortEngineClass = class of TExDBGridSortEngine; TRxDBGridSortEngineClass = class of TRxDBGridSortEngine;
TMLCaptionItem = class TMLCaptionItem = class
Caption:string; Caption:string;
@@ -244,7 +248,7 @@ type
//auto sort support //auto sort support
FSortField:TField; FSortField:TField;
FSortOrder:TSortMarker; FSortOrder:TSortMarker;
FSortEngine:TExDBGridSortEngine; FSortEngine:TRxDBGridSortEngine;
FPressedCol: TColumn; FPressedCol: TColumn;
FPressed: Boolean; FPressed: Boolean;
FSwapButtons: Boolean; FSwapButtons: Boolean;
@@ -303,6 +307,8 @@ type
procedure OutCaptionSortMarker(const aRect: TRect; ASortMarker: TSortMarker); procedure OutCaptionSortMarker(const aRect: TRect; ASortMarker: TSortMarker);
procedure OutCaptionMLCellText(aCol,aRow: Integer; aRect: TRect; aState: TGridDrawState; MLI:TMLCaptionItem); procedure OutCaptionMLCellText(aCol,aRow: Integer; aRect: TRect; aState: TGridDrawState; MLI:TMLCaptionItem);
procedure UpdateJMenuStates; procedure UpdateJMenuStates;
function SortEngineOptions:TRxSortEngineOptions;
//storage //storage
procedure OnIniSave(Sender: TObject); procedure OnIniSave(Sender: TObject);
@@ -480,25 +486,25 @@ type
property OnDisplayLookup: TDisplayLookup read F_DisplayLookup write F_DisplayLookup; property OnDisplayLookup: TDisplayLookup read F_DisplayLookup write F_DisplayLookup;
end; end;
procedure RegisterExDBGridSortEngine(ExDBGridSortEngineClass:TExDBGridSortEngineClass; DataSetClass:TDataSetClass); procedure RegisterRxDBGridSortEngine(RxDBGridSortEngineClass:TRxDBGridSortEngineClass; DataSetClass:TDataSetClass);
implementation implementation
uses Math, rxdconst, rxstrutils, rxdbgrid_findunit, rxdbgrid_columsunit, uses Math, rxdconst, rxstrutils, rxdbgrid_findunit, rxdbgrid_columsunit,
rxlookup, tooledit, LCLProc, rxfilterby, rxsortby; rxlookup, tooledit, LCLProc, rxfilterby, rxsortby;
var var
ExDBGridSortEngineList:TStringList; RxDBGridSortEngineList:TStringList;
procedure RegisterExDBGridSortEngine(ExDBGridSortEngineClass:TExDBGridSortEngineClass; DataSetClass:TDataSetClass); procedure RegisterRxDBGridSortEngine(RxDBGridSortEngineClass:TRxDBGridSortEngineClass; DataSetClass:TDataSetClass);
var var
Pos:integer; Pos:integer;
ExDBGridSortEngine:TExDBGridSortEngine; RxDBGridSortEngine:TRxDBGridSortEngine;
begin begin
if not ExDBGridSortEngineList.Find(DataSetClass.ClassName, Pos) then if not RxDBGridSortEngineList.Find(DataSetClass.ClassName, Pos) then
begin begin
ExDBGridSortEngine:=ExDBGridSortEngineClass.Create; RxDBGridSortEngine:=RxDBGridSortEngineClass.Create;
ExDBGridSortEngine.FDataSetClass:=DataSetClass; RxDBGridSortEngine.FDataSetClass:=DataSetClass;
ExDBGridSortEngineList.AddObject(DataSetClass.ClassName, ExDBGridSortEngine); RxDBGridSortEngineList.AddObject(DataSetClass.ClassName, RxDBGridSortEngine);
end end
end; end;
@@ -856,8 +862,8 @@ begin
if Assigned(DataSource) and Assigned(DataSource.DataSet) and DataSource.DataSet.Active then if Assigned(DataSource) and Assigned(DataSource.DataSet) and DataSource.DataSet.Active then
begin begin
S:=DataSource.DataSet.ClassName; S:=DataSource.DataSet.ClassName;
if ExDBGridSortEngineList.Find(S, Pos) then if RxDBGridSortEngineList.Find(S, Pos) then
FSortEngine:=ExDBGridSortEngineList.Objects[Pos] as TExDBGridSortEngine FSortEngine:=RxDBGridSortEngineList.Objects[Pos] as TRxDBGridSortEngine
else else
FSortEngine:=nil; FSortEngine:=nil;
FSortField:=nil; FSortField:=nil;
@@ -1221,6 +1227,13 @@ begin
F_PopupMenu.Items[6].Enabled:=rdgAllowColumnsForm in FOptionsRx; F_PopupMenu.Items[6].Enabled:=rdgAllowColumnsForm in FOptionsRx;
end; end;
function TRxDBGrid.SortEngineOptions: TRxSortEngineOptions;
begin
Result:=[];
if rdgCaseInsensitiveSort in FOptionsRx then
Include(Result, seoCaseInsensitiveSort);
end;
procedure TRxDBGrid.OnIniSave(Sender: TObject); procedure TRxDBGrid.OnIniSave(Sender: TObject);
var var
i:integer; i:integer;
@@ -1287,7 +1300,7 @@ begin
begin begin
FSortField:=DataSource.DataSet.FindField(ColumName); FSortField:=DataSource.DataSet.FindField(ColumName);
if Assigned(FSortField) then if Assigned(FSortField) then
FSortEngine.Sort(FSortField, DataSource.DataSet, FSortOrder=smUp); FSortEngine.Sort(FSortField, DataSource.DataSet, FSortOrder=smUp, SortEngineOptions);
end; end;
end end
end; end;
@@ -1605,8 +1618,8 @@ begin
if Value then if Value then
begin begin
S:=DataSource.DataSet.ClassName; S:=DataSource.DataSet.ClassName;
if ExDBGridSortEngineList.Find(S, Pos) then if RxDBGridSortEngineList.Find(S, Pos) then
FSortEngine:=ExDBGridSortEngineList.Objects[Pos] as TExDBGridSortEngine FSortEngine:=RxDBGridSortEngineList.Objects[Pos] as TRxDBGridSortEngine
else else
FSortEngine:=nil; FSortEngine:=nil;
end end
@@ -1743,7 +1756,7 @@ begin
FSortField:=AField; FSortField:=AField;
FSortOrder:=smUp; FSortOrder:=smUp;
end; end;
FSortEngine.Sort(FSortField, DataSource.DataSet, FSortOrder=smUp); FSortEngine.Sort(FSortField, DataSource.DataSet, FSortOrder=smUp, SortEngineOptions);
end; end;
// if Assigned(FOnTitleBtnClick) then FOnTitleBtnClick(Self, ACol, AField); // if Assigned(FOnTitleBtnClick) then FOnTitleBtnClick(Self, ACol, AField);
end; end;
@@ -2566,6 +2579,7 @@ begin
begin begin
FSortField:=nil; FSortField:=nil;
rxSortByForm:=TrxSortByForm.Create(Application); rxSortByForm:=TrxSortByForm.Create(Application);
rxSortByForm.CheckBox1.Checked:=rdgCaseInsensitiveSort in FOptionsRx;
o:=not (FSortOrder=smDown); o:=not (FSortOrder=smDown);
if rxSortByForm.Execute(DataSource.DataSet,F_SortListField,o) then if rxSortByForm.Execute(DataSource.DataSet,F_SortListField,o) then
begin begin
@@ -2578,6 +2592,12 @@ begin
FSortOrder:=smUp FSortOrder:=smUp
else else
FSortOrder:=smDown; FSortOrder:=smDown;
if rxSortByForm.CheckBox1.Checked then
Include(FOptionsRx, rdgCaseInsensitiveSort)
else
Exclude(FOptionsRx, rdgCaseInsensitiveSort);
FSortEngine.SortList(s, DataSource.DataSet, o); FSortEngine.SortList(s, DataSource.DataSet, o);
end; end;
FreeAndNil(rxSortByForm); FreeAndNil(rxSortByForm);
@@ -3332,7 +3352,7 @@ end;
{ TExDBGridSortEngine } { TExDBGridSortEngine }
procedure TExDBGridSortEngine.SortList(ListField: string; ADataSet: TDataSet; procedure TRxDBGridSortEngine.SortList(ListField: string; ADataSet: TDataSet;
Asc: boolean); Asc: boolean);
begin begin
@@ -3342,14 +3362,14 @@ initialization
{$I rxdbgrid.lrs} {$I rxdbgrid.lrs}
// {$I rx_markerdown.lrs} // {$I rx_markerdown.lrs}
ExDBGridSortEngineList:=TStringList.Create; RxDBGridSortEngineList:=TStringList.Create;
ExDBGridSortEngineList.Sorted:=true; RxDBGridSortEngineList.Sorted:=true;
finalization finalization
while (ExDBGridSortEngineList.Count>0) do while (RxDBGridSortEngineList.Count>0) do
begin begin
ExDBGridSortEngineList.Objects[0].Free; RxDBGridSortEngineList.Objects[0].Free;
ExDBGridSortEngineList.Delete(0); RxDBGridSortEngineList.Delete(0);
end; end;
ExDBGridSortEngineList.Free; RxDBGridSortEngineList.Free;
end. end.

View File

@@ -103,11 +103,12 @@ resourcestring
sRxSortByFormCaption = 'Sort on field'; sRxSortByFormCaption = 'Sort on field';
sRxSortByFormAllFields = '&Fields in dataset:'; sRxSortByFormAllFields = '&Fields in dataset:';
sRxSortByFormSortFields = '&Selected fields:'; sRxSortByFormSortFields = '&Selected fields:';
sRxSortByFormSortOrder = 'Select field for sort data:'; sRxSortByFormSortOrder = 'Select f&ield for sort data:';
sRxSortByFormAddField = '&Add field'; sRxSortByFormAddField = '&Add field';
sRxSortByFormRemoveField = '&Remove'; sRxSortByFormRemoveField = '&Remove';
sRxSortByFormMoveUpField = '&Up'; sRxSortByFormMoveUpField = '&Up';
sRxSortByFormMoveDnField = '&Down'; sRxSortByFormMoveDnField = '&Down';
sRxSortByFormCaseInsens = '&Case insensitive sort';
//TRxMemoryData //TRxMemoryData
SMemNoRecords = 'No data found'; SMemNoRecords = 'No data found';

View File

@@ -1,16 +1,16 @@
object rxSortByForm: TrxSortByForm object rxSortByForm: TrxSortByForm
Left = 450 Left = 450
Height = 337 Height = 411
Top = 270 Top = 243
Width = 583 Width = 684
ActiveControl = AddBtn ActiveControl = AddBtn
Caption = 'Sort by fields' Caption = 'Sort by fields'
ClientHeight = 337 ClientHeight = 411
ClientWidth = 583 ClientWidth = 684
OnClose = FormClose OnClose = FormClose
OnCreate = FormCreate OnCreate = FormCreate
Position = poScreenCenter Position = poScreenCenter
LCLVersion = '0.9.27' LCLVersion = '0.9.29'
object Label1: TLabel object Label1: TLabel
AnchorSideLeft.Control = Owner AnchorSideLeft.Control = Owner
AnchorSideTop.Control = Owner AnchorSideTop.Control = Owner
@@ -27,7 +27,7 @@ object rxSortByForm: TrxSortByForm
AnchorSideLeft.Control = AddBtn AnchorSideLeft.Control = AddBtn
AnchorSideLeft.Side = asrBottom AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = Owner AnchorSideTop.Control = Owner
Left = 352 Left = 423
Height = 18 Height = 18
Top = 6 Top = 6
Width = 75 Width = 75
@@ -42,7 +42,7 @@ object rxSortByForm: TrxSortByForm
AnchorSideBottom.Side = asrBottom AnchorSideBottom.Side = asrBottom
Left = 6 Left = 6
Height = 18 Height = 18
Top = 265 Top = 316
Width = 116 Width = 116
Anchors = [akLeft, akBottom] Anchors = [akLeft, akBottom]
BorderSpacing.Left = 6 BorderSpacing.Left = 6
@@ -58,10 +58,10 @@ object rxSortByForm: TrxSortByForm
AnchorSideRight.Control = Owner AnchorSideRight.Control = Owner
AnchorSideRight.Side = asrBottom AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = ComboBox1 AnchorSideBottom.Control = ComboBox1
Left = 352 Left = 423
Height = 216 Height = 267
Top = 30 Top = 30
Width = 225 Width = 255
Anchors = [akTop, akLeft, akRight, akBottom] Anchors = [akTop, akLeft, akRight, akBottom]
BorderSpacing.Around = 6 BorderSpacing.Around = 6
ItemHeight = 0 ItemHeight = 0
@@ -75,7 +75,7 @@ object rxSortByForm: TrxSortByForm
AnchorSideTop.Side = asrBottom AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = AddBtn AnchorSideRight.Control = AddBtn
AnchorSideRight.Side = asrBottom AnchorSideRight.Side = asrBottom
Left = 197 Left = 268
Height = 35 Height = 35
Top = 71 Top = 71
Width = 149 Width = 149
@@ -109,7 +109,7 @@ object rxSortByForm: TrxSortByForm
AnchorSideTop.Side = asrBottom AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = AddBtn AnchorSideRight.Control = AddBtn
AnchorSideRight.Side = asrBottom AnchorSideRight.Side = asrBottom
Left = 197 Left = 268
Height = 36 Height = 36
Top = 112 Top = 112
Width = 149 Width = 149
@@ -142,7 +142,7 @@ object rxSortByForm: TrxSortByForm
AnchorSideTop.Side = asrBottom AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = AddBtn AnchorSideRight.Control = AddBtn
AnchorSideRight.Side = asrBottom AnchorSideRight.Side = asrBottom
Left = 197 Left = 268
Height = 36 Height = 36
Top = 154 Top = 154
Width = 149 Width = 149
@@ -174,11 +174,11 @@ object rxSortByForm: TrxSortByForm
AnchorSideLeft.Side = asrBottom AnchorSideLeft.Side = asrBottom
AnchorSideRight.Control = Owner AnchorSideRight.Control = Owner
AnchorSideRight.Side = asrBottom AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = ButtonPanel1 AnchorSideBottom.Control = CheckBox1
Left = 128 Left = 128
Height = 31 Height = 31
Top = 252 Top = 303
Width = 449 Width = 550
Anchors = [akLeft, akRight, akBottom] Anchors = [akLeft, akRight, akBottom]
BorderSpacing.Around = 6 BorderSpacing.Around = 6
ItemHeight = 0 ItemHeight = 0
@@ -189,12 +189,13 @@ object rxSortByForm: TrxSortByForm
AnchorSideLeft.Control = Owner AnchorSideLeft.Control = Owner
AnchorSideTop.Control = Label1 AnchorSideTop.Control = Label1
AnchorSideTop.Side = asrBottom AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = AddBtn
AnchorSideBottom.Control = ComboBox1 AnchorSideBottom.Control = ComboBox1
Left = 6 Left = 6
Height = 216 Height = 267
Top = 30 Top = 30
Width = 185 Width = 256
Anchors = [akTop, akLeft, akBottom] Anchors = [akTop, akLeft, akRight, akBottom]
BorderSpacing.Around = 6 BorderSpacing.Around = 6
ItemHeight = 0 ItemHeight = 0
OnDblClick = ListBox1DblClick OnDblClick = ListBox1DblClick
@@ -202,10 +203,10 @@ object rxSortByForm: TrxSortByForm
TopIndex = -1 TopIndex = -1
end end
object AddBtn: TBitBtn object AddBtn: TBitBtn
AnchorSideLeft.Control = ListBox1 AnchorSideLeft.Control = Owner
AnchorSideLeft.Side = asrBottom AnchorSideLeft.Side = asrCenter
AnchorSideTop.Control = ListBox1 AnchorSideTop.Control = ListBox1
Left = 197 Left = 268
Height = 35 Height = 35
Top = 30 Top = 30
Width = 149 Width = 149
@@ -232,10 +233,24 @@ object rxSortByForm: TrxSortByForm
end end
object ButtonPanel1: TButtonPanel object ButtonPanel1: TButtonPanel
Left = 6 Left = 6
Height = 42 Height = 40
Top = 289 Top = 365
Width = 571 Width = 672
TabOrder = 7 TabOrder = 7
ShowButtons = [pbOK, pbCancel, pbHelp] ShowButtons = [pbOK, pbCancel, pbHelp]
end end
object CheckBox1: TCheckBox
AnchorSideLeft.Control = Owner
AnchorSideTop.Control = Label4
AnchorSideTop.Side = asrBottom
AnchorSideBottom.Control = ButtonPanel1
Left = 6
Height = 19
Top = 340
Width = 163
Anchors = [akLeft, akBottom]
BorderSpacing.Around = 6
Caption = 'Case insensitive sort'
TabOrder = 8
end
end end

View File

@@ -1,33 +1,33 @@
{ Este es un archivo de recurso de Lazarus generado automáticamente } { Это - файл ресурсов, автоматически созданный lazarus }
LazarusResources.Add('TrxSortByForm','FORMDATA',[ LazarusResources.Add('TrxSortByForm','FORMDATA',[
'TPF0'#13'TrxSortByForm'#12'rxSortByForm'#4'Left'#3#194#1#6'Height'#3'Q'#1#3 'TPF0'#13'TrxSortByForm'#12'rxSortByForm'#4'Left'#3#194#1#6'Height'#3#155#1#3
+'Top'#3#14#1#5'Width'#3'G'#2#13'ActiveControl'#7#6'AddBtn'#7'Caption'#6#14'S' +'Top'#3#243#0#5'Width'#3#172#2#13'ActiveControl'#7#6'AddBtn'#7'Caption'#6#14
+'ort by fields'#12'ClientHeight'#3'Q'#1#11'ClientWidth'#3'G'#2#7'OnClose'#7#9 +'Sort by fields'#12'ClientHeight'#3#155#1#11'ClientWidth'#3#172#2#7'OnClose'
+'FormClose'#8'OnCreate'#7#10'FormCreate'#8'Position'#7#14'poScreenCenter'#10 +#7#9'FormClose'#8'OnCreate'#7#10'FormCreate'#8'Position'#7#14'poScreenCenter'
+'LCLVersion'#6#6'0.9.27'#0#6'TLabel'#6'Label1'#22'AnchorSideLeft.Control'#7#5 +#10'LCLVersion'#6#6'0.9.29'#0#6'TLabel'#6'Label1'#22'AnchorSideLeft.Control'
+'Owner'#21'AnchorSideTop.Control'#7#5'Owner'#4'Left'#2#6#6'Height'#2#18#3'To' +#7#5'Owner'#21'AnchorSideTop.Control'#7#5'Owner'#4'Left'#2#6#6'Height'#2#18#3
+'p'#2#6#5'Width'#3#131#0#20'BorderSpacing.Around'#2#6#7'Caption'#6#20'&Field' +'Top'#2#6#5'Width'#3#131#0#20'BorderSpacing.Around'#2#6#7'Caption'#6#20'&Fie'
+'s for sorting:'#12'FocusControl'#7#8'ListBox1'#11'ParentColor'#8#0#0#6'TLab' +'lds for sorting:'#12'FocusControl'#7#8'ListBox1'#11'ParentColor'#8#0#0#6'TL'
+'el'#6'Label2'#22'AnchorSideLeft.Control'#7#6'AddBtn'#19'AnchorSideLeft.Side' +'abel'#6'Label2'#22'AnchorSideLeft.Control'#7#6'AddBtn'#19'AnchorSideLeft.Si'
+#7#9'asrBottom'#21'AnchorSideTop.Control'#7#5'Owner'#4'Left'#3'`'#1#6'Height' +'de'#7#9'asrBottom'#21'AnchorSideTop.Control'#7#5'Owner'#4'Left'#3#167#1#6'H'
+#2#18#3'Top'#2#6#5'Width'#2'K'#20'BorderSpacing.Around'#2#6#7'Caption'#6#12 +'eight'#2#18#3'Top'#2#6#5'Width'#2'K'#20'BorderSpacing.Around'#2#6#7'Caption'
+'&All fields:'#12'FocusControl'#7#8'ListBox2'#11'ParentColor'#8#0#0#6'TLabel' +#6#12'&All fields:'#12'FocusControl'#7#8'ListBox2'#11'ParentColor'#8#0#0#6'T'
+#6'Label4'#22'AnchorSideLeft.Control'#7#5'Owner'#24'AnchorSideBottom.Control' +'Label'#6'Label4'#22'AnchorSideLeft.Control'#7#5'Owner'#24'AnchorSideBottom.'
+#7#9'ComboBox1'#21'AnchorSideBottom.Side'#7#9'asrBottom'#4'Left'#2#6#6'Heigh' +'Control'#7#9'ComboBox1'#21'AnchorSideBottom.Side'#7#9'asrBottom'#4'Left'#2#6
+'t'#2#18#3'Top'#3#9#1#5'Width'#2't'#7'Anchors'#11#6'akLeft'#8'akBottom'#0#18 +#6'Height'#2#18#3'Top'#3'<'#1#5'Width'#2't'#7'Anchors'#11#6'akLeft'#8'akBott'
+'BorderSpacing.Left'#2#6#7'Caption'#6#17'Select sort order'#12'FocusControl' +'om'#0#18'BorderSpacing.Left'#2#6#7'Caption'#6#17'Select sort order'#12'Focu'
+#7#9'ComboBox1'#11'ParentColor'#8#0#0#8'TListBox'#8'ListBox2'#22'AnchorSideL' +'sControl'#7#9'ComboBox1'#11'ParentColor'#8#0#0#8'TListBox'#8'ListBox2'#22'A'
+'eft.Control'#7#6'AddBtn'#19'AnchorSideLeft.Side'#7#9'asrBottom'#21'AnchorSi' +'nchorSideLeft.Control'#7#6'AddBtn'#19'AnchorSideLeft.Side'#7#9'asrBottom'#21
+'deTop.Control'#7#6'Label2'#18'AnchorSideTop.Side'#7#9'asrBottom'#23'AnchorS' +'AnchorSideTop.Control'#7#6'Label2'#18'AnchorSideTop.Side'#7#9'asrBottom'#23
+'ideRight.Control'#7#5'Owner'#20'AnchorSideRight.Side'#7#9'asrBottom'#24'Anc' +'AnchorSideRight.Control'#7#5'Owner'#20'AnchorSideRight.Side'#7#9'asrBottom'
+'horSideBottom.Control'#7#9'ComboBox1'#4'Left'#3'`'#1#6'Height'#3#216#0#3'To' +#24'AnchorSideBottom.Control'#7#9'ComboBox1'#4'Left'#3#167#1#6'Height'#3#11#1
+'p'#2#30#5'Width'#3#225#0#7'Anchors'#11#5'akTop'#6'akLeft'#7'akRight'#8'akBo' +#3'Top'#2#30#5'Width'#3#255#0#7'Anchors'#11#5'akTop'#6'akLeft'#7'akRight'#8
+'ttom'#0#20'BorderSpacing.Around'#2#6#10'ItemHeight'#2#0#10'OnDblClick'#7#16 +'akBottom'#0#20'BorderSpacing.Around'#2#6#10'ItemHeight'#2#0#10'OnDblClick'#7
+'ListBox2DblClick'#8'TabOrder'#2#0#8'TopIndex'#2#255#0#0#7'TBitBtn'#9'Remove' +#16'ListBox2DblClick'#8'TabOrder'#2#0#8'TopIndex'#2#255#0#0#7'TBitBtn'#9'Rem'
+'Btn'#22'AnchorSideLeft.Control'#7#6'AddBtn'#21'AnchorSideTop.Control'#7#6'A' +'oveBtn'#22'AnchorSideLeft.Control'#7#6'AddBtn'#21'AnchorSideTop.Control'#7#6
+'ddBtn'#18'AnchorSideTop.Side'#7#9'asrBottom'#23'AnchorSideRight.Control'#7#6 +'AddBtn'#18'AnchorSideTop.Side'#7#9'asrBottom'#23'AnchorSideRight.Control'#7
+'AddBtn'#20'AnchorSideRight.Side'#7#9'asrBottom'#4'Left'#3#197#0#6'Height'#2 +#6'AddBtn'#20'AnchorSideRight.Side'#7#9'asrBottom'#4'Left'#3#12#1#6'Height'#2
+'#'#3'Top'#2'G'#5'Width'#3#149#0#7'Anchors'#11#5'akTop'#6'akLeft'#7'akRight' +'#'#3'Top'#2'G'#5'Width'#3#149#0#7'Anchors'#11#5'akTop'#6'akLeft'#7'akRight'
+#0#8'AutoSize'#9#17'BorderSpacing.Top'#2#6#7'Caption'#6#7'&Remove'#10'Glyph.' +#0#8'AutoSize'#9#17'BorderSpacing.Top'#2#6#7'Caption'#6#7'&Remove'#10'Glyph.'
+'Data'#10#142#1#0#0#138#1#0#0'BM'#138#1#0#0#0#0#0#0'v'#0#0#0'('#0#0#0#24#0#0 +'Data'#10#142#1#0#0#138#1#0#0'BM'#138#1#0#0#0#0#0#0'v'#0#0#0'('#0#0#0#24#0#0
@@ -46,67 +46,73 @@ LazarusResources.Add('TrxSortByForm','FORMDATA',[
+'TabOrder'#2#2#0#0#7'TBitBtn'#5'UpBtn'#22'AnchorSideLeft.Control'#7#6'AddBtn' +'TabOrder'#2#2#0#0#7'TBitBtn'#5'UpBtn'#22'AnchorSideLeft.Control'#7#6'AddBtn'
+#21'AnchorSideTop.Control'#7#9'RemoveBtn'#18'AnchorSideTop.Side'#7#9'asrBott' +#21'AnchorSideTop.Control'#7#9'RemoveBtn'#18'AnchorSideTop.Side'#7#9'asrBott'
+'om'#23'AnchorSideRight.Control'#7#6'AddBtn'#20'AnchorSideRight.Side'#7#9'as' +'om'#23'AnchorSideRight.Control'#7#6'AddBtn'#20'AnchorSideRight.Side'#7#9'as'
+'rBottom'#4'Left'#3#197#0#6'Height'#2'$'#3'Top'#2'p'#5'Width'#3#149#0#7'Anch' +'rBottom'#4'Left'#3#12#1#6'Height'#2'$'#3'Top'#2'p'#5'Width'#3#149#0#7'Ancho'
+'ors'#11#5'akTop'#6'akLeft'#7'akRight'#0#8'AutoSize'#9#17'BorderSpacing.Top' +'rs'#11#5'akTop'#6'akLeft'#7'akRight'#0#8'AutoSize'#9#17'BorderSpacing.Top'#2
+#2#6#7'Caption'#6#8'M&ove up'#10'Glyph.Data'#10#154#1#0#0#150#1#0#0'BM'#150#1 +#6#7'Caption'#6#8'M&ove up'#10'Glyph.Data'#10#154#1#0#0#150#1#0#0'BM'#150#1#0
+#0#0#0#0#0#0'v'#0#0#0'('#0#0#0#23#0#0#0#24#0#0#0#1#0#4#0#0#0#0#0' '#1#0#0#0#0 +#0#0#0#0#0'v'#0#0#0'('#0#0#0#23#0#0#0#24#0#0#0#1#0#4#0#0#0#0#0' '#1#0#0#0#0#0
+#0#0#0#0#0#0#16#0#0#0#16#0#0#0#0#0#0#0#0#0#128#0#0#128#0#0#0#128#128#0#128#0 +#0#0#0#0#0#16#0#0#0#16#0#0#0#0#0#0#0#0#0#128#0#0#128#0#0#0#128#128#0#128#0#0
+#0#0#128#0#128#0#128#128#0#0#192#192#192#0#128#128#128#0#0#0#200#0#0#255#0#0 +#0#128#0#128#0#128#128#0#0#192#192#192#0#128#128#128#0#0#0#200#0#0#255#0#0#0
+#0#255#255#0#255#0#0#0#255#0#255#0#255#255#0#0#255#255#255#0'wwwwwwwwwwwpwww' +#255#255#0#255#0#0#0#255#0#255#0#255#255#0#0#255#255#255#0'wwwwwwwwwwwpwwwww'
+'wwwwwwwwpwwwwwwwwwwwpwwwx'#0#0#0#8'wwwpwwwp'#153#153#153#159'wwwpwwwp'#153 +'wwwwwwpwwwwwwwwwwwpwwwx'#0#0#0#8'wwwpwwwp'#153#153#153#159'wwwpwwwp'#153#153
+#153#153#159'wwwpwwwp'#153#153#153#159'wwwpwwwp'#153#153#153#159'wwwpwwwp' +#153#159'wwwpwwwp'#153#153#153#159'wwwpwwwp'#153#153#153#159'wwwpwwwp'#153
+#153#153#153#159'wwwpwwwp'#153#153#153#159'wwwpx'#0#0#0#153#153#153#152#136 +#153#153#159'wwwpwwwp'#153#153#153#159'wwwpx'#0#0#0#153#153#153#152#136#136
+#136#143'pw'#9#153#153#153#153#153#153#153#153#247'pwp'#153#153#153#153#153 +#143'pw'#9#153#153#153#153#153#153#153#153#247'pwp'#153#153#153#153#153#153
+#153#153#159'wpww'#9#153#153#153#153#153#153#247'wpwwp'#153#153#153#153#153 +#153#159'wpww'#9#153#153#153#153#153#153#247'wpwwp'#153#153#153#153#153#159
+#159'wwpwww'#9#153#153#153#153#247'wwpwwwp'#153#153#153#159'wwwpwwww'#9#153 +'wwpwww'#9#153#153#153#153#247'wwpwwwp'#153#153#153#159'wwwpwwww'#9#153#153
+#153#247'wwwpwwwwp'#153#159'wwwwpwwwww'#9#247'wwwwpwwwwwwwwwwpwwwwwwwwwwwpw' +#247'wwwpwwwwp'#153#159'wwwwpwwwww'#9#247'wwwwpwwwww'#127'wwwwwpwwwwwwwwwwwp'
+'wwwwwwwwwwpwwwwwwwwwwwp'#9'NumGlyphs'#2#0#7'OnClick'#7#10'UpBtnClick'#8'Tab' +'wwwwwwwwwwwpwwwwwwwwwwwp'#9'NumGlyphs'#2#0#7'OnClick'#7#10'UpBtnClick'#8'Ta'
+'Order'#2#3#0#0#7'TBitBtn'#7'DownBtn'#22'AnchorSideLeft.Control'#7#6'AddBtn' +'bOrder'#2#3#0#0#7'TBitBtn'#7'DownBtn'#22'AnchorSideLeft.Control'#7#6'AddBtn'
+#21'AnchorSideTop.Control'#7#5'UpBtn'#18'AnchorSideTop.Side'#7#9'asrBottom' +#21'AnchorSideTop.Control'#7#5'UpBtn'#18'AnchorSideTop.Side'#7#9'asrBottom'
+#23'AnchorSideRight.Control'#7#6'AddBtn'#20'AnchorSideRight.Side'#7#9'asrBot' +#23'AnchorSideRight.Control'#7#6'AddBtn'#20'AnchorSideRight.Side'#7#9'asrBot'
+'tom'#4'Left'#3#197#0#6'Height'#2'$'#3'Top'#3#154#0#5'Width'#3#149#0#7'Ancho' +'tom'#4'Left'#3#12#1#6'Height'#2'$'#3'Top'#3#154#0#5'Width'#3#149#0#7'Anchor'
,'rs'#11#5'akTop'#6'akLeft'#7'akRight'#0#8'AutoSize'#9#17'BorderSpacing.Top'#2 ,'s'#11#5'akTop'#6'akLeft'#7'akRight'#0#8'AutoSize'#9#17'BorderSpacing.Top'#2
+#6#7'Caption'#6#10'&Move down'#10'Glyph.Data'#10#154#1#0#0#150#1#0#0'BM'#150 +#6#7'Caption'#6#10'&Move down'#10'Glyph.Data'#10#154#1#0#0#150#1#0#0'BM'#150
+#1#0#0#0#0#0#0'v'#0#0#0'('#0#0#0#23#0#0#0#24#0#0#0#1#0#4#0#0#0#0#0' '#1#0#0#0 +#1#0#0#0#0#0#0'v'#0#0#0'('#0#0#0#23#0#0#0#24#0#0#0#1#0#4#0#0#0#0#0' '#1#0#0#0
+#0#0#0#0#0#0#0#16#0#0#0#16#0#0#0#0#0#0#0#0#0#128#0#0#128#0#0#0#128#128#0#128 +#0#0#0#0#0#0#0#16#0#0#0#16#0#0#0#0#0#0#0#0#0#128#0#0#128#0#0#0#128#128#0#128
+#0#0#0#128#0#128#0#128#128#0#0#192#192#192#0#128#128#128#0#0#0#200#0#0#255#0 +#0#0#0#128#0#128#0#128#128#0#0#192#192#192#0#128#128#128#0#0#0#200#0#0#255#0
+#0#0#255#255#0#255#0#0#0#255#0#255#0#255#255#0#0#255#255#255#0'wwwwwwwwwwwpw' +#0#0#255#255#0#255#0#0#0#255#0#255#0#255#255#0#0#255#255#255#0'wwwwwwwwwwwpw'
+'wwwwwwwwwwpwwwwwwwwwwwpwwwwwwwwwwpwwwww'#9#247'wwwwpwwwwp'#153#159'wwwwpww' +'wwwwwwwwwwpwwwwwwwwwwwpwwwww'#127'wwwwwpwwwww'#9#247'wwwwpwwwwp'#153#159'ww'
+'ww'#9#153#153#247'wwwpwwwp'#153#153#153#159'wwwpwww'#9#153#153#153#153#247 +'wwpwwww'#9#153#153#247'wwwpwwwp'#153#153#153#159'wwwpwww'#9#153#153#153#153
+'wwpwwp'#153#153#153#153#153#159'wwpww'#9#153#153#153#153#153#153#247'wpwp' +#247'wwpwwp'#153#153#153#153#153#159'wwpww'#9#153#153#153#153#153#153#247'wp'
+#153#153#153#153#153#153#153#159'wpw'#9#153#153#153#153#153#153#153#153#247 +'wp'#153#153#153#153#153#153#153#159'wpw'#9#153#153#153#153#153#153#153#153
+'px'#0#0#0#153#153#153#152#136#136#143'pwwwp'#153#153#153#159'wwwpwwwp'#153 +#247'px'#0#0#0#153#153#153#152#136#136#143'pwwwp'#153#153#153#159'wwwpwwwp'
+#153#153#159'wwwpwwwp'#153#153#153#159'wwwpwwwp'#153#153#153#159'wwwpwwwp' +#153#153#153#159'wwwpwwwp'#153#153#153#159'wwwpwwwp'#153#153#153#159'wwwpwww'
+#153#153#153#159'wwwpwwwp'#153#153#153#159'wwwpwwwx'#0#0#0#8'wwwpwwwwwwwwwww' +'p'#153#153#153#159'wwwpwwwp'#153#153#153#159'wwwpwwwx'#0#0#0#8'wwwpwwwwwwww'
+'pwwwwwwwwwwwpwwwwwwwwwwwp'#9'NumGlyphs'#2#0#7'OnClick'#7#12'DownBtnClick'#8 +'wwwpwwwwwwwwwwwpwwwwwwwwwwwp'#9'NumGlyphs'#2#0#7'OnClick'#7#12'DownBtnClick'
+'TabOrder'#2#4#0#0#9'TComboBox'#9'ComboBox1'#22'AnchorSideLeft.Control'#7#6 +#8'TabOrder'#2#4#0#0#9'TComboBox'#9'ComboBox1'#22'AnchorSideLeft.Control'#7#6
+'Label4'#19'AnchorSideLeft.Side'#7#9'asrBottom'#23'AnchorSideRight.Control'#7 +'Label4'#19'AnchorSideLeft.Side'#7#9'asrBottom'#23'AnchorSideRight.Control'#7
+#5'Owner'#20'AnchorSideRight.Side'#7#9'asrBottom'#24'AnchorSideBottom.Contro' +#5'Owner'#20'AnchorSideRight.Side'#7#9'asrBottom'#24'AnchorSideBottom.Contro'
+'l'#7#12'ButtonPanel1'#4'Left'#3#128#0#6'Height'#2#31#3'Top'#3#252#0#5'Width' +'l'#7#9'CheckBox1'#4'Left'#3#128#0#6'Height'#2#31#3'Top'#3'/'#1#5'Width'#3'&'
+#3#193#1#7'Anchors'#11#6'akLeft'#7'akRight'#8'akBottom'#0#20'BorderSpacing.A' +#2#7'Anchors'#11#6'akLeft'#7'akRight'#8'akBottom'#0#20'BorderSpacing.Around'
+'round'#2#6#10'ItemHeight'#2#0#5'Style'#7#14'csDropDownList'#8'TabOrder'#2#5 +#2#6#10'ItemHeight'#2#0#5'Style'#7#14'csDropDownList'#8'TabOrder'#2#5#0#0#8
+#0#0#8'TListBox'#8'ListBox1'#22'AnchorSideLeft.Control'#7#5'Owner'#21'Anchor' +'TListBox'#8'ListBox1'#22'AnchorSideLeft.Control'#7#5'Owner'#21'AnchorSideTo'
+'SideTop.Control'#7#6'Label1'#18'AnchorSideTop.Side'#7#9'asrBottom'#24'Ancho' +'p.Control'#7#6'Label1'#18'AnchorSideTop.Side'#7#9'asrBottom'#23'AnchorSideR'
+'rSideBottom.Control'#7#9'ComboBox1'#4'Left'#2#6#6'Height'#3#216#0#3'Top'#2 +'ight.Control'#7#6'AddBtn'#24'AnchorSideBottom.Control'#7#9'ComboBox1'#4'Lef'
+#30#5'Width'#3#185#0#7'Anchors'#11#5'akTop'#6'akLeft'#8'akBottom'#0#20'Borde' +'t'#2#6#6'Height'#3#11#1#3'Top'#2#30#5'Width'#3#0#1#7'Anchors'#11#5'akTop'#6
+'rSpacing.Around'#2#6#10'ItemHeight'#2#0#10'OnDblClick'#7#16'ListBox1DblClic' +'akLeft'#7'akRight'#8'akBottom'#0#20'BorderSpacing.Around'#2#6#10'ItemHeight'
+'k'#8'TabOrder'#2#6#8'TopIndex'#2#255#0#0#7'TBitBtn'#6'AddBtn'#22'AnchorSide' +#2#0#10'OnDblClick'#7#16'ListBox1DblClick'#8'TabOrder'#2#6#8'TopIndex'#2#255
+'Left.Control'#7#8'ListBox1'#19'AnchorSideLeft.Side'#7#9'asrBottom'#21'Ancho' +#0#0#7'TBitBtn'#6'AddBtn'#22'AnchorSideLeft.Control'#7#5'Owner'#19'AnchorSid'
+'rSideTop.Control'#7#8'ListBox1'#4'Left'#3#197#0#6'Height'#2'#'#3'Top'#2#30#5 +'eLeft.Side'#7#9'asrCenter'#21'AnchorSideTop.Control'#7#8'ListBox1'#4'Left'#3
+'Width'#3#149#0#8'AutoSize'#9#7'Caption'#6#18'&Add field to sort'#10'Glyph.D' +#12#1#6'Height'#2'#'#3'Top'#2#30#5'Width'#3#149#0#8'AutoSize'#9#7'Caption'#6
+'ata'#10#142#1#0#0#138#1#0#0'BM'#138#1#0#0#0#0#0#0'v'#0#0#0'('#0#0#0#24#0#0#0 +#18'&Add field to sort'#10'Glyph.Data'#10#142#1#0#0#138#1#0#0'BM'#138#1#0#0#0
+#23#0#0#0#1#0#4#0#0#0#0#0#20#1#0#0#0#0#0#0#0#0#0#0#16#0#0#0#16#0#0#0#0#0#0#0 +#0#0#0'v'#0#0#0'('#0#0#0#24#0#0#0#23#0#0#0#1#0#4#0#0#0#0#0#20#1#0#0#0#0#0#0#0
+#0#0#128#0#0#128#0#0#0#128#128#0#128#0#0#0#128#0#128#0#128#128#0#0#192#192 +#0#0#0#16#0#0#0#16#0#0#0#0#0#0#0#0#0#128#0#0#128#0#0#0#128#128#0#128#0#0#0
+#192#0#128#128#128#0#0#0#200#0#0#255#0#0#0#255#255#0#255#0#0#0#255#0#255#0 +#128#0#128#0#128#128#0#0#192#192#192#0#128#128#128#0#0#0#200#0#0#255#0#0#0
+#255#255#0#0#255#255#255#0'wwwwwwwwwwwwwwwwwwxwwwwwwwwwww'#0'wwwwwwwwwwp'#144 +#255#255#0#255#0#0#0#255#0#255#0#255#255#0#0#255#255#255#0'wwwwwwwwwwwwwwwww'
+'wwwwwwwwww'#9#144'wwwwwwwwwp'#153#144'wwwwwwwww'#9#153#144'wwwwwwwwp'#153 +'wxwwwwwwwwwww'#0'wwwwwwwwwwp'#144'wwwwwwwwww'#9#144'wwwwwwwwwp'#153#144'www'
+#153#144#0#0#0#135'wwww'#9#153#153#153#153#153#153#7'wwwp'#153#153#153#153 +'wwwwww'#9#153#144'wwwwwwwwp'#153#153#144#0#0#0#135'wwww'#9#153#153#153#153
+#153#153#153#7'www'#9#153#153#153#153#153#153#153#7'ww'#153#153#153#153#153 +#153#153#7'wwwp'#153#153#153#153#153#153#153#7'www'#9#153#153#153#153#153#153
+#153#153#153#7'www'#249#153#153#153#153#153#153#153#7'www'#153#153#153#153 +#153#7'ww'#127#153#153#153#153#153#153#153#153#7'www'#249#153#153#153#153#153
+#153#153#153#7'wwww'#249#153#153#153#153#153#153#7'wwww'#153#153#152#255#255 +#153#153#7'www'#127#153#153#153#153#153#153#153#7'wwww'#249#153#153#153#153
+#255#135'wwwww'#249#153#152'wwwwwwwww'#153#152'wwwwwwwwww'#249#152'wwwwwwww' +#153#153#7'wwww'#127#153#153#152#255#255#255#135'wwwww'#249#153#152'wwwwwwww'
+'ww'#152'wwwwwwwwwww'#248'wwwwwwwwwwwwwwwwwwwwwwwwwwww'#9'NumGlyphs'#2#0#7 +'w'#127#153#152'wwwwwwwwww'#249#152'wwwwwwwwww'#127#152'wwwwwwwwwww'#248'www'
+'OnClick'#7#11'AddBtnClick'#8'TabOrder'#2#1#0#0#12'TButtonPanel'#12'ButtonPa' +'wwwwwwww'#127'wwwwwwwwwwwwwwwww'#9'NumGlyphs'#2#0#7'OnClick'#7#11'AddBtnCli'
+'nel1'#4'Left'#2#6#6'Height'#2'*'#3'Top'#3'!'#1#5'Width'#3';'#2#8'TabOrder'#2 +'ck'#8'TabOrder'#2#1#0#0#12'TButtonPanel'#12'ButtonPanel1'#4'Left'#2#6#6'Hei'
+#7#11'ShowButtons'#11#4'pbOK'#8'pbCancel'#6'pbHelp'#0#0#0#0 +'ght'#2'('#3'Top'#3'm'#1#5'Width'#3#160#2#8'TabOrder'#2#7#11'ShowButtons'#11
+#4'pbOK'#8'pbCancel'#6'pbHelp'#0#0#0#9'TCheckBox'#9'CheckBox1'#22'AnchorSide'
+'Left.Control'#7#5'Owner'#21'AnchorSideTop.Control'#7#6'Label4'#18'AnchorSid'
+'eTop.Side'#7#9'asrBottom'#24'AnchorSideBottom.Control'#7#12'ButtonPanel1'#4
+'Left'#2#6#6'Height'#2#19#3'Top'#3'T'#1#5'Width'#3#163#0#7'Anchors'#11#6'akL'
+'eft'#8'akBottom'#0#20'BorderSpacing.Around'#2#6#7'Caption'#6#21'Case insens'
+'itive sort'#8'TabOrder'#2#8#0#0#0
]); ]);

View File

@@ -15,6 +15,7 @@ type
TrxSortByForm = class(TForm) TrxSortByForm = class(TForm)
AddBtn: TBitBtn; AddBtn: TBitBtn;
ButtonPanel1: TButtonPanel; ButtonPanel1: TButtonPanel;
CheckBox1: TCheckBox;
ComboBox1: TComboBox; ComboBox1: TComboBox;
DownBtn: TBitBtn; DownBtn: TBitBtn;
Label1: TLabel; Label1: TLabel;
@@ -90,6 +91,7 @@ begin
RemoveBtn.Caption:=sRxSortByFormRemoveField; RemoveBtn.Caption:=sRxSortByFormRemoveField;
UpBtn.Caption:=sRxSortByFormMoveUpField; UpBtn.Caption:=sRxSortByFormMoveUpField;
DownBtn.Caption:=sRxSortByFormMoveDnField; DownBtn.Caption:=sRxSortByFormMoveDnField;
CheckBox1.Caption:=sRxSortByFormCaseInsens;
end; end;
procedure TrxSortByForm.ListBox1DblClick(Sender: TObject); procedure TrxSortByForm.ListBox1DblClick(Sender: TObject);

View File

@@ -41,19 +41,20 @@ type
{ TRxMemoryDataSortEngine } { TRxMemoryDataSortEngine }
TRxMemoryDataSortEngine = class(TExDBGridSortEngine) TRxMemoryDataSortEngine = class(TRxDBGridSortEngine)
public public
procedure Sort(Field:TField; ADataSet:TDataSet; Asc:boolean);override; procedure Sort(Field:TField; ADataSet:TDataSet; Asc:boolean; SortOptions:TRxSortEngineOptions);override;
procedure SortList(ListField:string; ADataSet:TDataSet; Asc:boolean);override; procedure SortList(ListField:string; ADataSet:TDataSet; Asc:boolean);override;
end; end;
implementation implementation
uses rxmemds; uses rxmemds;
procedure TRxMemoryDataSortEngine.Sort(Field:TField; ADataSet:TDataSet; Asc:boolean); procedure TRxMemoryDataSortEngine.Sort(Field:TField; ADataSet:TDataSet;
Asc:boolean; SortOptions:TRxSortEngineOptions);
begin begin
if Assigned(ADataSet) then if Assigned(ADataSet) then
(ADataSet as TRxMemoryData).SortOnFields(Field.FieldName, true, not Asc); (ADataSet as TRxMemoryData).SortOnFields(Field.FieldName, seoCaseInsensitiveSort in SortOptions, not Asc);
end; end;
procedure TRxMemoryDataSortEngine.SortList(ListField: string; procedure TRxMemoryDataSortEngine.SortList(ListField: string;
@@ -64,6 +65,6 @@ begin
end; end;
initialization initialization
RegisterExDBGridSortEngine(TRxMemoryDataSortEngine, TRxMemoryData); RegisterRxDBGridSortEngine(TRxMemoryDataSortEngine, TRxMemoryData);
end. end.