diff --git a/components/rx/Demos/RxDBGrid/RxDBGridDemo.lpi b/components/rx/Demos/RxDBGrid/RxDBGridDemo.lpi
index a1df8c35d..73e948f58 100644
--- a/components/rx/Demos/RxDBGrid/RxDBGridDemo.lpi
+++ b/components/rx/Demos/RxDBGrid/RxDBGridDemo.lpi
@@ -54,15 +54,17 @@
-
+
+
-
+
+
@@ -73,9 +75,9 @@
-
+
-
+
@@ -496,36 +498,38 @@
-
-
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
+
-
-
-
+
+
+
+
-
-
-
+
+
+
+
@@ -611,10 +615,12 @@
+
-
-
-
+
+
+
+
@@ -634,154 +640,193 @@
-
+
-
+
-
+
-
+
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
-
+
+
-
-
+
+
diff --git a/components/rx/exsortfb.pas b/components/rx/exsortfb.pas
index 232666f7d..5e97bd5ff 100644
--- a/components/rx/exsortfb.pas
+++ b/components/rx/exsortfb.pas
@@ -50,7 +50,7 @@ type
TFBDataSetSortEngine = class(TRxDBGridSortEngine)
public
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: array of boolean; SortOptions: TRxSortEngineOptions);override;
end;
implementation
@@ -64,7 +64,7 @@ begin
end;
procedure TFBDataSetSortEngine.SortList(ListField: string; ADataSet: TDataSet;
- Asc: boolean);
+ Asc: array of boolean; SortOptions: TRxSortEngineOptions);
begin
if Assigned(ADataSet) then
(ADataSet as TFBDataSet).SortOnFields(ListField, Asc);
diff --git a/components/rx/rxdbgrid.pas b/components/rx/rxdbgrid.pas
index 4741c2560..9b0b2e015 100644
--- a/components/rx/rxdbgrid.pas
+++ b/components/rx/rxdbgrid.pas
@@ -183,9 +183,8 @@ type
private
FDataSetClass: TDataSetClass;
public
- procedure Sort(Field: TField; ADataSet: TDataSet; Asc: boolean;
- SortOptions: TRxSortEngineOptions); virtual; abstract;
- procedure SortList(ListField: string; ADataSet: TDataSet; Asc: boolean); virtual;
+ procedure Sort(Field: TField; ADataSet: TDataSet; Asc: boolean; SortOptions: TRxSortEngineOptions); virtual; abstract;
+ procedure SortList(ListField: string; ADataSet: TDataSet; Asc: array of boolean; SortOptions: TRxSortEngineOptions); virtual;
end;
TRxDBGridSortEngineClass = class of TRxDBGridSortEngine;
@@ -363,6 +362,8 @@ type
FKeyList: TStrings;
FNotInKeyListIndex: integer;
FOnDrawColumnCell: TDrawColumnCellEvent;
+ FSortOrder: TSortMarker;
+ FSortPosition: integer;
function GetFooter: TRxColumnFooter;
function GetKeyList: TStrings;
procedure SetEditButtons(AValue: TRxColumnEditButtons);
@@ -377,6 +378,8 @@ type
constructor Create(ACollection: TCollection); override;
destructor Destroy; override;
procedure OptimizeWidth;
+ property SortOrder: TSortMarker read FSortOrder;
+ property SortPosition: integer read FSortPosition;
published
property Footer: TRxColumnFooter read GetFooter write SetFooter;
property ImageList: TImageList read FImageList write SetImageList;
@@ -392,10 +395,20 @@ type
{ TRxDbGridColumns }
TRxDbGridColumns = class(TDbGridColumns)
protected
+ procedure Notify(Item: TCollectionItem;Action: TCollectionNotification); override;
public
function Add: TRxColumn;
end;
+ { TRxDbGridColumnsSortList }
+
+ TRxDbGridColumnsSortList = class(TFPList)
+ private
+ function GetCollumn(Index: Integer): TRxColumn;
+ public
+ property Collumn[Index: Integer]: TRxColumn read GetCollumn; default;
+ end;
+
{ TFilterListCellEditor }
TFilterListCellEditor = class(TComboBox)
@@ -420,6 +433,7 @@ type
private
FrxDSState:TRxDSState;
FFooterOptions: TRxDBGridFooterOptions;
+ FSortColumns: TRxDbGridColumnsSortList;
FSortingNow:Boolean;
FInProcessCalc: integer;
FAllowedOperations: TRxDBGridAllowedOperations;
@@ -428,15 +442,16 @@ type
FOnGetCellProps: TGetCellPropsEvent;
FOptionsRx: TOptionsRx;
// FTitleLines: Integer;
- FAutoSort: boolean;
- FMarkerUp, FMarkerDown: TBitmap;
+
FOnGetBtnParams: TGetBtnParamsEvent;
FOnFiltred: TNotifyEvent;
//auto sort support
- FSortField: TField;
- FSortOrder: TSortMarker;
- FSortEngine: TRxDBGridSortEngine;
- FPressedCol: TColumn;
+
+ FMarkerUp : TBitmap;
+ FMarkerDown : TBitmap;
+ FAutoSort : boolean;
+ FSortEngine : TRxDBGridSortEngine;
+ FPressedCol : TRxColumn;
//
FPressed: boolean;
FSwapButtons: boolean;
@@ -453,7 +468,7 @@ type
F_EventOnDeleteError: TDataSetErrorEvent;
F_EventOnPostError: TDataSetErrorEvent;
F_LastFilter: TStringList;
- F_SortListField: TStringList;
+ //F_SortListField: TStringList;
F_CreateLookup: TCreateLookup;
F_DisplayLookup: TDisplayLookup;
@@ -478,8 +493,11 @@ type
function GetColumns: TRxDbGridColumns;
function GetFooterColor: TColor;
function GetFooterRowCount: integer;
+ function GetMarkerDown: TBitmap;
+ function GetMarkerUp: TBitmap;
function GetPropertyStorage: TCustomPropertyStorage;
function GetSortField: string;
+ function GetSortOrder: TSortMarker;
function GetTitleButtons: boolean;
function IsColumnsStored: boolean;
procedure SetAutoSort(const AValue: boolean);
@@ -488,6 +506,8 @@ type
procedure SetFooterOptions(AValue: TRxDBGridFooterOptions);
procedure SetFooterRowCount(const AValue: integer);
procedure SetKeyStrokes(const AValue: TRxDBGridKeyStrokes);
+ procedure SetMarkerDown(AValue: TBitmap);
+ procedure SetMarkerUp(AValue: TBitmap);
procedure SetOptionsRx(const AValue: TOptionsRx);
procedure SetPropertyStorage(const AValue: TCustomPropertyStorage);
procedure SetTitleButtons(const AValue: boolean);
@@ -518,6 +538,9 @@ type
procedure OnIniLoad(Sender: TObject);
procedure CleanDSEvent;
+ procedure CollumnSortListUpdate;
+ procedure CollumnSortListClear;
+ procedure CollumnSortListApply;
protected
function DatalinkActive: boolean;
procedure LinkActive(Value: Boolean); override;
@@ -536,7 +559,7 @@ type
procedure DrawFooterRows; virtual;
- procedure DoTitleClick(ACol: longint; AField: TField); virtual;
+ procedure DoTitleClick(ACol: longint; ACollumn: TRxColumn; Shift: TShiftState); virtual;
procedure MouseMove(Shift: TShiftState; X, Y: integer); override;
procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
X, Y: integer); override;
@@ -588,6 +611,7 @@ type
procedure LayoutChanged; override;
procedure ShowFindDialog;
procedure ShowColumnsDialog;
+ procedure ShowSortDialog;
function ColumnByFieldName(AFieldName: string): TRxColumn;
function ColumnByCaption(ACaption: string): TRxColumn;
procedure CalcStatTotals;
@@ -606,9 +630,13 @@ type
property FocusRectVisible;
property SelectedRows;
property QuickUTF8Search: string read FQuickUTF8Search write SetQuickUTF8Search;
- property SortField:string read GetSortField;
- property SortOrder:TSortMarker read FSortOrder;
+ property SortField:string read GetSortField;
+ property SortOrder:TSortMarker read GetSortOrder;
+
+ property SortColumns:TRxDbGridColumnsSortList read FSortColumns;
+ property MarkerUp : TBitmap read GetMarkerUp write SetMarkerUp;
+ property MarkerDown : TBitmap read GetMarkerDown write SetMarkerDown;
published
property AfterQuickSearch: TRxQuickSearchNotifyEvent
read FAfterQuickSearch write FAfterQuickSearch;
@@ -816,6 +844,13 @@ type
procedure EditingDone; override;
end;
+{ TRxDbGridColumnsSortList }
+
+function TRxDbGridColumnsSortList.GetCollumn(Index: Integer): TRxColumn;
+begin
+ Result:=TRxColumn(Items[Index]);
+end;
+
{ TRxColumnEditButton }
function TRxColumnEditButton.GetGlyph: TBitmap;
@@ -1487,8 +1522,9 @@ begin
FSortEngine := RxDBGridSortEngineList.Objects[Pos] as TRxDBGridSortEngine
else
FSortEngine := nil;
- FSortField := nil;
- FSortOrder := smNone;
+{ FSortField := nil;
+ FSortOrder := smNone;}
+ FSortColumns.Clear;
end;
end;
@@ -1507,6 +1543,16 @@ begin
Result:=FFooterOptions.RowCount;
end;
+function TRxDBGrid.GetMarkerDown: TBitmap;
+begin
+ Result:=FMarkerDown;
+end;
+
+function TRxDBGrid.GetMarkerUp: TBitmap;
+begin
+ Result:=FMarkerUp;
+end;
+
function TRxDBGrid.GetDrawFullLine: boolean;
begin
Result := FDrawFullLine;
@@ -1552,12 +1598,20 @@ end;
function TRxDBGrid.GetSortField: string;
begin
- if Assigned(FSortField) then
- Result:=FSortField.FieldName
+ if FSortColumns.Count > 0 then
+ Result:=FSortColumns[0].FieldName
else
Result:='';
end;
+function TRxDBGrid.GetSortOrder: TSortMarker;
+begin
+ if FSortColumns.Count > 0 then
+ Result:=FSortColumns[0].SortOrder
+ else
+ Result:=smNone;
+end;
+
function TRxDBGrid.GetTitleButtons: boolean;
begin
Result := dgHeaderPushedLook in Options;
@@ -1598,6 +1652,16 @@ begin
UpdateJMenuKeys;
end;
+procedure TRxDBGrid.SetMarkerDown(AValue: TBitmap);
+begin
+ FMarkerDown.Assign(AValue);
+end;
+
+procedure TRxDBGrid.SetMarkerUp(AValue: TBitmap);
+begin
+ FMarkerUp.Assign(AValue);
+end;
+
procedure TRxDBGrid.SetOptionsRx(const AValue: TOptionsRx);
var
OldOpt: TOptionsRx;
@@ -2029,6 +2093,9 @@ begin
FPropertyStorageLink.Storage.WriteInteger(S1 + sVisible, Ord(C.Visible));
end;
+ { TODO : Необходимо подключить сохранение списка колонок сортировки }
+{
+ FSortColumns;
if Assigned(FSortField) then
begin
FPropertyStorageLink.Storage.WriteInteger(S1 + sSortMarker, Ord(FSortOrder));
@@ -2036,6 +2103,7 @@ begin
end
else
FPropertyStorageLink.Storage.WriteInteger(S1 + sSortMarker, Ord(smNone));
+}
end;
procedure TRxDBGrid.OnIniLoad(Sender: TObject);
@@ -2071,7 +2139,8 @@ begin
end;
end;
- FSortOrder := TSortMarker(FPropertyStorageLink.Storage.ReadInteger(
+ { TODO : Необходимо подключить востановление списка колонок сортировки }
+{ FSortOrder := TSortMarker(FPropertyStorageLink.Storage.ReadInteger(
S1 + sSortMarker, Ord(smNone)));
if Assigned(FSortEngine) and (FSortOrder <> smNone) and DatalinkActive then
begin
@@ -2083,7 +2152,7 @@ begin
FSortEngine.Sort(FSortField, DataSource.DataSet, FSortOrder = smUp,
SortEngineOptions);
end;
- end;
+ end;}
end;
end;
@@ -2118,6 +2187,72 @@ begin
end;
end;
+procedure TRxDBGrid.CollumnSortListUpdate;
+var
+ i, J:integer;
+ C:TRxColumn;
+
+begin
+ FSortColumns.Clear;
+ for i:=0 to Columns.Count - 1 do
+ begin
+ C:=TRxColumn(Columns[i]);
+ if C.SortOrder <> smNone then
+ begin
+ if FSortColumns.Count <> 0 then
+ begin
+ for j:=0 to FSortColumns.Count-1 do
+ if FSortColumns[j].FSortPosition > C.FSortPosition then
+ begin
+ FSortColumns.Insert(j, C);
+ C:=nil;
+ Break;
+ end;
+ end;
+ if C<>nil then
+ FSortColumns.Add(C);
+ end;
+ end;
+
+ for i:=0 to FSortColumns.Count - 1 do
+ FSortColumns[i].FSortPosition:=i;
+end;
+
+procedure TRxDBGrid.CollumnSortListClear;
+var
+ i:integer;
+begin
+ FSortColumns.Clear;
+ for i:=0 to Columns.Count - 1 do
+ begin
+ TRxColumn(Columns[i]).FSortOrder:=smNone;
+ TRxColumn(Columns[i]).FSortPosition:=0;
+ end;
+end;
+
+procedure TRxDBGrid.CollumnSortListApply;
+var
+ i:integer;
+ S:string;
+ Asc:array of boolean;
+begin
+ SetLength(Asc, FSortColumns.Count);
+ for i := 0 to FSortColumns.Count - 1 do
+ begin
+ Asc[i]:=FSortColumns[i].FSortOrder = smUp;
+ if S<>'' then
+ S:=S+';';
+ S:=S + FSortColumns[i].FieldName;
+ end;
+ { TODO : Необходимо добавить опцию регистронезависимого поиска }
+
+ FSortingNow:=true;
+ FSortEngine.SortList(S, DataSource.DataSet, Asc, SortEngineOptions);
+ //FSortEngine.Sort(FSortColumns[0].Field, DataSource.DataSet, FSortColumns[0].FSortOrder = smUp, SortEngineOptions);
+ FSortingNow:=false;
+end;
+
+
procedure TRxDBGrid.DefaultDrawCellA(aCol, aRow: integer; aRect: TRect;
aState: TGridDrawState);
begin
@@ -2140,8 +2275,10 @@ var
i: integer;
Down: boolean;
aRect2: TRect;
+
FTitle: TRxColumnTitle;
- GrdCol: TGridColumn;
+ GrdCol: TRxColumn;
+
MLI, MLINext: TMLCaptionItem;
begin
@@ -2162,13 +2299,19 @@ begin
exit;
end;
+ GrdCol := TRxColumn(ColumnFromGridColumn(aCol));
+
Down := FPressed and (dgHeaderPushedLook in Options) and
- (FPressedCol = TColumn(ColumnFromGridColumn(aCol)));
+ (FPressedCol = GrdCol);
+{
ASortMarker := smNone;
-
if (FSortField = GetFieldFromGridColumn(aCol)) then
- ASortMarker := FSortOrder;
+ ASortMarker := FSortOrder;}
+ if Assigned(GrdCol) then
+ ASortMarker := GrdCol.FSortOrder
+ else
+ ASortMarker := smNone;
if Assigned(FOnGetBtnParams) and Assigned(GetFieldFromGridColumn(aCol)) then
begin
@@ -2181,7 +2324,7 @@ begin
if (gdFixed in aState) and (aRow = 0) and (ACol >= FixedCols) then
begin
- GrdCol := ColumnFromGridColumn(aCol);
+ //GrdCol := ColumnFromGridColumn(aCol);
if Assigned(GrdCol) then
FTitle := TRxColumnTitle(GrdCol.Title)
else
@@ -2254,6 +2397,7 @@ begin
begin
OutCaptionCellText(aCol, aRow, aRect, aState, GetDefaultColumnTitle(aCol));
end;
+
OutCaptionSortMarker(aRect, ASortMarker);
end
else
@@ -2486,12 +2630,16 @@ begin
if SelectedRows.Count > 0 then
SelectedRows.Clear;
end;
- if not FSortingNow then begin
+
+ if not FSortingNow then
+ CollumnSortListClear;
+{ begin
FSortField := nil;
FSortOrder := smNone;
end;
F_SortListField.Clear;
+}
if {not (csDestroying in ComponentState) and} not (csDesigning in ComponentState) then
SetDBHandlers(Value);
end;
@@ -2633,30 +2781,47 @@ begin
Canvas.Brush.Color := Background;
end;
-procedure TRxDBGrid.DoTitleClick(ACol: longint; AField: TField);
+procedure TRxDBGrid.DoTitleClick(ACol: longint; ACollumn: TRxColumn;
+ Shift: TShiftState);
begin
- if FAutoSort and (FSortEngine <> nil) and (AField <> nil) then
+ if FAutoSort and (FSortEngine <> nil) and (ACollumn.Field <> nil) then
begin
- if AField = FSortField then
+ if ssCtrl in Shift then
begin
- if FSortOrder = smUp then
- FSortOrder := smDown
+ if ACollumn.FSortOrder <> smNone then
+ begin
+ if ACollumn.FSortOrder = smUp then
+ ACollumn.FSortOrder := smDown
+ else
+ begin
+ ACollumn.FSortOrder := smNone;
+ ACollumn.FSortPosition:=0;
+ end;
+ end
else
- FSortOrder := smUp;
+ begin
+ ACollumn.FSortOrder := smUp;
+ ACollumn.FSortPosition:=FSortColumns.Count;
+ end;
end
else
begin
- FSortField := AField;
- FSortOrder := smUp;
+ if (FSortColumns.Count>0) and (FSortColumns[0] = ACollumn) then
+ begin
+ if FSortColumns[0].FSortOrder = smUp then
+ FSortColumns[0].FSortOrder := smDown
+ else
+ FSortColumns[0].FSortOrder := smUp;
+ end
+ else
+ begin
+ CollumnSortListClear;
+ ACollumn.FSortOrder := smUp;
+ end;
end;
- FSortingNow:=true;
- FSortEngine.Sort(FSortField, DataSource.DataSet, FSortOrder =
- smUp, SortEngineOptions);
- FSortingNow:=false;
- F_SortListField.Clear;
- if Assigned(FSortField) then
- F_SortListField.Add(FSortField.FieldName);
+ CollumnSortListUpdate;
+ CollumnSortListApply;
end
else
HeaderClick(True, ACol);
@@ -2768,7 +2933,7 @@ begin
begin
MouseCapture := True;
FTracking := True;
- FPressedCol := TColumn(ColumnFromGridColumn(Cell.X));
+ FPressedCol := TRxColumn(ColumnFromGridColumn(Cell.X));
TrackButton(X, Y);
inherited MouseDown(Button, Shift, X, Y);
end;
@@ -2813,7 +2978,7 @@ begin
begin
Cell := MouseCoord(X, Y);
DoClick := PtInRect(Rect(0, 0, ClientWidth, ClientHeight), Point(X, Y)) and
- (Cell.Y < RowHeights[0]) and (FPressedCol = TColumn(ColumnFromGridColumn(Cell.X)));
+ (Cell.Y < RowHeights[0]) and (FPressedCol = TRxColumn(ColumnFromGridColumn(Cell.X)));
StopTracking;
if DoClick then
begin
@@ -2822,12 +2987,9 @@ begin
Dec(ACol);
if DataLinkActive and (ACol >= 0) and (ACol < Columns.Count) then
begin
- FPressedCol := ColumnFromGridColumn(Cell.X) as TColumn;
+ FPressedCol := TRxColumn(ColumnFromGridColumn(Cell.X));
if Assigned(FPressedCol) then
- begin
- F_SortListField.Clear;
- DoTitleClick(FPressedCol.Index, FPressedCol.Field);
- end;
+ DoTitleClick(FPressedCol.Index, FPressedCol, Shift);
end;
end;
end
@@ -3529,35 +3691,44 @@ end;
procedure TRxDBGrid.OnSortBy(Sender: TObject);
var
i: integer;
- s: string;
- o: boolean;
+ S1: string;
+ FSortListField:TStringList;
+ FColumn:TRxColumn;
begin
if DatalinkActive then
begin
- FSortField := nil;
- rxSortByForm := TrxSortByForm.Create(Application);
- rxSortByForm.CheckBox1.Checked := rdgCaseInsensitiveSort in FOptionsRx;
- o := not (FSortOrder = smDown);
- if rxSortByForm.Execute(Self, F_SortListField, o) then
- begin
- for i := 0 to F_SortListField.Count - 1 do
+ FSortListField:=TStringList.Create;
+ try
+ rxSortByForm := TrxSortByForm.Create(Application);
+ rxSortByForm.CheckBox1.Checked := rdgCaseInsensitiveSort in FOptionsRx;
+ if rxSortByForm.Execute(Self, FSortListField) then
begin
- s := s + F_SortListField.Strings[i] + ';';
+ for i := 0 to FSortListField.Count - 1 do
+ begin
+ S1:=FSortListField.Strings[i];
+ FColumn:=TRxColumn(ColumnByFieldName(Copy(S1, 2, Length(S1))));
+ if S1[1] = '1' then
+ FColumn.FSortOrder := smUp
+ else
+ FColumn.FSortOrder := smDown;
+
+ FColumn.FSortPosition:=i;
+ end;
+
+ CollumnSortListUpdate;
+
+ if rxSortByForm.CheckBox1.Checked then
+ Include(FOptionsRx, rdgCaseInsensitiveSort)
+ else
+ Exclude(FOptionsRx, rdgCaseInsensitiveSort);
+
+ CollumnSortListApply;
end;
- s := Copy(s, 1, Length(s) - 1);
- if o then
- FSortOrder := smUp
- else
- FSortOrder := smDown;
- if rxSortByForm.CheckBox1.Checked then
- Include(FOptionsRx, rdgCaseInsensitiveSort)
- else
- Exclude(FOptionsRx, rdgCaseInsensitiveSort);
-
- FSortEngine.SortList(s, DataSource.DataSet, o);
+ finally
+ FreeAndNil(rxSortByForm);
+ FreeAndNil(FSortListField);
end;
- FreeAndNil(rxSortByForm);
Invalidate;
end;
end;
@@ -3668,11 +3839,13 @@ begin
Options := Options - [dgCancelOnExit];
{$ENDIF}
+ FSortColumns:=TRxDbGridColumnsSortList.Create;
FKeyStrokes := TRxDBGridKeyStrokes.Create(Self);
FKeyStrokes.ResetDefaults;
FMarkerUp := LoadLazResBitmapImage('rx_markerup');
FMarkerDown := LoadLazResBitmapImage('rx_markerdown');
+
Options := Options - [dgTabs];
OptionsRx := OptionsRx + [rdgAllowColumnsForm, rdgAllowDialogFind,
rdgAllowQuickFilter];
@@ -3687,7 +3860,7 @@ begin
DoCreateJMenu;
F_LastFilter := TStringList.Create;
- F_SortListField := TStringList.Create;
+ //F_SortListField := TStringList.Create;
FPropertyStorageLink := TPropertyStorageLink.Create;
FPropertyStorageLink.OnSave := @OnIniSave;
@@ -3736,10 +3909,10 @@ begin
FreeAndNil(F_PopupMenu);
FreeAndNil(F_MenuBMP);
FreeAndNil(F_LastFilter);
- FreeAndNil(F_SortListField);
FreeAndNil(FKeyStrokes);
inherited Destroy;
+ FreeAndNil(FSortColumns);
end;
procedure TRxDBGrid.LayoutChanged;
@@ -3762,6 +3935,11 @@ begin
ShowRxDBGridColumsForm(Self);
end;
+procedure TRxDBGrid.ShowSortDialog;
+begin
+ OnSortBy(nil);
+end;
+
function TRxDBGrid.ColumnByFieldName(AFieldName: string): TRxColumn;
var
i: integer;
@@ -3792,6 +3970,13 @@ begin
end;
end;
+procedure TRxDbGridColumns.Notify(Item: TCollectionItem;
+ Action: TCollectionNotification);
+begin
+ inherited Notify(Item, Action);
+ TRxDBGrid(Grid).CollumnSortListUpdate;
+end;
+
{ TRxDbGridColumns }
function TRxDbGridColumns.Add: TRxColumn;
begin
@@ -4438,7 +4623,7 @@ end;
{ TExDBGridSortEngine }
procedure TRxDBGridSortEngine.SortList(ListField: string; ADataSet: TDataSet;
- Asc: boolean);
+ Asc: array of boolean; SortOptions: TRxSortEngineOptions);
begin
end;
diff --git a/components/rx/rxmemds.pas b/components/rx/rxmemds.pas
index 4a99fd194..bebaedf25 100644
--- a/components/rx/rxmemds.pas
+++ b/components/rx/rxmemds.pas
@@ -163,6 +163,8 @@ type
Options: TLocateOptions): Boolean; override;
procedure SortOnFields(const FieldNames: string;
CaseInsensitive: Boolean = True; Descending: Boolean = False);
+ procedure SortOnFieldsEx(const FieldNames: string;
+ CaseInsensitive: Boolean = True; Asc: array of boolean);
procedure EmptyTable;
procedure CloseOpen;
procedure CopyStructure(Source: TDataSet);
@@ -1620,6 +1622,12 @@ begin
end;
end;
+procedure TRxMemoryData.SortOnFieldsEx(const FieldNames: string;
+ CaseInsensitive: Boolean; Asc: array of boolean);
+begin
+
+end;
+
procedure TRxMemoryData.Sort;
var
Pos: TBookmark;
diff --git a/components/rx/rxnew.lpk b/components/rx/rxnew.lpk
index ecf0d4db8..33a0ecceb 100644
--- a/components/rx/rxnew.lpk
+++ b/components/rx/rxnew.lpk
@@ -26,7 +26,7 @@ Copyright (c) 1998 Master-Bank
translate to Lazarus by alexs in 2005 - 2012
"/>
-
+
diff --git a/components/rx/rxsortby.lfm b/components/rx/rxsortby.lfm
index c77072ac4..b670be3b7 100644
--- a/components/rx/rxsortby.lfm
+++ b/components/rx/rxsortby.lfm
@@ -1,11 +1,11 @@
object rxSortByForm: TrxSortByForm
Left = 450
- Height = 411
+ Height = 398
Top = 243
Width = 684
ActiveControl = AddBtn
Caption = 'Sort by fields'
- ClientHeight = 411
+ ClientHeight = 398
ClientWidth = 684
OnCreate = FormCreate
Position = poScreenCenter
@@ -35,28 +35,14 @@ object rxSortByForm: TrxSortByForm
FocusControl = ListBox2
ParentColor = False
end
- object Label4: TLabel
- AnchorSideLeft.Control = Owner
- AnchorSideBottom.Control = ComboBox1
- AnchorSideBottom.Side = asrBottom
- Left = 6
- Height = 15
- Top = 314
- Width = 104
- Anchors = [akLeft, akBottom]
- BorderSpacing.Left = 6
- Caption = 'Select sort order'
- FocusControl = ComboBox1
- ParentColor = False
- end
object ListBox2: TListBox
AnchorSideLeft.Control = Owner
AnchorSideTop.Control = Label2
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = AddBtn
- AnchorSideBottom.Control = ComboBox1
+ AnchorSideBottom.Control = CheckBox1
Left = 6
- Height = 267
+ Height = 289
Top = 27
Width = 262
Anchors = [akTop, akLeft, akRight, akBottom]
@@ -163,22 +149,6 @@ object rxSortByForm: TrxSortByForm
OnClick = DownBtnClick
TabOrder = 4
end
- object ComboBox1: TComboBox
- AnchorSideLeft.Control = Label4
- AnchorSideLeft.Side = asrBottom
- AnchorSideRight.Control = Owner
- AnchorSideRight.Side = asrBottom
- AnchorSideBottom.Control = CheckBox1
- Left = 116
- Height = 29
- Top = 300
- Width = 562
- Anchors = [akLeft, akRight, akBottom]
- BorderSpacing.Around = 6
- ItemHeight = 0
- Style = csDropDownList
- TabOrder = 5
- end
object ListBox1: TListBox
AnchorSideLeft.Control = AddBtn
AnchorSideLeft.Side = asrBottom
@@ -186,17 +156,19 @@ object rxSortByForm: TrxSortByForm
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = Owner
AnchorSideRight.Side = asrBottom
- AnchorSideBottom.Control = ComboBox1
+ AnchorSideBottom.Control = CheckBox1
Left = 417
- Height = 267
+ Height = 289
Top = 27
Width = 261
Anchors = [akTop, akLeft, akRight, akBottom]
BorderSpacing.Around = 6
ItemHeight = 0
- OnDblClick = ListBox1DblClick
+ OnDblClick = SpeedButton1Click
+ OnDrawItem = ListBox1DrawItem
ScrollWidth = 259
- TabOrder = 6
+ Style = lbOwnerDrawFixed
+ TabOrder = 5
TopIndex = -1
end
object AddBtn: TBitBtn
@@ -231,7 +203,7 @@ object rxSortByForm: TrxSortByForm
object ButtonPanel1: TButtonPanel
Left = 6
Height = 42
- Top = 363
+ Top = 350
Width = 672
OKButton.Name = 'OKButton'
OKButton.DefaultCaption = True
@@ -241,21 +213,21 @@ object rxSortByForm: TrxSortByForm
CloseButton.DefaultCaption = True
CancelButton.Name = 'CancelButton'
CancelButton.DefaultCaption = True
- TabOrder = 7
+ TabOrder = 6
ShowButtons = [pbOK, pbCancel, pbHelp]
end
object CheckBox1: TCheckBox
AnchorSideLeft.Control = Owner
- AnchorSideTop.Control = Label4
AnchorSideTop.Side = asrBottom
AnchorSideBottom.Control = ButtonPanel1
Left = 6
Height = 22
- Top = 335
+ Top = 322
Width = 151
Anchors = [akLeft, akBottom]
BorderSpacing.Around = 6
Caption = 'Case insensitive sort'
- TabOrder = 8
+ Enabled = False
+ TabOrder = 7
end
end
diff --git a/components/rx/rxsortby.pas b/components/rx/rxsortby.pas
index d39f5084e..b6f00e1e6 100644
--- a/components/rx/rxsortby.pas
+++ b/components/rx/rxsortby.pas
@@ -37,7 +37,7 @@ interface
uses
Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
- StdCtrls, Buttons, ButtonPanel, rxdbgrid, db;
+ StdCtrls, Buttons, ButtonPanel, rxdbgrid, db, types;
type
@@ -47,11 +47,9 @@ type
AddBtn: TBitBtn;
ButtonPanel1: TButtonPanel;
CheckBox1: TCheckBox;
- ComboBox1: TComboBox;
DownBtn: TBitBtn;
Label1: TLabel;
Label2: TLabel;
- Label4: TLabel;
ListBox1: TListBox;
ListBox2: TListBox;
RemoveBtn: TBitBtn;
@@ -60,14 +58,17 @@ type
procedure DownBtnClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure ListBox1DblClick(Sender: TObject);
+ procedure ListBox1DrawItem(Control: TWinControl; Index: Integer;
+ ARect: TRect; State: TOwnerDrawState);
procedure ListBox2DblClick(Sender: TObject);
procedure RemoveBtnClick(Sender: TObject);
+ procedure SpeedButton1Click(Sender: TObject);
procedure UpBtnClick(Sender: TObject);
private
-
+ FDBGrid:TRxDBGrid;
public
{ public declarations }
- function Execute(ADBGrid:TRxDBGrid; SortFieldNames:TStringList; var Asc:boolean):Boolean;
+ function Execute(ADBGrid:TRxDBGrid; SortNames:TStringList):Boolean;
end;
var
@@ -104,13 +105,13 @@ end;
procedure TrxSortByForm.FormCreate(Sender: TObject);
begin
- ComboBox1.Clear;
+{ ComboBox1.Clear;
ComboBox1.Items.Add(sRxAscendign);
- ComboBox1.Items.Add(sRxDescending);
+ ComboBox1.Items.Add(sRxDescending);}
Caption:=sRxSortByFormCaption;
Label2.Caption:=sRxSortByFormAllFields;
Label1.Caption:=sRxSortByFormSortFields;
- Label4.Caption:=sRxSortByFormSortOrder;
+// Label4.Caption:=sRxSortByFormSortOrder;
AddBtn.Caption:=sRxSortByFormAddField;
RemoveBtn.Caption:=sRxSortByFormRemoveField;
UpBtn.Caption:=sRxSortByFormMoveUpField;
@@ -123,6 +124,31 @@ begin
RemoveBtn.Click;
end;
+procedure TrxSortByForm.ListBox1DrawItem(Control: TWinControl; Index: Integer;
+ ARect: TRect; State: TOwnerDrawState);
+var
+ X, Y:integer;
+ P:TRxColumn;
+ S1, S2:string;
+ Cnv:TCanvas;
+begin
+ Cnv:=ListBox1.Canvas;
+ Cnv.FillRect(ARect); { clear the rectangle }
+ P:=TRxColumn(ListBox1.Items.Objects[Index]);
+ S1:=ListBox1.Items[Index];
+ S2:=Copy(S1, 1, 1);
+ Delete(S1, 1, 1);
+
+ X := aRect.Left + 2;
+ Y := Trunc((aRect.Top + aRect.Bottom - UpBtn.Glyph.Height) / 2);
+
+ if S2 = '1' then
+ Cnv.Draw(X, Y, UpBtn.Glyph)
+ else
+ Cnv.Draw(X, Y, DownBtn.Glyph);
+
+ Cnv.TextOut(ARect.Left + UpBtn.Glyph.Width + 6, (ARect.Top + ARect.Bottom - Cnv.TextHeight('Wg')) div 2, S1);
+end;
procedure TrxSortByForm.ListBox2DblClick(Sender: TObject);
begin
@@ -131,24 +157,45 @@ end;
procedure TrxSortByForm.AddBtnClick(Sender: TObject);
+var
+ S:string;
begin
if ListBox2.ItemIndex <> -1 Then
begin
- ListBox1.Items.Objects[ListBox1.Items.Add(ListBox2.Items[ListBox2.ItemIndex])]:=ListBox2.Items.Objects[ListBox2.ItemIndex];
+ S:='1'+ListBox2.Items[ListBox2.ItemIndex];
+ ListBox1.Items.Objects[ListBox1.Items.Add(S)]:=ListBox2.Items.Objects[ListBox2.ItemIndex];
ListBox2.Items.Delete(ListBox2.ItemIndex);
ListBox1.ItemIndex:=ListBox1.Items.Count-1;
end;
end;
procedure TrxSortByForm.RemoveBtnClick(Sender: TObject);
+var
+ S:string;
begin
if ListBox1.ItemIndex <> -1 Then
begin
- ListBox2.Items.Objects[ListBox2.Items.Add(ListBox1.Items[ListBox1.ItemIndex])]:=ListBox1.Items.Objects[ListBox1.ItemIndex];
+ S:=TRxColumn(ListBox1.Items.Objects[ListBox1.ItemIndex]).Title.Caption;
+ ListBox2.Items.Objects[ListBox2.Items.Add(S)]:=ListBox1.Items.Objects[ListBox1.ItemIndex];
ListBox1.Items.Delete(ListBox1.ItemIndex);
end;
end;
+procedure TrxSortByForm.SpeedButton1Click(Sender: TObject);
+var
+ S:string;
+begin
+ if (ListBox1.ItemIndex <> -1) then
+ begin
+ S:=ListBox1.Items[ListBox1.ItemIndex];
+ if S[1] = '1' then
+ S[1] := '0'
+ else
+ S[1] := '1';
+ ListBox1.Items[ListBox1.ItemIndex]:=S;
+ end;
+end;
+
procedure TrxSortByForm.UpBtnClick(Sender: TObject);
var
TmpField:String;
@@ -172,41 +219,48 @@ begin
end;
-function TrxSortByForm.Execute(ADBGrid: TRxDBGrid;
- SortFieldNames: TStringList; var Asc: boolean): Boolean;
+function TrxSortByForm.Execute(ADBGrid: TRxDBGrid; SortNames: TStringList
+ ): Boolean;
var
i, j : Integer;
S : String;
- C:TColumn;
+ C:TRxColumn;
begin
Result:=False;
if not (Assigned(ADBGrid.DataSource) and Assigned(ADBGrid.DataSource.DataSet) and ADBGrid.DataSource.DataSet.Active) then exit;
+
+ FDBGrid:=ADBGrid;
+
ListBox1.Clear;
ListBox2.Clear;
- if not Asc then
- ComboBox1.ItemIndex:=1
- else
- ComboBox1.ItemIndex:=0;
for i:=0 to ADBGrid.Columns.Count-1 do
begin
- C:=ADBGrid.Columns[i];
- if SortFieldNames.IndexOf(C.Field.FieldName) > -1 then
- ListBox1.Items.Objects[ListBox1.Items.Add(C.Title.Caption)]:=C
- else
+ C:=TRxColumn(ADBGrid.Columns[i]);
+ if C.SortOrder = smNone then
ListBox2.Items.Objects[ListBox2.Items.Add(C.Title.Caption)]:=C;
end;
+ for i:=0 to ADBGrid.SortColumns.Count-1 do
+ begin
+ C:=ADBGrid.SortColumns[i];
+
+ if C.SortOrder = smUp then
+ S:='1'+C.Title.Caption
+ else
+ S:='0'+C.Title.Caption;
+
+ ListBox1.Items.Objects[ListBox1.Items.Add(S)]:=C
+ end;
+
if ShowModal = mrOK Then
begin
- Asc:= ComboBox1.ItemIndex = 0;
-
- SortFieldNames.Clear;
+ SortNames.Clear;
for i:=0 to ListBox1.Items.Count-1 do
begin
- C:=ListBox1.Items.Objects[i] as TColumn;
- SortFieldNames.Add(C.FieldName);
+ C:=ListBox1.Items.Objects[i] as TRxColumn;
+ SortNames.Add(Copy(ListBox1.Items[i], 1, 1) + C.FieldName);
end;
Result:=True;
diff --git a/components/rx/rxsortmemds.pas b/components/rx/rxsortmemds.pas
index c317bf87c..4f2d16c02 100644
--- a/components/rx/rxsortmemds.pas
+++ b/components/rx/rxsortmemds.pas
@@ -45,7 +45,7 @@ type
TRxMemoryDataSortEngine = class(TRxDBGridSortEngine)
public
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: array of boolean; SortOptions: TRxSortEngineOptions);override;
end;
implementation
@@ -59,10 +59,10 @@ begin
end;
procedure TRxMemoryDataSortEngine.SortList(ListField: string;
- ADataSet: TDataSet; Asc: boolean);
+ ADataSet: TDataSet; Asc: array of boolean; SortOptions: TRxSortEngineOptions);
begin
if Assigned(ADataSet) then
- (ADataSet as TRxMemoryData).SortOnFields(ListField, true, not Asc);
+ (ADataSet as TRxMemoryData).SortOnFieldsEx(ListField, seoCaseInsensitiveSort in SortOptions, Asc);
end;
initialization
diff --git a/components/rx/rxtbrsetup.lfm b/components/rx/rxtbrsetup.lfm
index ee0e86c93..12b57c242 100644
--- a/components/rx/rxtbrsetup.lfm
+++ b/components/rx/rxtbrsetup.lfm
@@ -12,15 +12,15 @@ object ToolPanelSetupForm: TToolPanelSetupForm
OnDestroy = FormDestroy
OnResize = FormResize
Position = poScreenCenter
- LCLVersion = '0.9.31'
+ LCLVersion = '1.1'
object PageControl1: TPageControl
Left = 0
Height = 433
Top = 0
Width = 657
- ActivePage = TabSheet2
+ ActivePage = TabSheet1
Align = alClient
- TabIndex = 1
+ TabIndex = 0
TabOrder = 0
object TabSheet1: TTabSheet
Caption = 'Visible buttons'
@@ -30,10 +30,10 @@ object ToolPanelSetupForm: TToolPanelSetupForm
AnchorSideLeft.Control = BitBtn3
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = TabSheet1
- Left = 350
- Height = 16
+ Left = 349
+ Height = 15
Top = 6
- Width = 114
+ Width = 102
BorderSpacing.Around = 6
Caption = 'Avaliable buttons'
FocusControl = ListBtnAvaliable
@@ -42,9 +42,9 @@ object ToolPanelSetupForm: TToolPanelSetupForm
object Label2: TLabel
AnchorSideTop.Control = TabSheet1
Left = 8
- Height = 16
+ Height = 15
Top = 6
- Width = 98
+ Width = 89
BorderSpacing.Around = 6
Caption = 'Visible buttons'
FocusControl = ListBtnVisible
@@ -56,15 +56,14 @@ object ToolPanelSetupForm: TToolPanelSetupForm
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = BitBtn6
AnchorSideRight.Side = asrBottom
- Left = 306
+ Left = 307
Height = 30
- Top = 146
- Width = 38
+ Top = 145
+ Width = 36
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Top = 6
BorderSpacing.InnerBorder = 2
Caption = '<<'
- NumGlyphs = 0
OnClick = BitBtn3Click
TabOrder = 0
end
@@ -74,16 +73,15 @@ object ToolPanelSetupForm: TToolPanelSetupForm
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = BitBtn6
AnchorSideRight.Side = asrBottom
- Left = 306
+ Left = 307
Height = 31
- Top = 109
- Width = 38
+ Top = 108
+ Width = 36
Anchors = [akTop, akLeft, akRight]
AutoSize = True
BorderSpacing.Top = 6
BorderSpacing.InnerBorder = 2
Caption = '<'
- NumGlyphs = 0
OnClick = BitBtn4Click
TabOrder = 1
end
@@ -93,15 +91,14 @@ object ToolPanelSetupForm: TToolPanelSetupForm
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = BitBtn6
AnchorSideRight.Side = asrBottom
- Left = 306
+ Left = 307
Height = 38
- Top = 65
- Width = 38
+ Top = 64
+ Width = 36
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Top = 6
BorderSpacing.InnerBorder = 2
Caption = '>'
- NumGlyphs = 0
OnClick = BitBtn5Click
TabOrder = 2
end
@@ -109,14 +106,13 @@ object ToolPanelSetupForm: TToolPanelSetupForm
AnchorSideLeft.Control = TabSheet1
AnchorSideLeft.Side = asrCenter
AnchorSideTop.Control = ListBtnAvaliable
- Left = 306
+ Left = 307
Height = 31
- Top = 28
- Width = 38
+ Top = 27
+ Width = 36
AutoSize = True
BorderSpacing.InnerBorder = 2
Caption = '>>'
- NumGlyphs = 0
OnClick = BitBtn6Click
TabOrder = 3
end
@@ -128,10 +124,10 @@ object ToolPanelSetupForm: TToolPanelSetupForm
AnchorSideRight.Control = TabSheet1
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = cbShowCaption
- Left = 350
- Height = 270
- Top = 28
- Width = 295
+ Left = 349
+ Height = 271
+ Top = 27
+ Width = 296
Anchors = [akTop, akLeft, akRight, akBottom]
BorderSpacing.Around = 6
IntegralHeight = True
@@ -147,7 +143,7 @@ object ToolPanelSetupForm: TToolPanelSetupForm
ItemHeight = 0
OnClick = ListBtnAvaliableClick
OnDrawItem = ListBox1DrawItem
- ScrollWidth = 293
+ ScrollWidth = 294
Style = lbOwnerDrawFixed
TabOrder = 4
end
@@ -158,15 +154,15 @@ object ToolPanelSetupForm: TToolPanelSetupForm
AnchorSideRight.Control = BitBtn6
AnchorSideBottom.Control = cbShowCaption
Left = 14
- Height = 270
- Top = 28
- Width = 286
+ Height = 271
+ Top = 27
+ Width = 287
Anchors = [akTop, akLeft, akRight, akBottom]
BorderSpacing.Around = 6
ItemHeight = 0
OnClick = ListBtnAvaliableClick
OnDrawItem = ListBox1DrawItem
- ScrollWidth = 284
+ ScrollWidth = 285
Style = lbOwnerDrawFixed
TabOrder = 5
TopIndex = -1
@@ -191,7 +187,7 @@ object ToolPanelSetupForm: TToolPanelSetupForm
Left = 6
Height = 22
Top = 304
- Width = 111
+ Width = 105
Anchors = [akLeft, akBottom]
BorderSpacing.Around = 6
Caption = 'Show caption'
@@ -210,7 +206,7 @@ object ToolPanelSetupForm: TToolPanelSetupForm
Left = 6
Height = 22
Top = 163
- Width = 88
+ Width = 82
BorderSpacing.Around = 6
Caption = 'Show hint'
TabOrder = 0
@@ -222,7 +218,7 @@ object ToolPanelSetupForm: TToolPanelSetupForm
Left = 6
Height = 22
Top = 135
- Width = 100
+ Width = 94
BorderSpacing.Around = 6
Caption = 'Transparent'
TabOrder = 1
@@ -234,7 +230,7 @@ object ToolPanelSetupForm: TToolPanelSetupForm
Left = 6
Height = 22
Top = 107
- Width = 101
+ Width = 93
BorderSpacing.Around = 6
Caption = 'Flat buttons'
TabOrder = 2