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