Einzelnen Beitrag anzeigen

Benutzerbild von anse
anse

Registriert seit: 30. Okt 2006
Ort: Neuenkirchen
194 Beiträge
 
Delphi 11 Alexandria
 
#1

TListView Komponente mit Hintergrundfarbe pro Spalte

  Alt 16. Nov 2006, 20:57
Hallo,

ich habe eine fertig abgeleitete TListView-Komponente, die mittels einer CustomSort-Methode supergut sortieren kann, wenn man auf die Spalten klickt Jedoch habe ich keine Ahnung wie ich meiner ListView beibringe, die soeben durchgeführte Sortierung auch irgendwie grafisch darzustellen, zB mit einem kleinen Pfeil im Header oder mit einer grauen Hintergrundfarbe der sortierten Spalte oder beides (wie im Windows Explorer).

Ich habe zwar für das Farben-Problem ein Beispiel gefunden: http://www.delphidabbler.com/articles?article=16 . Der Artikel ist sehr gut und verständlich geschrieben. Allerdings geht es dort zB um eine Hintergrundanpassung mittels der OnCustomDrawItem, OnCustomDrawSubItem Prozeduren, die man in einem Form benutzt auf der die ListView sitzt. Irgendwie kriege ich es nicht hin, diese Tips in die von mir abgeleitete Komponente zu übertragen. Es gibt zwar keine Compiler-Fehler, aber die Spalten wollen einfach nicht farbig werden :/

Was ich bisher habe :

Delphi-Quellcode:
type
  TSortListView = class(TListView)
  private
    fCurrentCol : Integer;
    procedure SetLVColumnShading(ColIdx: Integer);
  published
    procedure ColClick(Column: TListColumn); override;

    // Procedures for handling background-color of sorted column
    function CustomDraw(const ARect: TRect; Stage: TCustomDrawStage): Boolean; override;
    function CustomDrawItem(Item: TListItem; State: TCustomDrawState;
      Stage: TCustomDrawStage): Boolean; override;
    function CustomDrawSubItem(Item: TListItem; SubItem: Integer;
      State: TCustomDrawState; Stage: TCustomDrawStage): Boolean; override;

  end;

.....

procedure TSortListView.ColClick(Column: TListColumn);
begin
  if Column.Tag = 1 then
    Column.Tag := -1
  else
    Column.Tag := 1;
  // Updates the index of the shaded column
  fCurrentCol := Column.Index;
  inherited colclick(Column);
  CustomSort(@CustomSortProc, Column.index);
end;


// Displays shading in any area not occupied by list items
function TSortListView.CustomDraw(const ARect: TRect; Stage: TCustomDrawStage): Boolean;
var
  ColLeft: Integer; // left edge of selected column
  ColBounds: TRect; // bounds of the selected column
  I: Integer; // loops thru columns
begin
  // Calculate left side of selected column
  ColLeft := ARect.Left;
  for I := 0 to Pred(fCurrentCol) do
    ColLeft := ColLeft + ListView_GetColumnWidth(Handle, I);
  // Calculate bounding rectangle of selected column
  ColBounds := Rect(
    ColLeft,
    ARect.Top,
    ColLeft + ListView_GetColumnWidth(Handle, fCurrentCol),
    ARect.Bottom
  );
  // Shade the column
  // other event handlers overwrite this where there are list
  // items but this code ensures shading extends to bottom of
  // list view client rectangle
  Canvas.Brush.Color := clSilver;
  Canvas.FillRect(ColBounds);
  result := inherited CustomDraw(ARect, Stage);
end;

// Helper-procedure called from CustomDrawItem and CustomDrawSubItem
procedure TSortListView.SetLVColumnShading(ColIdx: Integer);
begin
  if fCurrentCol = ColIdx then
    // given column is selected: shade it
    Canvas.Brush.Color := clSilver
  else
    // given column not shaded: ensure correct background used
    Canvas.Brush.Color := ColorToRGB(Color);
end;

// Shade the first column (index 0) if this is selected
function TSortListView.CustomDrawItem(Item: TListItem; State: TCustomDrawState;
  Stage: TCustomDrawStage): Boolean;
begin
  SetLVColumnShading(0);
  result := inherited CustomDrawItem(Item, State, Stage);
end;

// Shade a sub item column if selected
function TSortListView.CustomDrawSubItem(Item: TListItem; SubItem: Integer;
  State: TCustomDrawState; Stage: TCustomDrawStage): Boolean;
begin
  if SubItem > 0 then // ensure not column 0 (Delphi 4)
    SetLVColumnShading(SubItem);
  result := inherited CustomDrawSubItem(Item, SubItem, State, Stage);
end;
Ob ich die inherited-Aufrufe wirklich benötige weiß ich nicht genau, aber es macht keinen Unterschied wenn ich sie weglasse und es erscheint mir so sauberer. Aber warum wird hier nix farbig ?
Ansgar Becker
  Mit Zitat antworten Zitat