AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Listview Zeilen färben, On Custom DrawItem

Ein Thema von Centrii · begonnen am 8. Apr 2008 · letzter Beitrag vom 11. Apr 2008
 
Centrii

Registriert seit: 18. Mai 2007
Ort: FDS
108 Beiträge
 
Delphi 2006 Architect
 
#1

Listview Zeilen färben, On Custom DrawItem

  Alt 8. Apr 2008, 12:41
Hi,

hab da mal wieder ein kleines Problem.
Ich habe in meinem Programm verschiedene Clients, jeder Client hat in der Listview eine eigene Farbe
und jeder Client schreibt werte in eine Zeile/n, bzw. in eine Spalte/n dieser Zeile/n.
Das einfärben der Zeilen funktioniert wunderbar, nur passiert es ab und zu, dass ein Client in ein
SubItem schreibt nur das subItem gefärbt wird, nicht aber das ganze Item. Sieht halt ein wenig unschön aus.
Ich habe die Listview auf

Listview.DoubleBuffered:=true; gesetzt. Leider flimmert die Listview trotzdem ziemlich stark, wenn ich jedesmal wenn OnCustomDrawItem
aufgerufen wird,

Listview.update; aufrufe. Das ist bis jetzt aber die einzige Lösung die ich gefunden habe für das Problem.
Hier meine OnCustomDrawItem Procedure:

Delphi-Quellcode:
procedure TfDLMain.ListViewCustomDrawItem(Sender: TCustomListView;
  Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
var i :Integer;
    liItem :TOPCItem;
    OPCClient :TOPCCLient;
begin
  Lock_Draw.Enter; // Critical Section Enter
  if OnDisconnectAll = false then begin
   if fClient_Auswahl.OPCList_3.Items.Count > 1 then begin // Liste der Clients, nur faerben wenn mehr als 1 Client vorhanden
     if item.Caption <> 'then begin
       try
         liItem:=fDLMain.ClientCheck(item.caption); // zugehoeriger Client zum Item ermitteln
         if assigned(liItem) then begin // wenn noch vorhanden
           OPCClient:=liItem.OpcGroup.OpcClient; // Client zuweisen
           Sender.Canvas.Brush.Color := OPCFarben[fclient_Auswahl.OPCList_3.Items.IndexOfObject(OPCClient)]; // Farbe auswaehlen
           if OPCClient.Tag = 2 then item.SubItems[2] := 'bad';
           Application.ProcessMessages;
         end
         else if item.SubItems[2] <> 'badthen begin
           item.SubItems[2] := 'bad';
           Sender.Canvas.Brush.Color := clSilver;
         end
         else begin
           Sender.Canvas.Brush.Color := clSilver;
         end;
       except
         On E: Exception do begin
           AddToLog('OPC-DataLogger:main,ListViewCustomDrawItem: ',E.Message,1,7,False);
         end;
       end;
     end;
   end;
   Lock_Draw.Leave; // Critical Section Leave
  end;
end;
wenn z.B. jetzt eine Verbindung zu einem Client verloren geht, geht das subItem[2] auf 'bad' und Color := clSilver;
das funktioniert auch alles soweit, aber wie gesagt, leider nicht immer, manchmal wird nur das Subitem gefärbt. In dem Listview können
manchmal schon 150 Einträge drin sein und jeder eintrag schreibt ca. sekündlich einen neuen Wert in die Liste.

Zusätzlich sei erwähnt, dass ich zuvor bei jedem Aufruf der OnCustomDrawItem die ganze Listview durchgerattert bin und alle ListItems, mit der
für sie vorgegebenen Farbe, eingefärbt habe. Das kostet aber unglaublich viel Performance, sobald ein paar einträge in der Liste sind...

Hat jemand eine Idee, wie ich das hinbekommen kann??

Gruß Ruben
Ruben
Theorie ist, wenn man alles weiss, aber nichts funktioniert. Praxis ist, wenn alles funktioniert und keiner weiss warum
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:32 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