AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi TListView Komponente mit Hintergrundfarbe pro Spalte
Thema durchsuchen
Ansicht
Themen-Optionen

TListView Komponente mit Hintergrundfarbe pro Spalte

Ein Thema von anse · begonnen am 16. Nov 2006 · letzter Beitrag vom 21. Jul 2008
Antwort Antwort
Benutzerbild von anse
anse

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

TListView Komponente mit Hintergrundfarbe pro Spalte

  Alt 16. Nov 2006, 21: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
hsg

Registriert seit: 24. Apr 2006
Ort: Wustermark
354 Beiträge
 
Delphi 10.3 Rio
 
#2

Re: TListView Komponente mit Hintergrundfarbe pro Spalte

  Alt 17. Nov 2006, 08:10
Hallo,

ich kann dir deine Frage so jetzt nicht beantworten, würde dir aber empfehlen dir mal das VirtualTreeView von Mike Lischke näher anzusehen (http://www.soft-gems.net/).
Lass dich nicht vom Namen TreeView irritieren, schau dir einfach die Demos an und du siehst, mit diesem Teil kannst du (fast) alles machen, was man sich vorstellt.

Gruß
Jörg
  Mit Zitat antworten Zitat
Benutzerbild von anse
anse

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

Re: TListView Komponente mit Hintergrundfarbe pro Spalte

  Alt 17. Nov 2006, 09:50
Hallo,

danke für den Hinweis. Das Teil kann ja so ziemlich alles + mehr!

Allerdings würde ich schon gern verstehen wollen, wie das mit der Hintergrundfarbe und/oder mit der Pfeil-Darstellung funktioniert.

Gruß,
Ansgar
Ansgar Becker
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: TListView Komponente mit Hintergrundfarbe pro Spalte

  Alt 17. Nov 2006, 09:58
Hallo Ansgar,

die einfachste und am weitesten verbreitete Visualisierung für die Sortierung in einer Listenansicht sind die kleinen Bildindikatoren im Spaltenkopf. Besorge dir die beiden Bilder für auf- und absteigende Sortierfolge, packe sie in eine (eventuell schon vorhandene) ImageList und merke dir die Indexnummern dieser Bilder. Die ImageList weist du der Eigenschaft SmallImages der ListView zu und den passenden Bild-Index kannst du dann an ListView.Columns[fCurrentCol].ImageIndex zuweisen, sobald ein Spaltenkopf angeklickt wird. Nicht vergessen, den ImageIndex der bisherigen Spalte wieder auf -1 zu setzen.

Grüße vom marabu
  Mit Zitat antworten Zitat
hsg

Registriert seit: 24. Apr 2006
Ort: Wustermark
354 Beiträge
 
Delphi 10.3 Rio
 
#5

Re: TListView Komponente mit Hintergrundfarbe pro Spalte

  Alt 17. Nov 2006, 10:03
Ich hab mir den Code nicht angesehen, aber ich würde es so machen: die Spaltenfarbe sollte vor dem Schreiben des Textes gemalt werden (ein FillRect auf die zu zeichnende Zelle).

Um das in deine Komponente einzubauen, solltest du die entsprechenden Aufrufstellen für das Malen in den original-Sourcen suchen und dann die entsprechenden Stellen anpassen. In Anlehnung an deinen Code: Suche die Aufrufstellen für OnCustemDraw etc. überschreib diese Methoden und baue dort deinen Code ein.

Aber wie gesagt: ich würde mir die Arbeit nicht machen, das VirtualTreeView macht das alles viel besser!
  Mit Zitat antworten Zitat
Benutzerbild von anse
anse

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

Re: TListView Komponente mit Hintergrundfarbe pro Spalte

  Alt 17. Nov 2006, 10:16
1000 Dank! Problem sogut wie gelöst würde ich sagen.

Eine Frage sei mir noch erlaubt: wie baue ich eine ImageList in eine Komponente ein, ohne Abhängigkeiten zu einer TXYZForm zu erzeugen? Die abgeleitete ListView sollte nämlich weiterhin eigenständig funktionieren. Hmmm, sollte ich die evtl. mit einer "arrows.bmp" im gleichen Verzeichnis wie die .pas-Datei erzeugen:
Delphi-Quellcode:
constructor TSortListView.Create
begin
  SmallImages := ImageList.Create(self);
  SmallImages.LoadFromFile('arrows.bmp');
end;
Oder so ähnlich... Obengenanntes hätte den Nachteil, daß ich eine evtl. zugewiesene Imagelist überschreibe.
Ansgar Becker
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#7

Re: TListView Komponente mit Hintergrundfarbe pro Spalte

  Alt 17. Nov 2006, 10:22
Ich würde anders vorgehen und nur die beiden ImageIndex-Werte als property veröffentlichen. So bleibt alles in der Hand des Entwicklers, der deine Komponente einsetzt.

Freundliche Grüße
  Mit Zitat antworten Zitat
Benutzerbild von anse
anse

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

Re: TListView Komponente mit Hintergrundfarbe pro Spalte

  Alt 17. Nov 2006, 10:44
hört sich gut und sauber an. Danke!
Ansgar Becker
  Mit Zitat antworten Zitat
sunny-andy

Registriert seit: 11. Nov 2007
26 Beiträge
 
#9

Re: TListView Komponente mit Hintergrundfarbe pro Spalte

  Alt 19. Jul 2008, 11:05
Hallo,

ich muss dieses alte Thema leider wieder beleben, da ich ein kleines Problem mit dem Code-Beispiel habe.
Ich Benutze Delphi 2007, und bei mir ist es leider so, dass die Einträge ich der colorierten Spalte verschwinden, sobald ich mit der Maus drüber hover und drauf stehen bleibe. Ich sehe dann in dieser farbigen Spalte nur noch den Hintergrund.
Ich habe alles so übernommen, wie es hier beschrieben wurde. Ich schätze, dass sich bei der Delphi Version einfach ein paar Paint-Ereignisse der ListView geändert haben oder?

Habt ihr vielleicht einen Tipp?
Danke,
Andy
  Mit Zitat antworten Zitat
Benutzerbild von anse
anse

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

Re: TListView Komponente mit Hintergrundfarbe pro Spalte

  Alt 21. Jul 2008, 10:50
Eventuell ein etwas unproduktiver Tipp, aber dennoch: es lohnt sich die ListViews durch VirtualTreeView Komponente zu ersetzen. Damit sind Spalten-Farben ohne Hacks problemlos machbar. Dazu kommen ungefähr eine Million weiterer Features von denen man bei einer TListView nur träumen kann...
Ansgar Becker
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:40 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz