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 Färben der ListViewzeile funzt nicht ganz (https://www.delphipraxis.net/28465-faerben-der-listviewzeile-funzt-nicht-ganz.html)

Akut-Programming 25. Aug 2004 08:54


Färben der ListViewzeile funzt nicht ganz
 
Ich bin gerade dabei eine Anwendung zur Anwesenheitskontrolle der Mitarbeiter für die Firma in der ich arbeite zu schreiben. Dabei läuft auf dem PC des Mitarbeiters, der in eine OracleDB schreibt. Über die Serveranwendung kann man dann den jeweiligen Status des Mitarbeiters sehen. Ich wollte nun, um es übersichtlicher darzustellen, die Zeilen, in denen steht, das der User angemeldet ist oder nicht, farbig markieren. Doch komischerweiße markiert er alle in der selben Farbe, egal ob angemeldet oder nicht.

Prozedur zum aktualisieren der Liste:
Delphi-Quellcode:
procedure TfrmMain.prcRefreshLists;
var
   NewString: String;
   i: integer;
   ListItem: TListItem;
begin
     //EDV aktualisieren
     lvEDV.Items.Clear;
     OracleDataSet1.Active:=false;
     OracleDataSet1.SQL.Add('select nachname, vorname, angemeldet, loginzeit, urlaub_bis, krank_bis from elka_onlinev2 where abteilung = ''EDV''');
     OracleDataSet1.Active:=true;

     OracleDataSet1.First;
     for i := 1 to OracleDataSet1.RecordCount
     do begin
        NewString := OracleDataSet1.Fields.Fields[0].AsString +' '+ OracleDataSet1.Fields.Fields[1].AsString +' '+ OracleDataSet1.Fields.Fields[2].AsString +' '+ OracleDataSet1.Fields.Fields[3].AsString +' '+ OracleDataSet1.Fields.Fields[4].AsString + OracleDataSet1.Fields.Fields[5].AsString;
        if OracleDataSet1.Fields.Fields[2].AsString = 'JA' then farbe := clLime else
        if OracleDataSet1.Fields.Fields[2].AsString = 'NEIN' then farbe := clRed;
        Edit1.Text:=OracleDataSet1.Fields.Fields[2].AsString;
        if OracleDataSet1.RecordCount >= 0
        then begin
             ListItem := lvEDV.Items.Add;
             ListItem.Caption := NewString;
        end;
        OracleDataSet1.Next;
     end;
end;
Prozedur zum markieren der Zeilen:
Delphi-Quellcode:
procedure TfrmMain.lvEDVCustomDrawItem(Sender: TCustomListView;
  Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
     lvEDV.Canvas.Brush.Color := farbe;
end;
Hab ich noch was vergessen? Hatte den Code aus der DP.

MfG

easywk 25. Aug 2004 09:29

Re: Färben der ListViewzeile funzt nicht ganz
 
So geht es nicht, da die Zeichenaktionen nicht genau bei Add des ListItem ausgeführt werden. So wie deine Schleife läuft, werden wahrscheinlich erstmal alle ListItems eingefügt und dann wird die Tabelle auf dem Bildschirm gezeichnet. Damit hast du immer die Farbe, die zuletzt gesetzt war. Am einfachsten ist es, wenn du dir für dein Listitem ein Object mit anlegst und dann beim Zeichnen selber auf das Object schaust, um zu entscheiden, welche Farbe du verwendest.
Hoffe ich konnte rüberbringen, was ich meine :-)

Akut-Programming 25. Aug 2004 09:54

Re: Färben der ListViewzeile funzt nicht ganz
 
Zum Teil hab ichs schon verstanden :roll: - Aber vielleicht hättest du ja mal ein Stück Code für mich... - Die Arbeit mit ListViews in der Art ist für mich neu. :?

MfG

Sharky 25. Aug 2004 10:06

Re: Färben der ListViewzeile funzt nicht ganz
 
Hai Akut-Programming,

ich habe zwar kein Oracel aber es sollte auch so klar sein was ich mache ;-)
Um pro Item "zu speichern" ob der Mitarbeiter da ist misbrauche ich einfach die Eigenschaft Item.Checked.
Diese werte ich dann im OnItemDras aus:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  ListItem: TListItem;
begin
  ListView1.Clear; // Listview löschen
  with Query1 do
  begin
    Close;
    SQL.Text := 'SELECT * FROM kontakte ORDER BY name';
    Open;
    First;
    While not (Eof) do
    begin
      ListItem := ListView1.Items.Add;
      ListItem.Caption := FieldByName ('name').AsString;
      ListItem.Checked := FieldByName ('anwesend').AsString = 'JA';
      Next;
    end;
  end;
end;

procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
  Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
  if (Item.Checked) then
  begin
    (Sender As TListView).Canvas.Font.Color := clgreen;
  end
  else
  begin
    (Sender As TListView).Canvas.Font.Color := clred;
  end;
end;

easywk 25. Aug 2004 10:06

Re: Färben der ListViewzeile funzt nicht ganz
 
Ich versuche es mal, allerdings nur rein aus dem Kopf, also untestet:

Beim Anlegen der einzelnen Objekte würde ich das Ja/Nein einfach in ein SubItem schreiben:
Delphi-Quellcode:
ListItem := lvEDV.Items.Add;
ListItem.Caption := NewString;
ListItem.SubItems.Add(OracleDataSet1.Fields.Fields[2].AsString);
Und beim Zeichen müsste es dann so aussehen:
Delphi-Quellcode:
procedure TfrmMain.lvEDVCustomDrawItem(Sender: TCustomListView;
  Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
  if (Item.SubItems[0]='JA') Sender.Canvas.Brush.Color:=clLime
  else Sender.Canvas.Brush.Color:=clRed;
end;

Akut-Programming 25. Aug 2004 10:09

Re: Färben der ListViewzeile funzt nicht ganz
 
Hui dank dir easy!! Es klappt. Goil Goil Goooooooooooooooooil! :bounce1:

MfG

Sharky 25. Aug 2004 10:19

Re: Färben der ListViewzeile funzt nicht ganz
 
Zitat:

Zitat von Akut-Programming
..Es klappt. ...

Welche der beiden Varianten hast Du denn jetzt verwendet?

Akut-Programming 25. Aug 2004 10:39

Re: Färben der ListViewzeile funzt nicht ganz
 
Zitat:

Zitat von Akut-Programming
Hui dank dir easy..

Die von easywk, klappt einwandfrei... :wink:


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:09 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