Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi LIstview Eintrag aber nicht Icon markieren (https://www.delphipraxis.net/89444-listview-eintrag-aber-nicht-icon-markieren.html)

Guido Eisenbeis 31. Mär 2007 03:34


LIstview Eintrag aber nicht Icon markieren
 
In einem Listview wird beim Markieren der jeweilige Eintrag eingefärbt (zum Beispiel blauer Hintergrund mit weißer Schrift). Hat dieser Eintrag nun ein Icon, so wird das Icon ebenfalls eingefärbt. Aber auch nicht immer! Manche Icons werden eingefärbt, andere nicht. :gruebel:

Ich will nun dass nur die eigentlichen Einträge (also der Text) gefärbt wird und die Icons sollen NICHT gefärbt werden. Ich habe nun selbst etliches ausprobiert, von den Einstellungen des ImageList bishin zum Einrichten einer eigenen Spalte nur für die Icons. Hierbei soll jedoch auch beim Klicken auf das Icon der (Text-) Eintrag markiert werden.

In der DP habe ich nun gesucht unter dem Stichwort "Listview". Es wurden 1.312 Thread aufgezeigt, wovon ich 1.313 :wink: durchgelesen habe. Lediglich bei der Eingrenzung mit "Icon" war ein 'halber' Treffer dabei: ListView: "Ganzes" item markieren?. Es geht dabei zwar um fast das selbe Thema, aber der Autor wollte das Icon immer markiert haben, während ich das Icon immer UNmarkiert haben will. (Dort gab es leider keine Lösung für sein Problem.)

Wie kann ich also erreichen, dass beim Markieren eines Listview-Eintrags nur der Text und nicht das Icon gefärbt wird?

Guido.

cherry 2. Apr 2007 10:01

Re: LIstview Eintrag aber nicht Icon markieren
 
hi...

hast du ein gewisses Muster erkannt, wann das Icon markiert wird und wann nicht??
Am besten stellst du gleich ma das ganze Projekt hoch, dann kann ich ja mal (in ner freien Minute)
einen Blick drauf werfen?! falls es nicht zu gross ist...

Gruss enemyleft

Guido Eisenbeis 3. Apr 2007 18:07

Re: LIstview Eintrag aber nicht Icon markieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo enemyleft.

Ich dachte schon, es würden garkeine Antworten mehr kommen. :wink: Oder dass dieses Problem zu popelig ist!? :stupid:

Doch nun im Ernst:

Zitat:

Zitat von cherry
hast du ein gewisses Muster erkannt, wann das Icon markiert wird und wann nicht??

Das Muster ist ganz klar: Einige Icons werden mitmarkiert (also bei ersten Mal genauso wie beim millionsten Mal) und andere werden nicht mitmarkiert (also weder beim ersten Mal noch beim millionsten Mal). Unter mitmarkiert verstehe ich das bläulichfärben bestimmter Bereiche eines Icons.

Zitat:

Zitat von cherry
Am besten stellst du gleich ma das ganze Projekt hoch, dann kann ich ja mal (in ner freien Minute)
einen Blick drauf werfen?! falls es nicht zu gross ist...

Hey, das ist cool! Ein Projekt kann man das eigentlich nicht nennen, denn es passiert lediglich im Control selbst (ListView). Ein entsprechendes Demo habe ich erstellt und hochgeladen.

Viel Erfolg beim Testen und Finden einer Lösung!

Guido.

cherry 4. Apr 2007 06:35

Re: LIstview Eintrag aber nicht Icon markieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Guten Morgen

Also ich entwickle mit BDS2006 und habe das mal so kompiliert wie ichs erhalten habe!
Ich habe die Ausführbare Datei mal hochgestellt... Also ich sehe bei mir kein Problem?! :gruebel:
Einzig bei Item 1 (unter Item von Item 0) ist kein Icon dran.

Schau dir doch bitte mal meine Exe an, ist da das Problem auch vorhanden oder nicht? :dance:

Guido Eisenbeis 5. Apr 2007 01:19

Re: LIstview Eintrag aber nicht Icon markieren
 
Hallo enemyleft.

Zitat:

Zitat von cherry
Ich habe die Ausführbare Datei mal hochgestellt...

Ich habe sie mir angesehen und es ist genau das gleiche, wie wenn ich sie selbst kompiliere.

Zitat:

Zitat von cherry
Also ich sehe bei mir kein Problem?! :gruebel:

Das Problem ist nach wie vor das gleiche: Wird ein Eintrag markiert, wird auch das Icon markiert. Das heißt, das Icon wird mitgefärbt (bläulich).

Zitat:

Zitat von cherry
Einzig bei Item 1 (unter Item von Item 0) ist kein Icon dran.

Doch, da ist ein Icon. Es handelt sich hier ja um ein ListView (kein Treeview). Das was hier nach einem SubItem-Pfeil aussieht, ist in Wirklichkeit ein Icon.

Es ist allerdings bei allen Icons so, dass sie mitgefärbt werden. Nur bei einigen sieht man es mehr, bei anderen weniger. Wie zum Beispiel beim Item 1 (also das mit dem "SubItem-Pfeil-Imitat" :wink: )


Guido.

cherry 5. Apr 2007 06:50

Re: LIstview Eintrag aber nicht Icon markieren
 
Zuerst schreibst du:

Zitat:

Zitat von Guido Eisenbeis
Hat dieser Eintrag nun ein Icon, so wird das Icon ebenfalls eingefärbt. Aber auch nicht immer! Manche Icons werden eingefärbt, andere nicht.

Und dann schreibst du:

Zitat:

Zitat von Guido Eisenbeis
Es ist allerdings bei allen Icons so, dass sie mitgefärbt werden. Nur bei einigen sieht man es mehr, bei anderen weniger.

Also in meinen Augen löst sich ja Problem 1 in Luft auf. (lol) Dies hat mich am Anfang ziemlich
verwirrt. :freak:

Jetzt wäre noch Problem 2, das einzige Problem das du hast oder?
Du willst, dass die Icons nicht mitmarkiert werden.

Also ich schau mal was ich rauskriege, ich denke aber einfach wird das nicht,
weil das so nicht vorgesehen ist.

Du müsstes wahrscheinlich, bei einer Markierung den Eintrag ganz selber Zeichnen, Mit allem drum und dran. Also:
Icon, Text und Textmarkierung... das kann ja noch heiter werden :stupid:

Bis denne

cherry 5. Apr 2007 08:07

Re: LIstview Eintrag aber nicht Icon markieren
 
Also ich habe bis jetzt herumgepröbelt... leider aber nichts brauchbares gefunden.
Ich habs mal so probiert... Aber ehrlich gesagt weiss ich nicht warum das
nicht geklappt hat?!

Delphi-Quellcode:
procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
  Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
  DefaultDraw := true;
  bmp := TBitMap.Create;
  if cdsSelected in State then
  begin
    Imagelist1.GetBitmap(Item.Index,bmp);
    gr := TGraphic(bmp);
    ListView1.Canvas.Draw(Item.Position.X,Item.Position.Y,gr);
  end;
end;
erstens verändert sich aus irgendeinem Grund die Schriftart, dann
wird das Gezeichnete wieder überladen und und und...

Also ich würde jezt, wenn ich du wäre, eine Neue Komponente erstellen.
Direkt ableiten von TListView und die nötigen Proceduren anpassen,
respektive overriden!

> Anstatt die Idee mit der Komponente, kannst du auch alles selber Zeichnen,
ist vielleicht einfacher?!

Ich sollte mich jetzt mal hinter meine Arbeit klemmen, sonst hat mein
Chef nicht freude...

Also schöne Ostern allerseits

PS: versuche mal meine Funktion mit DefaultDraw := false, dann
siehst du das ich gar nicht soweit von der Lösung entfernt war.
(in meinen Gedanken auf jedenfall :stupid: )

Guido Eisenbeis 5. Apr 2007 18:53

Re: LIstview Eintrag aber nicht Icon markieren
 
Hallo enemyleft.

Zitat:

Zitat von cherry
Zuerst schreibst du:

Zitat:

Zitat von Guido Eisenbeis
Hat dieser Eintrag nun ein Icon, so wird das Icon ebenfalls eingefärbt. Aber auch nicht immer! Manche Icons werden eingefärbt, andere nicht.

Und dann schreibst du:

Zitat:

Zitat von Guido Eisenbeis
Es ist allerdings bei allen Icons so, dass sie mitgefärbt werden. Nur bei einigen sieht man es mehr, bei anderen weniger.

Also in meinen Augen löst sich ja Problem 1 in Luft auf. (lol) Dies hat mich am Anfang ziemlich verwirrt. :freak:

Ja, das stimmt so weit. Man lernt ja dazu. Und was am Anfang aussah als wäre es unmarkiert, stellte sich später heraus als ... :gruebel: ... tja, als was? Manche Icons werden fast garnicht mitmarkiert. Da sind dann nur bei genauem Hinsehen ein oder mehrere Ränder gefärbt/markiert. Deshalb habe ich im Demo geschrieben: "Die Icons 1 und 6 werden (scheinbar) nicht mitgefärbt."

Zitat:

Zitat von cherry
Jetzt wäre noch Problem 2, das einzige Problem das du hast oder?

Ach, wäre das schön! :party: *Scherz*

Aber mal im Ernst! Vielen Dank für deine Bemühungen. Deine obige Funktion habe ich getestet. Ist halt noch nicht "ausgereift". Investier nicht zu viel Zeit dafür, sonst ist dein Chef vielleicht wirklich irgendwann sauer. :dancer2:

Viele Grüße,
Guido.

DGL-luke 5. Apr 2007 19:09

Re: LIstview Eintrag aber nicht Icon markieren
 
Hallo, könnte das ganz/teilweise einfärben mit der Transparenz zusammenhängen? Nur so n Querschuss, ohne den Thread aufmerksam gelesen zu haben ;-)

