Listview nur farbige Zeilen anzeigen

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Listview nur farbige Zeilen anzeigen

Beitrag von Michl »

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?

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Aphadias
Beiträge: 124
Registriert: Mi 28. Okt 2015, 18:28

Re: Listview nur farbige Zeilen anzeigen

Beitrag von Aphadias »

@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 :roll:

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

compmgmt
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

Beitrag von compmgmt »

Mal ne andere Frage: Warum eigentlich

Code: Alles auswählen

if colortostring(ListView1.Canvas.Brush.Color) <> colortostring($002424FF) then
und nicht

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);
Have fun with this snippet ;)

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Listview nur farbige Zeilen anzeigen

Beitrag von Michl »

Aphadias hat geschrieben:einmal wenn ein Datum abgelaufen ist
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:wobei mich schon das Ziel interessieren würde wie es mit Farbe funktioniert
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.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Aphadias
Beiträge: 124
Registriert: Mi 28. Okt 2015, 18:28

Re: Listview nur farbige Zeilen anzeigen

Beitrag von Aphadias »

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

Aphadias
Beiträge: 124
Registriert: Mi 28. Okt 2015, 18:28

Re: Listview nur farbige Zeilen anzeigen

Beitrag von Aphadias »

@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

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Listview nur farbige Zeilen anzeigen

Beitrag von Michl »

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).

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Aphadias
Beiträge: 124
Registriert: Mi 28. Okt 2015, 18:28

Re: Listview nur farbige Zeilen anzeigen

Beitrag von Aphadias »

Also wie empfohlen habe ich es folgender Maßen jetzt gemacht..

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 :shock:

Antworten