Einzelnen Beitrag anzeigen

Benutzerbild von Puke
Puke

Registriert seit: 7. Nov 2012
123 Beiträge
 
Delphi XE5 Architect
 
#1

Hintergrund in Listview einfärben

  Alt 13. Nov 2012, 07:00
Hi,
ich habe eine Listview mit bestimmten Attributen:
  • Zeilen Schriftfarben werden eingefärbt
  • Der ausgewählte Eintrag wird Orange dargestellt
  • Der abspielende Eintrag wird mit dicker Schrift dargestellt
  • Jeder zweite Eintrag wird mit grauem Hintergrund dargestellt

Ich habe in Google nach einer Lösung gesucht um das eigenstängige Selektieren von Windows zu unterbinden, da es dann in Systemfarben wäre, was dann wiederrum nicht zu meinem Layout passen würde. Daher zeichne ich die ganze Zeile immer nochmal neu. Da ich daraufhin keine Lösung für mein neues Problem gefunden habe frage ich euch.

Delphi-Quellcode:
procedure TForm1.PlaylistViewCustomDrawItem(Sender: TCustomListView;
  Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);

var
  hallo:TLIstItem;
begin
if Fertig=true
then begin

  defaultDraw:=false;

  hallo:= PlaylistView.Items[Item.Index];
  if (Item=nil) then Exit;

  //Abspielender Eintrag
  with Sender.Canvas.Brush do
    if Odd(Item.Index) then Color:=cl3dlight
                                                                                            else Color:=clWhite;
  //Abspielender Eintrag
  with Sender.Canvas.Font do
    if (titelanzeige.Caption=hallo.Caption) and
        (interpretlabel.caption= Hallo.SubItems[0]) and
        (albumlabel.Caption=hallo.SubItems[1]) and
        (genrelabel.Caption= Hallo.SubItems[2]) then Style:=[fsbold]
                                                                                            else Style:=[];
  //Markierte Zeile
  with Sender.Canvas.Brush do
    if hallo.Caption+Hallo.SubItems[0]+hallo.SubItems[1]+Hallo.SubItems[2]=Playlistindex then Color:= clwebdarkorange;

  //Text widerherstellen
  [B]TextOutOnListview(Playlistview, Item.Index);[/B]

end;


end;
und: TextOutOnListview(Playlistview, Item.Index);

Delphi-Quellcode:
procedure TextOutOnListview(Listview: tListview; Index: integer);

  { GetTextOutPosX

    Diese Funktion gibt die x Position zurück, an der der Text gezeichnet
    werden muss }


  function GetTextOutPosX(Column: integer; Text: string): integer;
  var
    i: integer;
  begin
    //Linksbündig?
    if Listview.Column[Column].Alignment = taleftJustify then
      begin
        //Standard Rand von links: 4 pixel
        result := 4;
        //Breiten aller Spalten zusammenrechnen
        for i := 0 to Column - 1 do
          result := result + Listview.Column[i].Width + 2;
      end
    else
      //Rechtsbündig?
      if Listview.Column[Column].Alignment = taRightJustify then
        begin
          result := 0;
          //Breiten aller Spalten zusammenrechnen
          for i := 0 to Column - 1 do
            result := result + Listview.Column[i].Width;
          //Von der Position die Textbreite abziehen und den Wert von 6 Pixeln für den Rand rechts
          result := result + Listview.Column[Column].Width - Listview.Canvas.TextWidth(Text) - 6;
        end
      else
        //Mittig?
        if Listview.Column[Column].Alignment = taCenter then
          begin
            result := 0;
          //Breiten aller Spalten zusammenrechnen
            for i := 0 to Column - 1 do
              result := result + Listview.Column[i].Width;
          //Von der Position die halbe Spaltenbreite dazu addieren und die halbe Textbreite wieder abziehen
            result := result + trunc((Listview.Column[Column].Width) / 2 - Listview.Canvas.TextWidth(Text) / 2);
          end;
  end;

var
  cols: integer;
begin

  //Text der ersten Spalte kopieren
  listview.Canvas.TextOut(GetTextOutPosX(0, listview.Items[index].caption), Listview.Items[index].Top, listview.Items[index].caption);

  for cols := 1 to listview.Columns.Count - 1 do
    //Weitere Columns zeichnen
    listview.Canvas.TextOut(GetTextOutPosX(cols, listview.Items[index].SubItems[cols - 1]), Listview.Items[index].Top, listview.Items[index].SubItems[cols - 1]);

  //Hintergrundfarbe wieder herstellen
  listview.canvas.Brush.Style := bsSolid;


end;
Frage: Warum wird dann nicht die Ganze Zeile der TListview in den angegeben Hintergrundfarben dargestellt, sondern nur der Teil mit Text, und wie löse ich dieses Problem?

Ich bedanke mich schonmal für alle antworten.
Und denkt dran scheißt mich zusammen wenn ich was falsch mache. Bin theoretisch noch Anfänger!
Gruß Puke

Geändert von Puke (13. Nov 2012 um 07:13 Uhr)
  Mit Zitat antworten Zitat