bitsetter 5. Apr 2007 22:04

Re: LIstview Eintrag aber nicht Icon markieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Moin

@Guido
Dein Code habe ich jetzt ein "bisschen" umgeschrieben, das Icon wird jetzt nicht mehr mitmarkiert.

EDIT: Der Code wurde nochmal ein bisschen überarbeitet.

Guido Eisenbeis 6. Apr 2007 06:14

Re: LIstview Eintrag aber nicht Icon markieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
@DGL-luke

Zitat:

Zitat von DGL-luke
Hallo, könnte das ganz/teilweise einfärben mit der Transparenz zusammenhängen?

Die Sachen mit Transparenz, Mask, usw. hatte ich schon alle ausprobiert, bevor ich hier gepostet habe. Dennoch danke!


@bitsetter

Problem gelöst! Dein Code funktioniert wunderbar! :thumb:

Ich hatte mittlerweile zwar selbst eine Lösung gefunden, wobei ich StateImages statt SmallImages benutzte. Deine Lösung ist jedoch besser! Es wird damit gezielt genau das Gewünschte erreicht, nämlich dass die Icons nicht mitmarkiert werden. Und sie ist sauberer, denn die StateImages stehen damit für ihren normalen Zweck zur Verfügung.

In deinem Code war ein winziger Fehler drin, wobei in GetBitmap() Item.ImageIndex verwendet werden muss statt Item.Index. Ansonsten ist der Code genau das, was ich gesucht habe!

Desweiteren, wenn man im ListView eine andere Farbe als Weiß eingestellt hat, wurden die Icons trotzdem weiß hinterlegt. Damit sie transparent gemalt werden, habe ich DrawIconEx benutzt. Dies und ein paar kleine Feintunig-Änderungen befinden sich im angehängten Downlod. Den habe ich entsprechend der Lösung umbenannt in "Icon wird NICHT mitmarkieren (Demo) 4".


Vielen Dank an dich für die Lösung! Und an alle anderen für ihre Hilfestellung.

Guido.

Edit: Schreibfehler im Beitrag korrigiert.

bitsetter 6. Apr 2007 11:18

Re: LIstview Eintrag aber nicht Icon markieren
 
@Guido

Ein bisschen Arbeit wollte ich ja auch noch für dich übriglassen. :)

Dank deiner Änderungen funktioniert es natürlich jetzt noch besser, wieder was dazugelernt.

Guido Eisenbeis 7. Apr 2007 04:32

Re: LIstview Eintrag aber nicht Icon markieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo bitsetter.

Hier eine überarbeitete Version, bei der die Darstellung für inaktive ListItems implementiert ist. Vielleicht kannst du sie dir mal anschauen und sagen, ob du Verbesserungsvorschläge hast. Zum Beispiel ob es eine bessere Farb-Variable für "inaktiv" gibt. Derzeit verwende ich btnFace.

