AGB  ·  Datenschutz  ·  Impressum  







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

Timer für ListBox

Ein Thema von lucy · begonnen am 25. Okt 2017 · letzter Beitrag vom 26. Okt 2017
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.798 Beiträge
 
Delphi 12 Athens
 
#11

AW: Timer für ListBox

  Alt 25. Okt 2017, 14:03
goto Hole_Nachricht
WARUM??!

@Lucy: Vergiss goto, google es nicht und verankere in Deinem Hirn, daß goto ganz bestimmt nicht in Delphi existiert.

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.586 Beiträge
 
Delphi 11 Alexandria
 
#12

AW: Timer für ListBox

  Alt 25. Okt 2017, 14:34
Wir machen das sehr einfach:
Wir nehmen eine TVirtualStringTree, die in OnGetText auf die Daten in einer Liste zugreift. Ein Timer (bzw. bei uns ein Thread, aber das ist ja egal) stößt dann das Aufräumen der Liste an, setzt ggf. die Anzahl der Elemente in der Liste neu bzw. ruft Invalidate auf. Daraufhin werden die dann aktuellen Elemente in der Liste gezeichnet.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#13

AW: Timer für ListBox

  Alt 25. Okt 2017, 14:50
goto Hole_Nachricht
WARUM??!
Damit Du in einer Schleife bist!?

Ach Du störst Dich an dem GOTO ?
Na dann nimmt man halt While not..... begin ... end oder repeat ....until ...

ich wäre nie auf den Gedanken gekommen, daß man das als Delphi-Code mißverstehen könnte.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#14

AW: Timer für ListBox

  Alt 25. Okt 2017, 14:58
Wir machen das sehr einfach:
Wir nehmen eine TVirtualStringTree, die in OnGetText auf die Daten in einer Liste zugreift. Ein Timer (bzw. bei uns ein Thread, aber das ist ja egal) stößt dann das Aufräumen der Liste an, setzt ggf. die Anzahl der Elemente in der Liste neu bzw. ruft Invalidate auf. Daraufhin werden die dann aktuellen Elemente in der Liste gezeichnet.
Ich glaube ein VirtualStringTree wäre in der Angelegenheit etwas overkill. Ich gehe mal davon aus, dass der TE gerade erst mit dem Programmieren angefangen hat und der VST dann "etwas" zu kompliziert wäre.

Aber trotzdem sollte er die Daten in einer Klasse ablegen. Die Instanz der Klasse sollte, wie auch schon des öfteren erwähnt, in einer ObjectList abgespeichert werden. Danach ist es ein Leichtes, die Liste (von oben nach unten) zu durchlaufen und dann die Einträge, die älter sind als 5 Minuten, aus der Liste zu entfernen. Schlussendlich müssten dann nur noch die Elemente in der ListBox neu erstellt/gezeichnet werden.

@TE: Was hast du denn bereits von den Vorschlägen umgesetzt? Oder wo hängst du gerade
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.586 Beiträge
 
Delphi 11 Alexandria
 
#15

AW: Timer für ListBox

  Alt 25. Okt 2017, 16:53
Ich glaube ein VirtualStringTree wäre in der Angelegenheit etwas overkill. Ich gehe mal davon aus, dass der TE gerade erst mit dem Programmieren angefangen hat und der VST dann "etwas" zu kompliziert wäre.
Ich finde das nicht. Ich habe ja nun schon einigen geholfen beim Lernen und so kompliziert ist der VST nicht, wenn man den für einfache Zwecke benutzt. Klar, man kann damit auch deutlich kompliziertere Sachen machen. Aber nur die Anzahl der Einträge setzen und OnGetText implementieren... das ist nicht komplizierter als in einer anderen Liste die Einträge zu löschen und neu hinzuzufügen.

Komplettes Beispiel (Projekt liegt im Anhang):
Delphi-Quellcode:
unit VstDemo;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls,
  VirtualTrees, System.Generics.Collections, System.DateUtils;

