![]() |
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:
Prozedur zum markieren der Zeilen:
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;
Delphi-Quellcode:
Hab ich noch was vergessen? Hatte den Code aus der DP.
procedure TfrmMain.lvEDVCustomDrawItem(Sender: TCustomListView;
Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean); begin lvEDV.Canvas.Brush.Color := farbe; end; MfG |
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 :-) |
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 |
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; |
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:
Und beim Zeichen müsste es dann so aussehen:
ListItem := lvEDV.Items.Add;
ListItem.Caption := NewString; ListItem.SubItems.Add(OracleDataSet1.Fields.Fields[2].AsString);
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; |
Re: Färben der ListViewzeile funzt nicht ganz
Hui dank dir easy!! Es klappt. Goil Goil Goooooooooooooooooil! :bounce1:
MfG |
Re: Färben der ListViewzeile funzt nicht ganz
Zitat:
|
Re: Färben der ListViewzeile funzt nicht ganz
Zitat:
|
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