TAdvStringGrid
Example 69 : Using Windows Vista style column header dropdown menus
The Windows Vista file explorer introduces interesting and user friendly filtering & sorting capabilities via column headers. By using TAdvStringGrid and TAdvStickyPopupMenu (available in the TMS VCL UI Pack) it is possible to add a similar interface to your applications.To achieve this, set grid.Look = glVista. This will change the fixed cell colors to appear with mirrored gradients as well as hover & down colors. To have a dropdown button on fixed cells, set grid.ControlLook.FixedDropDownButton to true. Hovering on fixed cells is enabled by setting grid.HoverFixedCells to hfFixedRows.
Drop a TAdvStickyPopupMenu on the form. The menu items are set to allow to configure a filter for values 0..25, 26..50, 51..75 and 76..100. Two items are added to invoke ascending or descending sorting.
The grid is initialized with values between 0 and 100 with code:
procedure TForm1.FormCreate(Sender: TObject); var i: integer; begin advstringgrid1.RandomFill(false,100); advstringgrid1.SortSettings.Show := true; advstringgrid1.FixedRowAlways := true; for i := 1 to advstringgrid1.ColCount - 1 do advstringgrid1.Cells[i,0] := 'Col ' + inttostr(i); end;
procedure TForm1.AdvStringGrid1FixedDropDownClick(Sender: TObject; ACol, ARow: Integer; var AMenu: TPopupMenu; var KeepFixedCellHighlighted: boolean); var r: TRect; pt: TPoint; begin r := advstringgrid1.CellRect(ACol,ARow); pt := Advstringgrid1.ClientToScreen(Point(r.Right - 16, r.Bottom)); FilterColumn := ACol; AdvStickyPopupMenu1.ShowMenu(pt.X,pt.y); KeepFixedCellHighlighted := true; end;
procedure TForm1.AdvStickyPopupMenu1MenuHide(Sender: TObject); begin advstringgrid1.ResetFixedCellHighlight; end;
Handling the sorting is done from the MenuItemClick event:
procedure TForm1.AdvStickyPopupMenu1ItemClick(Sender: TObject; Index: Integer); begin if Index = 5 then advstringgrid1.Sort(FilterColumn, sdAscending); if Index = 6 then advstringgrid1.Sort(FilterColumn, sdDescending); end;
and the filtering is invoked from the MenuItemCheck event:
procedure TForm1.AdvStickyPopupMenu1CheckClick(Sender: TObject; Index: Integer; Checked: boolean); var fltr: string; function AppendFilter(s:string): string; begin if fltr = '' then fltr := s else fltr := fltr + ' | ' + s; end; begin if Index in [0..3] then // filter checkbox is choosen begin fltr := ''; advstringgrid1.FilterActive := false; // remove filtering AdvStringGrid1.Filter.Clear; // build new filter if AdvStickyPopupMenu1.MenuItems[0].Checked then AppendFilter('(<=25)'); if AdvStickyPopupMenu1.MenuItems[1].Checked then AppendFilter('(>25 & <=50)'); if AdvStickyPopupMenu1.MenuItems[2].Checked then AppendFilter('(>50 & <=75)'); if AdvStickyPopupMenu1.MenuItems[3].Checked then AppendFilter('(>75 & <=100)'); if fltr <> '' then // apply new filter begin with advstringgrid1.Filter.Add do begin condition := fltr; column := FilterColumn; end; AdvStringGrid1.FilterActive := true; end; end; end;
Delphi project & source files for downloading included in the main demos distribution for Delphi.
×