Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi listview realtime daten anzeige (https://www.delphipraxis.net/185677-listview-realtime-daten-anzeige.html)

JnZn558 29. Jun 2015 11:28

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.

Perlsau 29. Jun 2015 11:32

AW: listview realtime daten anzeige
 
Du mußt den Code in Zeile 42 entsprechend ändern :stupid:

Captnemo 29. Jun 2015 11:39

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).

Popov 29. Jun 2015 11:47

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.

Captnemo 29. Jun 2015 12:08

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:

Zitat von JnZn558 (Beitrag 1307036)
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.

Aber sein Problem war ja auch, dass er den Inhalt von SubItems nicht zuweisen kann. Deshalb wäre ein bisschen Code nicht schädlich.

Popov 29. Jun 2015 12:42

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;

Captnemo 29. Jun 2015 13:09

AW: listview realtime daten anzeige
 
Zitat:

Zitat von Captnemo (Beitrag 1307045)
Aber sein Problem war ja auch, dass er den Inhalt von SubItems nicht zuweisen kann. Deshalb wäre ein bisschen Code nicht schädlich.

@Popov: :wink: damit meinte ich ja den TE, und nicht unbedingt dich :-D:-D

JnZn558 29. Jun 2015 15:22

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.

Popov 29. Jun 2015 15:43

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.

JnZn558 29. Jun 2015 15:48

AW: listview realtime daten anzeige
 
Zitat:

Zitat von Popov (Beitrag 1307055)
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;

danke für Antworten. ich werde das gleich ausprobieren. was ich gepostet habe, war quelltext von heute morgen. wo ich das Problem hab.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:52 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz