Listview nur farbige Zeilen anzeigen

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut

Re: Listview nur farbige Zeilen anzeigen

Beitragvon Michl » 17. Aug 2017, 12:45 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?
Code: Alles auswählen
type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 
Michl
 
Beiträge: 2168
Registriert: 19. Jun 2012, 11:54
OS, Lazarus, FPC: Win7 Laz 1.7 Trunk FPC 3.1.1 Trunk | 
CPU-Target: 32Bit/64bit
Nach oben

Beitragvon Aphadias » 17. Aug 2017, 12:59 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 :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
Aphadias
 
Beiträge: 85
Registriert: 28. Okt 2015, 18:28

Beitragvon compmgmt » 17. Aug 2017, 13:18 Re: Listview nur farbige Zeilen anzeigen

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.
Signatur.exe hat eine Zugriffsverletzung ausgelöst und muss beendet werden
compmgmt
 
Beiträge: 273
Registriert: 25. Nov 2015, 17:06
Wohnort: in der Nähe von Stuttgart
OS, Lazarus, FPC: Win 10 Pro + Linux Manjaro 17.0.2 | Lazarus 1.6.4 | FPC 3.0.2 | 
CPU-Target: i386 + x86_64
Nach oben

Beitragvon Michl » 17. Aug 2017, 13:26 Re: Listview nur farbige Zeilen anzeigen

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; 
Michl
 
Beiträge: 2168
Registriert: 19. Jun 2012, 11:54
OS, Lazarus, FPC: Win7 Laz 1.7 Trunk FPC 3.1.1 Trunk | 
CPU-Target: 32Bit/64bit
Nach oben

Beitragvon Aphadias » 17. Aug 2017, 13:28 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
Aphadias
 
Beiträge: 85
Registriert: 28. Okt 2015, 18:28

Beitragvon Aphadias » 17. Aug 2017, 13:29 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
Aphadias
 
Beiträge: 85
Registriert: 28. Okt 2015, 18:28

Beitragvon Michl » 17. Aug 2017, 13:47 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).
Code: Alles auswählen
type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 
Michl
 
Beiträge: 2168
Registriert: 19. Jun 2012, 11:54
OS, Lazarus, FPC: Win7 Laz 1.7 Trunk FPC 3.1.1 Trunk | 
CPU-Target: 32Bit/64bit
Nach oben

Beitragvon Aphadias » 21. Aug 2017, 17:35 Re: Listview nur farbige Zeilen anzeigen

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:
Aphadias
 
Beiträge: 85
Registriert: 28. Okt 2015, 18:28

• Themenende •
Vorherige

Zurück zu Freepascal



Wer ist online?

Mitglieder in diesem Forum: Baidu [Spider] und 1 Gast

porpoises-institution
accuracy-worried