Listview nur farbige Zeilen anzeigen

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Aphadias
Beiträge: 124
Registriert: Mi 28. Okt 2015, 18:28

Listview nur farbige Zeilen anzeigen

Beitrag von Aphadias »

moin.... ich mal wieder :oops:

ich experimentiere z.Z. ja wieder viel rum :roll: .... mir kam heute doch noch eine coole Idee... da ich ja mal bestimmte Zeilen in meiner Listview einfärben wollte (ROT) wollte ich jetzt mal es so machen das ich auf einen Button klicke und mir dann nur noch die roten Zeilen Angezeigt werden.

Code: Alles auswählen

procedure TFtukv.Button5Click(Sender: TObject);
var
  i:Integer;
begin
  for i:=0 to Listview1.Items.Count-1 do
  begin
    if ListView1.Color <> $002424FF then
    begin
      Listview1.Selected := ListView1.Items[i];
      Listview1.Selected.Delete;
    end;
  end;
end;


ich glaube entweder ist das if falsch das er den Wert einer Farbe nicht vergleichen kann oder er weiß einfach nicht durch ListView1.Color was für eine Farbe in der Zeile ist.
Mit welchen Befehl lese ich die Farbe der Zeile aus?

Ich dachte erst... so wie es rein geht... geht auch alles wieder raus ^^

unter CustomDraw habe ich die Farbe mit ListView1.Canvas.Brush.color := farbe; reingeschrieben....

Mathias
Beiträge: 6164
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Listview nur farbige Zeilen anzeigen

Beitrag von Mathias »

ich glaube entweder ist das if falsch das er den Wert einer Farbe nicht vergleichen kann oder er weiß einfach nicht durch ListView1.Color was für eine Farbe in der Zeile ist.

Dann überprüfe dies doch einfach mit folgender Zeile:

Code: Alles auswählen

  Caption := ColorToString(ListView1.Color);

:wink:
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: Listview nur farbige Zeilen anzeigen

Beitrag von Aphadias »

colortostring.... hexerei :lol:

hmm... der nimmt wohl so wie es aussieht die Hintergrundfarbe :roll:

also muss er irgend wie gesagt bekommen das er die zeile auslesen soll.... ich probiere mal weiter.. habe da eine idee















sprich in 3 min wieder da und heule rum das mich das programm ärgert :lol:

Mathias
Beiträge: 6164
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Listview nur farbige Zeilen anzeigen

Beitrag von Mathias »

hmm... der nimmt wohl so wie es aussieht die Hintergrundfarbe

Hast du ListView1.Color überhaupt eine Farbe zugeordnet, bei deinem Button5Click ist dies sicher nicht der Fall.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: Listview nur farbige Zeilen anzeigen

Beitrag von Aphadias »

Code: Alles auswählen

procedure TFtukv.ListView1CustomDrawSubItem(Sender: TCustomListView;
  Item: TListItem; SubItem: Integer; State: TCustomDrawState;
  var DefaultDraw: Boolean);
begin
if Item.SubItems.Strings[4] <> '' then
  begin
  if strtodate(Item.SubItems.Strings[4]) <= date then
      farbe := $002424FF;
  end;
 
  ListView1.Canvas.Brush.color := farbe;
end;


damit habe ich der zeile eine Farbe gegeben falls das deine Frage war... und die procedure geht ja automatische zeile für zeile durch.... und ich muss ja jetzt beim button auch zeile für zeile abfragen welche farbe da an liegt.... oder bin ich jetzt gerade völlig falsch?

ich habe ebend ein bisschen rum probiert und sobald ich eine zeile ansprechen wollte konnte man kein color mehr ansprechen...

EDIT: habe mal ebend im Menü mal die Farbe geändert um meine These zu stützen... joar... mit ListView1.Color ließt er die Hintergrundfarbe aus die eingestellt ist im Menü

Mathias
Beiträge: 6164
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Listview nur farbige Zeilen anzeigen

Beitrag von Mathias »

Folgende Zeile
ListView1.Canvas.Brush.color := farbe;

färbt nur die Elemente ein, welche gezeichnet werden. ZB. die Hintergrundfarbe des Textes, oder wen du ein Rechteck in die ListView zeichnest.

Code: Alles auswählen

ListView1.Color

Die ist die Farbe der ganzen ListView.

Folgender Code demonstriert dir dies:

Code: Alles auswählen

procedure TForm1.ListView1AdvancedCustomDrawItem(Sender: TCustomListView;
  Item: TListItem; State: TCustomDrawState; Stage: TCustomDrawStage;
  var DefaultDraw: Boolean);
begin
  Sender.Canvas.Brush.color := Random($FFFFFF);
  Sender.Canvas.Rectangle(5,5,30,30);
  ListView1.Color:=clYellow;
end


So nebenbei, unter Linux wird mit der Texthintergrund nicht eingefärbt. Der Anhang ist eine Windows-Version mit Wine.
Dateianhänge
Bildschirmfoto vom 2017-08-04 21-38-31.png
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: Listview nur farbige Zeilen anzeigen

Beitrag von Aphadias »

also müsste ich meine farbe die ich unter draw setze in eine globale variable eintragen damit ich es mit dem button abfangen kann... willst mir das damit sagen? ^^

also ListView1.Canvas.Brush.color ist mir ja klar das es die hintergrundfarbe vom text einfärbt weil ich das ja oben benutzt habe... wenn ich das auslese sagt er mir ja auch eine farbe an... aber ich muss den ja dazu bringen welche zeile er auslesen muss.. ich muss sozusagen sagen ich bin jetzt in der zeile und dann kann ich ListView1.Canvas.Brush.color sozusagen anwenden...

ich glaube ich denke zu kompliziert :roll:

Mathias
Beiträge: 6164
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Listview nur farbige Zeilen anzeigen

Beitrag von Mathias »

Du kannst mal etwas anderes versuchen, anstelle von ListView, ein gewöhnliche Panel nehmen.
So verstehst du vielleicht eher, wie das mit dem Color funktioniert.

Code: Alles auswählen

procedure TForm1.FormPaint(Sender: TObject);
begin
  with Panel1 do begin
    Color := clGreen;
    Canvas.Brush.Color := clBlue;
    Canvas.Pen.Color := clYellow;
    Canvas.TextOut(10, 10, 'Hello World');
    Canvas.Rectangle(30, 30, 100, 100);
  end;
end
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: Listview nur farbige Zeilen anzeigen

Beitrag von Aphadias »

also ich denke das mein Problem ist das ich mich zu sehr auf den Button konzentriere... weil der hat keine procedure paint draw oder ähnliches und somit auch keine Farbe ansteuert... ist das mein Problem?

weil ich will ja durch mein Button die ListView ja "sortieren" und nur die Zeilen mit der Farbe rot anzeigen........ also muss ich irgend wie in die ListView draw procedure eingreifen?! oder schon wieder falsch? :lol:
wobei wenn ich den Button auf das Panel richte und möchte die Farbe angesagt haben funktioinert es ja weil dort nur eine Zeile geschrieben ist... aber bei Listview muss ich ihn ja sagen welche Zeile er lesen soll..... er sagt mir glaube immer die erste zeile

EDIT: glaube jetzt hat es klick gemacht... ich muss sozusagen erst sagen alles Löschen und dann neu schreiben. Aber nur die Zeilen die ein Rot bekommen würden sollen dann nieder geschrieben werden. Richtig? 8)

Mathias
Beiträge: 6164
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Listview nur farbige Zeilen anzeigen

Beitrag von Mathias »

weil ich will ja durch mein Button die ListView ja "sortieren" und nur die Zeilen mit der Farbe rot anzeigen

Da gibt es sicher eine bessere Lösung, als der Umweg über die Farbe.

Was willst du eigentlich genau machen ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: Listview nur farbige Zeilen anzeigen

Beitrag von Aphadias »

Also ich habe eine ListView im vsReport. In der Liste sind Materialien die Verfallsdaten haben. Die Daten werden alle aus einer SQLite Datei gelesen. Alle Materialien die demnächst Ablaufen (ca. 3 Moante vorher) werden gelb angezeigt und die abgelaufen sind rot. Also die Zeile von der ListView wird dann eingefärbt.

Ich möchte jetzt durch den klick auf ein Button mir nur alle roten Zeilen anzeigen lassen und mit dem anderen alle gelben. Das ist mein Ziel.

Mathias
Beiträge: 6164
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Listview nur farbige Zeilen anzeigen

Beitrag von Mathias »

Ich möchte jetzt durch den klick auf ein Button mir nur alle roten Zeilen anzeigen lassen und mit dem anderen alle gelben. Das ist mein Ziel.

Am besten löscht du deine ListView, wen der Button gedrückt wird und liest die Daten nochmals von der SQLite-Datei ein und filterst die Daten raus welche du willst und schreibst sie dann neu in die ListView.
Evtl. wäre für diese Aufgabe eine StringGrid besser für diese Aufgabe geeignet.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: Listview nur farbige Zeilen anzeigen

Beitrag von Aphadias »

ja vermutlich aber ich habe jetzt soweit mit listview ausgebaut.... das muss jetzt damit gehen 8)

ja das habe ich mir jetzt auch so in meiner denkerpause so gedacht und probiere es mal so

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

Re: Listview nur farbige Zeilen anzeigen

Beitrag von Aphadias »

also ich habe da mal getüfftelt aber verstehe vermutlich gerade nicht richtig den vorgang was passiert....

ich habe einen Button nun jetzt gebaut der die Listview löscht und dann neu schreibt... dabei aber die globale Var. (boolean) auf true setzt...

unter ListView1CustomDrawSubItem habe ich zu den farben jetzt folgendes geschrieben:

Code: Alles auswählen

if frage = true then
  begin
    for i:=Listview1.Items.Count -1 downto 0 do
    begin
      if colortostring(ListView1.Canvas.Brush.Color) <> colortostring($002424FF) then
        Listview1.Items.Delete(i);
 
    end;
 
  end;


ich habe vorher wo das delete steht gesagt das er alles blau färben soll was nicht rot ist... hatte er auch gemacht... jetzt habe ich es umgeschrieben wie es dort steht und wollte somit erreichen alles was nicht rot ist soll er löschen... problem ist nur er haut mich immer aus dem programm weil er alles löscht... davon gehe ich aus das ich entweder einen denkfehler habe oder er zählt anders als ich es will...

Ich denke das wenn er in i als erstes zb 12 Zeilen reinschreibt nach dem löschen er nur noch 11 Zeilen zählt... ist das so richtig? oder bleibt er kontinuierlich bei 12 bis er zu 0 gezählt hat?

Mathias
Beiträge: 6164
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Listview nur farbige Zeilen anzeigen

Beitrag von Mathias »

Es fehlt ein Items[i] ansonsten kann er nicht wissen was gelöscht werden muss.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten