![]() |
Änderung der Farben bei TListView
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo!
Ich arbeite gerade mal wieder an einem neuen Projekt, in dem ich TListView verwende. Leider passt das Layout nicht ganz in mein Programm, d.h. ich muss die Farbe (clHighlight) ändern, wenn man ein Item markiert. Am besten schaut man sich die Bilder im Anhang an! Ich will die Farbe so wie im Bild "nachher.jpg" haben - nur wie und wo ändere ich das?! Des Weiteren würde ich gerne auch die anderen Farben ändern. Nur ich habe nicht wirklich viel dazu gefunden und steh irgendwie auf m Schlauch :wall: Vielen Dank schon mal... mfg shark |
Re: Änderung der Farben bei TListView
Hi,
den Farbwert ändern halte ich für nicht so toll, da sich das auf das ganze System auswirken würde. D.h. du musst das Zeichnen selber übernehmen. Es gibt entsprechende Ereignisse (OnDrawItem z.B.) mit denen du das handhaben kannst. Chris |
Re: Änderung der Farben bei TListView
Ich dachte zum Ändern der Systemfarben ist das ControlPanel da...
|
Re: Änderung der Farben bei TListView
Korrekt - Farbeinstellungen für Standardkomponenten nimmt der Benutzer vor, nicht der Entwickler.
Grüße vom marabu |
Re: Änderung der Farben bei TListView
Ich weiss nicht ob jetzt die Listview auch dazugehört aber einige Komponenten in der VCL sind nicht weiter als aufrufe der Windows eigenen "Komponenten". Die TabRegister (mir fällt der Name gerade nicht mehr ein) ist so eins. Da gibt es in der VCL keinen wirklich Sourcecode, es wird nicht anderes gemacht als die Windowskomponente aufzurufen. Von daher gibt es für solche Komponenten erstmal auch nicht die Möglichkeit am Design etwas zu ändern anhand von properties. Ich hoffe das wurde von mir jetzt richtig wiedergegeben.
Gruss Dragi |
Re: Änderung der Farben bei TListView
Zitat:
mfg shark |
Re: Änderung der Farben bei TListView
Hi,
Beispiele findest du zwar sicher auch mit der Suche, aber ich gebe dir jetzt trotzdem gerade eines. ;) Wenn du im entsprechenden Ereignis bist (müsste OnDrawItem sein), dann dort einfach folgendes schreiben:
Delphi-Quellcode:
Das würde zum Beispiel die Farbe der Schrift ändern. Du musst halt ein wenig mit den Canvas-Eigenschaften herumspielen.
Sender.Canvas.Font.Color := clRed;
Chris Edit: Zu früh abgeschickt. :wall: |
Re: Änderung der Farben bei TListView
danke ;) werde mich da mal umschauen...
|
Re: Änderung der Farben bei TListView
hab jetzt soweit schon mal die markierung umgestaltet, nur wenn ich dann das neu zeichne wird leider die Schrift überdeckt, was ich nicht will. Besteht die Möglichkeit nur die Schrif neu zu zeichnen?!
|
Re: Änderung der Farben bei TListView
Hi,
wenn, dann musst du den kompletten Eintrag neuzeichnen und somit auch den Text ändern. Also einfach per ![]() Chris |
Re: Änderung der Farben bei TListView
hätte gehofft dass es dafür ne einfachere Funktion gibt... Wie Update oder sowas - hab aber bisher nix gefunden. Dann muss ich wohl oder übel komplett neu zeichen. Das einzigste Problem ist dann, dass ich zwei Spalten habe: Eine, bei der der Text links angeordnet wird und eine andere bei der der text rechts angeordnet wird. Könntest du mir daher sagen wie ich einen Text nach links schreiben, d.h. dass der Text auf der rechten Seite bünfig ist?!
mfg shark |
Re: Änderung der Farben bei TListView
Hi Leute,
da ich demnächst vor dem selben Problem stehe, habe ich hier mal eine allgemein zu gebrauchene Procedure geschrieben. Wäre gut wenn ihr die mal testen könntet, bei mir läuft sie.
Delphi-Quellcode:
Bsp:
{ TextOutOnListview
written by David Dung 2005 Diese Procedure ermöglicht die Manipulation des Hintergrundes einer TListview. Z.B. zum Verändern der Markierungsfarben. Vorgehen: Quellcode im OnCustomDrawItem-Event der Listview - "DefaultDraw" auf "False" setzten - Beliebig auf die Zeichenfläche malen - TextOutOnListview("die Listview", Item.Index); aufrufen Hiermit wird der Inhalt der Listview mit transparenter Hintergrund- und Schriftfarbe des Listview auf die Zeichenfläche kopiert. } 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 //Hintergrundfarbe durchsichtig listview.canvas.Brush.Style := bsClear; //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;
Delphi-Quellcode:
[Edit] Jetzt kommt die Procedure auch mit mittigen Spalten zurecht.[/Edit]
procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean); begin DefaultDraw := false; //Hier könnt ihr jetzt alles auf Sender.Canvas malen, was ihr wollt //Am Ende meine Procedure aufrufen um Text widerherzustellen TextOutOnListview(Listview1, Item.Index); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:57 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz