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] <> '
bad'
then 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