Dann fehlt jetzt nur noch eine Möglichkeit, die ListItems in der Höhe zu vergrößern, ohne dass die Schrift größer wird (und eine schöner Schrift wäre nicht schlecht :-D ).
Wie könnte ich das denn bewerkstelligen?

Gruß,
Guido.

bitsetter 7. Apr 2007 21:07

Re: LIstview Eintrag aber nicht Icon markieren
 
Zitat:

Zitat von Guido Eisenbeis
Zum Beispiel ob es eine bessere Farb-Variable für "inaktiv" gibt. Derzeit verwende ich btnFace.

btnFace ist korrekt
Delphi-Quellcode:
       
Brush.Color := clBtnFace;
Font.Color:= clBtnText;
Zitat:

Zitat von Guido Eisenbeis
Dann fehlt jetzt nur noch eine Möglichkeit, die ListItems in der Höhe zu vergrößern, ohne dass die Schrift größer wird (und eine schöner Schrift wäre nicht schlecht :-D ).
Wie könnte ich das denn bewerkstelligen?

Das wir wohl so einfach nicht möglich sein, wozu brauchst du das, etwa für größere Bilder?
Wenn ich noch was herausfinde melde ich mich.

Guido Eisenbeis 7. Apr 2007 22:00

Re: LIstview Eintrag aber nicht Icon markieren
 
Zitat:

Zitat von bitsetter
btnFace ist korrekt
Delphi-Quellcode:
       
Brush.Color := clBtnFace;
Font.Color:= clBtnText;

Alles klar, danke.

Zitat:

Zitat von bitsetter
Zitat:

Zitat von Guido Eisenbeis
... eine Möglichkeit, die ListItems in der Höhe zu vergrößern, ohne dass die Schrift größer wird ...

... wozu brauchst du das, etwa für größere Bilder?

Aus zwei Gründen:
1. evtl. für größere Bilder (zweitrangig)
2. vor allem um die Abstände zwischen den Reihen "luftiger" darzustellen. So dass die Icons nicht so aneinander kleben.

Mein Ansatz: die Schriftgröße des ListViews größer stellen (z. B. auf 14) und dann eine Möglichkeit finden, den Item-Text mit einer kleineren Schriftgröße ins Canvas zu zeichnen. Leider habe ich noch keine Möglichkeit gefunden, Text ins Canvas zu zeichen, mit einer Schrift die kleiner als die im ListView eingestellte ist. Schalte ich kurzzeitig um und wieder zurück, gerät die DrawItem-Routine in eine Endlosschleife.

Mal sehen, was sich da so findet.

Gruß,
Guido.

bitsetter 7. Apr 2007 23:54

Re: LIstview Eintrag aber nicht Icon markieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Moin,

