Listview nur farbige Zeilen anzeigen
Re: Listview nur farbige Zeilen anzeigen
Ich habe jetzt nicht alles gelesen, doch glaube ich daß der Ansatz falsch ist, wenn du die ListItems nach Farbe selektiert löschen willst. Die Logik sollte auch unabhängig der Anzeige funktionieren.
Nach welchem Kriterium färbst du denn die einzelnen ListItems ein?
Nach welchem Kriterium färbst du denn die einzelnen ListItems ein?
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
Re: Listview nur farbige Zeilen anzeigen
@Mathias egal ob ich Listview1.Items.Deleted(i) oder Listview1.Items[i].Deleted schreibe da kommt der gleiche fehler....
@Michl
einmal wenn ein Datum abgelaufen ist soll der die Zeile rot färben und wenn es x Monate bis zum Ablauf sind dann gelb. Per Knopf soll er dann alle Zeilen löschen die nicht rot sind so das dann nur noch die roten da stehen...
Du meinst ich soll sozusagen alles Löschen lassen was noch nicht abgelaufen ist.... ist gar nicht mal so schlecht die idee
wobei mich schon das Ziel interessieren würde wie es mit Farbe funktioniert.... ich glaube aber das ich vermutlich beim gleichen Fehler raus kommen würde
@Michl
einmal wenn ein Datum abgelaufen ist soll der die Zeile rot färben und wenn es x Monate bis zum Ablauf sind dann gelb. Per Knopf soll er dann alle Zeilen löschen die nicht rot sind so das dann nur noch die roten da stehen...
Du meinst ich soll sozusagen alles Löschen lassen was noch nicht abgelaufen ist.... ist gar nicht mal so schlecht die idee
wobei mich schon das Ziel interessieren würde wie es mit Farbe funktioniert.... ich glaube aber das ich vermutlich beim gleichen Fehler raus kommen würde
-
- Beiträge: 351
- Registriert: Mi 25. Nov 2015, 17:06
- OS, Lazarus, FPC: Win 10 Pro | Lazarus 1.8.2 | FPC 3.0.4
- CPU-Target: i386 + x86_64
- Wohnort: in der Nähe von Stuttgart
- Kontaktdaten:
Re: Listview nur farbige Zeilen anzeigen
Mal ne andere Frage: Warum eigentlichund nicht
Das wird zwar dein Problem nicht lösen, ist aber weniger Arbeit für den Prozessor.
Code: Alles auswählen
if colortostring(ListView1.Canvas.Brush.Color) <> colortostring($002424FF) then
Code: Alles auswählen
if ListView1.Canvas.Brush.Color <> TColor($002424FF) then
Das wird zwar dein Problem nicht lösen, ist aber weniger Arbeit für den Prozessor.
Code: Alles auswählen
InitiateSystemShutdownExA(nil, nil, 0, true, false, $0005000F);
Re: Listview nur farbige Zeilen anzeigen
Ich würde dafür eine Funktion schreiben, ob ein Datum abgelaufen ist oder nicht. Diese Funktion rufst du beim Zeichnen der Listview einmal je Item auf. Das Gleiche machst du dann wenn du per Button Einträge löschen willst. Du gehst deine Liste durch und rufst für jedes Element diese Funktion auf und löschst dann entsprechend.Aphadias hat geschrieben:einmal wenn ein Datum abgelaufen ist
Grob erklärt: Die Hintergundfarbe des Canvas stellst du einmal ein. Diese gilt global für das gesamte Canvas. Alles was darauf gezeichnet wird, wird mit der entsprechenden Hintergrundfarbe gezeichnet, ob nun ein Rechteck, ein Kreis oder eben auch das einzelne Item (Text). Die Farbe ist nur zum Zeitpunkt des Zeichnens aktiviert. Greifst du nachdem das Listview seine Items gezeichnet hat auf die Canvas zu, wird es im Idealfall nur die letzte gewählte Hintergrundfarbe dir zurückgeben.Aphadias hat geschrieben:wobei mich schon das Ziel interessieren würde wie es mit Farbe funktioniert
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
Re: Listview nur farbige Zeilen anzeigen
danke
trotz dessen habe ich den fehler gefunden... habe ebend mal eine Showmessage eingebaut um mal schritt für schritt zu sehen was passiert... bei der for schleife vergleicht er auf einmal gar nicht mehr die Farben zueinander... was er ohne for Schleife macht...
kann es sein das ich ListView1CustomDrawSubItem mit der for Schleife beißt? Weil wenn ich nur den IF hinsetze macht er ja schon es für jede Zeile... Ich wollte eigentlich mit der for Schleife auslesen in welche Zeile er sich befindet damit er weiß welche er löschen muss... so fragt er nur die erste oder letzte Zeile an ob die rot ist und dann haut er einfach eine Schleife runter
trotz dessen habe ich den fehler gefunden... habe ebend mal eine Showmessage eingebaut um mal schritt für schritt zu sehen was passiert... bei der for schleife vergleicht er auf einmal gar nicht mehr die Farben zueinander... was er ohne for Schleife macht...
kann es sein das ich ListView1CustomDrawSubItem mit der for Schleife beißt? Weil wenn ich nur den IF hinsetze macht er ja schon es für jede Zeile... Ich wollte eigentlich mit der for Schleife auslesen in welche Zeile er sich befindet damit er weiß welche er löschen muss... so fragt er nur die erste oder letzte Zeile an ob die rot ist und dann haut er einfach eine Schleife runter
Re: Listview nur farbige Zeilen anzeigen
@Michl deswegen wollte ich das sozusagen nur rote zeilen geschrieben werden und alle anderen weg gelassen werden... naja dann muss ich mich wohl auf das datum konzentrieren
Re: Listview nur farbige Zeilen anzeigen
Noch der letzte Hinweis. Im OnPaint sollte man keine größeren Berechnungen machen. Die ganzen Events On.....Draw sollten wirklich nur dem Zweck dienen ein zuvor definiertem Eintrag bzw. dessen Zustand darzustellen. Im besten Fall ruckelt die Anzeige, im schlimmsten gibt es schwer nachzustellende "scheinbar zufällige" Programmabstürze.
Ich wiederhole mich: Programmlogik sollte auch entkoppelt von der Anzeige funktionieren (m.fuchs hatte dazu mal einen schönen Vortrag gemacht).
Ich wiederhole mich: Programmlogik sollte auch entkoppelt von der Anzeige funktionieren (m.fuchs hatte dazu mal einen schönen Vortrag gemacht).
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
Re: Listview nur farbige Zeilen anzeigen
Also wie empfohlen habe ich es folgender Maßen jetzt gemacht..
hier als Bsp habe ich jetzt die Farbe weiß gelöscht.... also alle Zeilen die den Wert der Farbe weiß entsprechen und ging irgend wie einfacher und schneller
Code: Alles auswählen
for i:=Listview1.Items.Count -1 downto 0 do
begin
if Listview1.Items[i].SubItems.Strings[6] <> '' then
begin
if monat <> '' then
begin
if strtodate(Listview1.Items[i].SubItems.Strings[6]) >= IncMonth(date, strtoint(monat)) then
begin
Listview1.Items[i].Delete;
end;
end;
end;
end;
hier als Bsp habe ich jetzt die Farbe weiß gelöscht.... also alle Zeilen die den Wert der Farbe weiß entsprechen und ging irgend wie einfacher und schneller