unit jvDBGridMax; interface uses Windows, Messages, SysUtils, Classes, Controls, Grids, DBGrids, JvExDBGrids, JvDBGrid, Graphics; type TTypeOrder = (oASC, oDESC, oNONE); TOrderStringList = class(TStringList) protected function GetAscending(Index: Integer): boolean; procedure SetAscending (Index: Integer; Value: boolean); public property Ascending[Index: Integer]: boolean read GetAscending write SetAscending; end; TNotifyReSort = procedure (Sender: TObject; ASortFields: TOrderStringList) of object; TColumnMax = class(TColumn) private { Private declarations } FOrdered: TTypeOrder; public { Public declarations } constructor Create(Collection: TCollection); override; destructor Destroy; override; property Ordered: TTypeOrder read FOrdered; published { Published declarations } end; TjvDBGridMax = class(TjvDBGrid) private { Private declarations } FShowOrderColor: boolean; FOrderColorAsc: TColor; FOrderColorDesc: TColor; FOnResort: TNotifyReSort; SortFields: TOrderStringList; protected { Protected declarations } function CreateColumns: TDBGridColumns; override; procedure DrawColumnCell(const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); override; procedure TitleClick(Column: TColumn); override; public { Public declarations } constructor Create(AOwner: TComponent); override; published { Published declarations } property ShowOrderColor: boolean read FShowOrderColor write FShowOrderColor; property OrderColorAsc: TColor read FOrderColorAsc write FOrderColorAsc; property OrderColorDesc: TColor read FOrderColorDesc write FOrderColorDesc; property OnResort: TNotifyReSort read FOnResort write FOnResort; end; procedure Register; implementation procedure Register; begin RegisterComponents('Max', [TjvDBGridMax]); end; { TjvDBGridMax } constructor TjvDBGridMax.Create(AOwner: TComponent); begin inherited; SortFields := TOrderStringList.Create; end; function TjvDBGridMax.CreateColumns: TDBGridColumns; begin Result := TDBGridColumns.Create(Self, TColumnMax); end; procedure TjvDBGridMax.DrawColumnCell(const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); begin //Deve essere per primo if Assigned(DataSource) then begin //Colora la colonna di ordinamento if FShowOrderColor then begin if (Assigned (Column.Field)) then begin if not HighlightCell(DataCol,DataLink.ActiveRecord, Column.Field.DisplayText,State) then begin if TColumnMax(Column).FOrdered = oDESC then Canvas.Brush.Color := FOrderColorDesc; if TColumnMax(Column).FOrdered = oASC then Canvas.Brush.Color := FOrderColorAsc; DefaultDrawColumnCell (Rect,DataCol,Column,State); end; end; end; end; inherited; end; procedure TjvDBGridMax.TitleClick(Column: TColumn); Var aField: string; aFieldIndex: integer; begin inherited; if Assigned(DataSource) then begin //Ordinamento ascendente/discendente case TColumnMax(Column).FOrdered of oNone : TColumnMax(Column).FOrdered := oASC; oASC : TColumnMax(Column).FOrdered := oDESC; oDESC : TColumnMax(Column).FOrdered := oNONE; end; aField := Column.FieldName; aFieldIndex := SortFields.IndexOf(aField); //Se non l'ho trovato lo aggiungo if aFieldIndex = -1 then begin SortFields.Add(aField); SortFields.Ascending[SortFields.Count - 1] := True; { Column.Field.DisplayLabel := Column.Title.Caption; Column.Title.Caption := Column.Field.DisplayLabel + OrderStr[true]; } end else begin //Altrimenti ordinamento al contrario SortFields.Ascending[aFieldIndex] := not SortFields.Ascending[aFieldIndex]; if SortFields.Ascending[aFieldIndex] then begin SortFields.Delete(aFieldIndex); //Column.Title.Caption := Column.Field.DisplayLabel; end //se sono già in ordinamento discendente pulisco else begin //Column.Title.Caption := Column.Field.DisplayLabel + // OrderStr[SortFields.Ascending[aFieldIndex]]; end; end; if Assigned(FOnResort) then FOnResort(Self, SortFields); Invalidate; end; end; { TColumnMax } constructor TColumnMax.Create(Collection: TCollection); begin inherited; FOrdered := oNone; end; destructor TColumnMax.Destroy; begin inherited; end; { TOrderStringList } function TOrderStringList.GetAscending(Index: Integer): boolean; begin Result := boolean(integer(Objects[Index])); end; procedure TOrderStringList.SetAscending(Index: Integer; Value: boolean); begin Objects[Index] := pointer(integer(Value)); end; end.