das mit der Item Höhe habe ich jetzt mit einer Pseudo Imagelist gelöst, die Höhe der Liste ist die Item Höhe.
Was anderes fällt mir auch erst mal nicht ein.
Vom Prinzip her, könntest du jetzt auch größere Icone nehmen, musst vorher aber die Höhe und Breite der Imageliste anpassen. Das Gute ist, jetzt kannst du das Aussehen deines Listviews selber bestimmen.

Guido Eisenbeis 9. Apr 2007 19:29

Re: LIstview Eintrag aber nicht Icon markieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo bitsetter.

So, es ostert sehr! Deshalb hat meine Antwort auch ein bisschen gedauert. :)

Deinen obigen Code habe ich mir angesehen. Leider kann ich irgendwie nicht nachvollziehen, was das ListView anstellt, wenn man im ReportMode mit LargeImages arbeitet. Ich dachte, die hätten dann keine Auswirkung. Das ListView ist ein komisches Ding!

Das tut der Sache jedoch keinen Abbruch, dass dein Code funktioniert. Dafür meinen Dank!

Ich habe parallel dazu einen Code entwickelt, der eine andere mystische Kraft des ListViews nutzt. Ich stelle die Schriftgröße des ListViews zum Beispiel auf 14, fügt dann die ListItems hinzu und stelle hinterher die Schriftgröße wieder kleiner, zum Beispiel auf 8. Funktioniert nur beim Erstellen des ListViews und bei OwnerDraw:= true.

Nun behält das ListView die größere Zeilenhöhe bei, auch wenn zur Laufzeit weitere ListItems hinzugefügt werden. Die Zeichen-Routine im DrawItem-Event habe ich komplett überarbeitet. Sie funktioniert nun wirklich gut! Um das Zeichnen flackerfrei durchzuführen, benutze ich ein unsichtbares Bitmap. In diesem Bitmap werden zunächst die einzelnen Zeichenaktionen durchgeführt und danach in einem Rutsch ins ListView übertragen.

Wenn du willst schau's dir mal an. Wie gehabt: Über Verbesserungsvorschläge freue ich mich!

Gruß,
Guido.

PS: Da das Problem mit der Zeilenhöhe ein anderes ist, als das ursprüngliche dieses Topics, werde ich jetzt erstmal recherchieren und falls dann noch nötig, einen Thread zum Thema ListView-Zeilenhöhe öffnen.

Timi-loader 3. Mai 2007 19:42

Re: LIstview Eintrag aber nicht Icon markieren
 
ist es auch möglich den hintergrund des icons einzufärben?

mfg

bitsetter 3. Mai 2007 20:46

Re: LIstview Eintrag aber nicht Icon markieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

wie meinst du das mit dem Hintergrund des Icons einfärben, etwa so wie im Bild?

Timi-loader 3. Mai 2007 21:03

Re: LIstview Eintrag aber nicht Icon markieren
 
nja ich mein das nicht generell sondern nur beim selektieren.

mfg

bitsetter 3. Mai 2007 21:33

Re: LIstview Eintrag aber nicht Icon markieren
 
Liste der Anhänge anzeigen (Anzahl: 2)
Sicherlich geht es irgendwie, ich habe nun noch ein neues Bild angehängt, wo der Hintergrund nur beim Selektieren eingefärbt wird.

Timi-loader 4. Mai 2007 09:06

Re: LIstview Eintrag aber nicht Icon markieren
 
ja genau wie beim hintergrund 2. wie hast du das geproggt?

bitsetter 4. Mai 2007 09:25

Re: LIstview Eintrag aber nicht Icon markieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Moin Moin,

die Variante finde ich aber nicht so gut, denn wenn der Eintrag markiert ist kann man das Icon nur schlecht erkennen. Aber das ist wohl Geschmacksache.

Timi-loader 4. Mai 2007 13:07

Re: LIstview Eintrag aber nicht Icon markieren
 
ich finds perfekt!

großes dankeschön!

EDIT: kann man die icons irgendwie noch richtig alphatransparent ausgeben?


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:31 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-2025 by Thomas Breitkreuz