type
  TMyData = class
  private
    FCreationTime: TDateTime;
  public
    constructor Create(const ATime: TDateTime);
    property CreationTime: TDateTime read FCreationTime write FCreationTime;
  end;

  TfrmVstDemo = class(TForm)
    vstEntries: TVirtualStringTree;
    btnAdd: TButton;
    tmrDelete: TTimer;
    procedure btnAddClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure vstEntriesGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
      var CellText: string);
    procedure tmrDeleteTimer(Sender: TObject);
  private
    FEntries: TList<TMyData>;
    procedure UpdateTree;
  public
  end;

var
  frmVstDemo: TfrmVstDemo;

implementation

{$R *.dfm}

{ TfrmVstDemo }

procedure TfrmVstDemo.btnAddClick(Sender: TObject);
begin
  // Eintrag hinzufügen
  FEntries.Add(TMyData.Create(Now));
  UpdateTree;
end;

procedure TfrmVstDemo.FormCreate(Sender: TObject);
begin
  // Liste erzeugen
  FEntries := TObjectList<TMyData>.Create;
end;

procedure TfrmVstDemo.FormDestroy(Sender: TObject);
begin
  // Liste freigeben
  FEntries.Free;
end;

procedure TfrmVstDemo.tmrDeleteTimer(Sender: TObject);
var
  i: Integer;
begin
  // Alle Einträge durchgehen und nach 5 Sekunden herauswerfen
  for i := FEntries.Count - 1 downto 0 do
    if SecondsBetween(FEntries[i].CreationTime, Now) >= 5 then
      FEntries.Delete(i);
  // Baumanzeige aktualisieren
  UpdateTree;
end;

procedure TfrmVstDemo.UpdateTree;
begin
  // Anzahl der Einträge setzen und Anzeige aktualisieren
  vstEntries.ChildCount[vstEntries.RootNode] := FEntries.Count;
  vstEntries.Invalidate;
end;

procedure TfrmVstDemo.vstEntriesGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
  var CellText: string);
begin
  // Text, der für den Eintrag angezeigt werden soll, liefern indem man diesen in CellText schreibt
  CellText := 'Eintrag von ' + DateTimeToStr(FEntries[Node.Index].CreationTime);
end;

{ TMyData }

constructor TMyData.Create(const ATime: TDateTime);
begin
  FCreationTime := ATime;
end;

end.
Angehängte Dateien
Dateityp: 7z VST Liste.7z (50,8 KB, 1x aufgerufen)
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#16

AW: Timer für ListBox

  Alt 25. Okt 2017, 16:59
Ich glaube ein VirtualStringTree wäre in der Angelegenheit etwas overkill. Ich gehe mal davon aus, dass der TE gerade erst mit dem Programmieren angefangen hat und der VST dann "etwas" zu kompliziert wäre.
Ich finde das nicht. Ich habe ja nun schon einigen geholfen beim Lernen und so kompliziert ist der VST nicht, wenn man den für einfache Zwecke benutzt. Klar, man kann damit auch deutlich kompliziertere Sachen machen. Aber nur die Anzahl der Einträge setzen und OnGetText implementieren... das ist nicht komplizierter als in einer anderen Liste die Einträge zu löschen und neu hinzuzufügen.
Das ist wohl richtig. Man kann den auch sehr abgespeckt benutzen und ist dann in einem späteren Stadium flexibel. Ich selbst arbeite ja fast ausschließlich mit dem VST wenn es um irgendeine Listendarstellung geht.

Nur würde ich sagen, dass der TE noch ein grundsätzliches (Verständnis)Problem hat. Aber das kann auch nur er selbst erläutern. Eventuell wird es ja durch dein Beispiel etwas deutlicher was wir die ganze Zeit versuchen zu erklären.
  Mit Zitat antworten Zitat
lucy

Registriert seit: 25. Okt 2017
67 Beiträge
 
Delphi XE7 Starter
 
#17

AW: Timer für ListBox

  Alt 26. Okt 2017, 00:53
Hallo,

vielen Dank für die ganzen Beiträge. Muss erstmal alles sortieren und ausprobieren.
Danke

Habe mich für ein StringGrid entschieden, und teste noch ein wenig rum.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 00:12 Uhr.
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