![]() |
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:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:11 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 by Thomas Breitkreuz