![]() |
listview realtime daten anzeige
Ich habe erstmal ein Testprogramm geschrieben. Hab nur ein listview und ein timer auf Form1. Listview soll erstmal nur als Datenanzeige dienen. Der Timer habe ich ein Intervall von 10 ms eingestellt und ein zähler laufen lassen, dieser zähler wird nun in subitems angezeigt. listview flacker ziemlich wild. Ich habe mit DoubleBuffering und Items.BeginUpdate - Items.EndUpdate versucht, jedoch hat es nicht viel gebracht. Dann habe ich auch noch gelesen, dass virtual listview ein abhilfe schafft. aber wie lasse ich den Zähler den Inhalt von subitem zuweisen? ich habe auch versucht, der Inhalt lässt sich nicht verändern.
|
AW: listview realtime daten anzeige
Du mußt den Code in Zeile
![]() |
AW: listview realtime daten anzeige
Poste doch mal den Teil deines Source, wo du versuchst das zu tun, was nicht geht. Vielleicht kann dir dann besser geholfen werden. (Sämtliche Glaskugel sind nämlich im Mittelalter durch die Inquisition vernichtet worden).
|
AW: listview realtime daten anzeige
bei der normalen "Füllung" von ListView wird immer ein neues Item angefügt. U. U. wird deshalb auch das Feld neu gezeichnet, was das Flackern bewirkt. Bei virtuellen "Befüllung" wird nicht das ListView mit Daten befüllt, sondern eine separate Liste. Erst in einer Ereignis-Prozedur werden die aktuell sichtbaren Items aufgelistet. Diesen Items muss man nun Daten aus der Liste zuweisen.
|
AW: listview realtime daten anzeige
Das könnte man mit einem ListView.items.beginUpdate und ListView.Items.EndUpdate ja auch erreichen. Möglicherweise nicht ganz so komfortable, aber möglich wäre es.
Allerdings, wenn ich laufend neue Zeilen hinzufüge, und nach jeder hinzugefügten Zeile diese auch anzeigen will, dann komme ich um ein Neuzeichnen auch im VirtualListView nicht drumherum. Was auch dort möglicherweise ein "flackern" verursacht. Zitat:
|
AW: listview realtime daten anzeige
Beispiel:
Delphi-Quellcode:
uses
Contnrs; type TTest = class //Beispielklasse um zwei Werte aufzunehmen Num1: Integer; Num2: Integer; end; var ol: TObjectList; i: Integer = 0; procedure TForm1.FormCreate(Sender: TObject); begin Timer1.Interval := 10; //Edit: hinzugefügt ol := TObjectList.Create; //Die Liste with ListView1 do begin ViewStyle := vsReport; //2 Spalten hinzufügen, sonst sieht man nichts <<<<<<<<<<<<<<< OwnerData := True; //Wichtig: damit wird ListView1 virtuell end; end; procedure TForm1.FormDestroy(Sender: TObject); begin ol.Free; end; procedure TForm1.Timer1Timer(Sender: TObject); var Test: TTest; begin Test := TTest.Create; //Die Liste befüllen Test.Num1 := i; Test.Num2 := i + 1; ol.Add(Test); Inc(i); ListView1.Items.Count := ol.Count; //Wichtig: ListView den aktuellen Count mitteilen Caption := 'Count: ' + IntToStr(ol.Count); //Listview1.Items.Item[Listview1.Items.Count-1].MakeVisible(False); end; procedure TForm1.ListView1Data(Sender: TObject; Item: TListItem); var Test: TTest; begin Test := TTest(ol.Items[Item.Index]); //Ein Objekt aus der Liste "holen" Item.Caption := IntToStr(Test.Num1); //Hier Caption und ein SubItem anzeigen Item.SubItems.Add(IntToStr(Test.Num2)); end; |
AW: listview realtime daten anzeige
Zitat:
|
AW: listview realtime daten anzeige
Sorry, ich muss erst nach Hause kommen um meine Quelltext zu posten. Ich arbeite mit XE8
Delphi-Quellcode:
unit Unit1;
interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ComCtrls, Vcl.ExtCtrls; type TForm1 = class(TForm) ListView1: TListView; Timer1: TTimer; procedure FormCreate(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure ListView1Data(Sender: TObject; Item: TListItem); private { Private declarations } i : Integer; public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin Self.i := 0; ListView1.Items.Count := 5; end; procedure TForm1.ListView1Data(Sender: TObject; Item: TListItem); begin Item.Caption := 'Test' + IntToStr(Item.Index); Item.SubItems.Add('SubItem' + IntToStr(Item.Index)); end; procedure TForm1.Timer1Timer(Sender: TObject); begin Inc( Self.i ); ListView1.Items.Item[ 0 ].SubItems.Strings[ 0 ] := IntToStr( Self.i ); end; end. |
AW: listview realtime daten anzeige
Und was soll dabei virtuell sein?
Guck dir mal mein Beispiel an. Die Daten befinden sich in einer externen Liste. Es muss nicht unbedingt TObjectList sein, es muss nur eine externe Liste sein. In OnData (ListView1Data()) wird dann auf die Daten der Liste zugegriffen und in ListView dargestellt. |
AW: listview realtime daten anzeige
Zitat:
|
AW: listview realtime daten anzeige
Also i würde ich jetzt mal nicht als globale Variable definieren. Kann man zwar machen, aber ich würde i immer als lokale variable als integer, also für z.B. Schleifen verwenden. Besser globale Variablen so zu benennen, dass man Rückschlüsse auf ihre Funktion schließen kann.
Dann du kannst nicht einfach den Count von ListView.Items auf 5 setzen. Du musst die Objecte auch erzeugen.
Delphi-Quellcode:
oder so.
var
i: integer; li: TListItem; begin for i:=0 to 4 do begin li:=ListView1.Items.add; li.caption:=Format('Item %d', [i]); end; end; Auch SubItems mus man erzeugen:
Delphi-Quellcode:
Zugriff auf z.B. 3. SubItem von dem 4. Item:
li.subitems.add('Beispieltext');
Delphi-Quellcode:
liefert den String zurück oder es kann ein String zugewiesen werden.
ListView1.Items[4].SubItem[3]
|
AW: listview realtime daten anzeige
Zitat:
|
AW: listview realtime daten anzeige
Delphi-Quellcode:
var
i : Integer; a: array[0..4] of Integer; procedure TForm1.FormCreate(Sender: TObject); begin Timer1.Interval := 10; i := 0; ListView1.Items.Count := 5; ListView1.DoubleBuffered := True; end; procedure TForm1.ListView1Data(Sender: TObject; Item: TListItem); begin Item.Caption := 'Test ' + IntToStr(Item.Index); Item.SubItems.Add('SubItem ' + IntToStr(a[Item.Index])); //Item.Caption := 'Test' + IntToStr(Item.Index); //Item.SubItems.Add('SubItem' + IntToStr(Item.Index)); end; procedure TForm1.Timer1Timer(Sender: TObject); var k: Integer; begin for k := 0 to 4 do begin Inc(i); a[k] := i; end; ListView1.Refresh; //ListView1.Items.Item[ 0 ].SubItems.Strings[ 0 ] := IntToStr( i ); end; |
AW: listview realtime daten anzeige
Bevor ich den Sourcecode einsteige...
Timer mit 10ms würde 100 Änderungen pro Sekunde bedeuten... Macht das Sinn? der "Monitor" macht 60. Dein Auge so weniger als 25... Abgesehen davon der der Timer überhaupt nicht so oft "feuert". Und ein ListView würde ich dafür auch nicht nehmen... Vielleicht erzählst Du uns mal ein bisschen mehr über den Sinn der Software... |
AW: listview realtime daten anzeige
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:16 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