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
uses
Classes, SysUtils, DB, RxDBGrid;
Classes, SysUtils, DB,
{$IFDEF FPC}
RxDBGrid
{$ELSE}
exDBGrid
{$ENDIF}
;
type
{ TFBDataSetSortEngine }
TFBDataSetSortEngine = class(TExDBGridSortEngine)
TFBDataSetSortEngine = class(TRxDBGridSortEngine)
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;
end;
implementation
uses FBCustomDataSet;
procedure TFBDataSetSortEngine.Sort(Field:TField; ADataSet:TDataSet; Asc:boolean);
procedure TFBDataSetSortEngine.Sort(Field: TField; ADataSet: TDataSet;
Asc: boolean; SortOptions: TRxSortEngineOptions);
begin
if Assigned(ADataSet) then
(ADataSet as TFBDataSet).SortOnField(Field.FieldName, Asc);
@ -64,6 +71,6 @@ begin
end;
initialization
RegisterExDBGridSortEngine(TFBDataSetSortEngine, TFBDataSet);
RegisterRxDBGridSortEngine(TFBDataSetSortEngine, TFBDataSet);
end.

View File

@ -361,6 +361,10 @@ msgstr "&Orden de Ordenamiento :"
msgid "Sort on field"
msgstr "Ordenar por Columnas"
#: rxdconst.srxsortbyformcaseinsens
msgid "&Case insensitive sort"
msgstr ""
#: rxdconst.srxsortbyformmovednfield
msgid "&Down"
msgstr "A&bajo"
@ -378,7 +382,9 @@ msgid "&Selected fields:"
msgstr "&Campos Disponibles :"
#: 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 :"
#: rxdconst.srxsoursedataset

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -41,19 +41,20 @@ type
{ TRxMemoryDataSortEngine }
TRxMemoryDataSortEngine = class(TExDBGridSortEngine)
TRxMemoryDataSortEngine = class(TRxDBGridSortEngine)
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;
end;
implementation
uses rxmemds;
procedure TRxMemoryDataSortEngine.Sort(Field:TField; ADataSet:TDataSet; Asc:boolean);
procedure TRxMemoryDataSortEngine.Sort(Field:TField; ADataSet:TDataSet;
Asc:boolean; SortOptions:TRxSortEngineOptions);
begin
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;
procedure TRxMemoryDataSortEngine.SortList(ListField: string;
@ -64,6 +65,6 @@ begin
end;
initialization
RegisterExDBGridSortEngine(TRxMemoryDataSortEngine, TRxMemoryData);
RegisterRxDBGridSortEngine(TRxMemoryDataSortEngine, TRxMemoryData);
end.