AGB  ·  Datenschutz  ·  Impressum  







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

Überlauf TMemo

Ein Thema von Jens Hartmann · begonnen am 12. Feb 2014 · letzter Beitrag vom 13. Feb 2014
Antwort Antwort
Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#1

AW: Überlauf TMemo

  Alt 12. Feb 2014, 19:09
Zitat von P80286:
Zum einen ist ein TMemo eigentlich nur für die Anzeige gedacht.
Ich nutze das ganze ja auch nur als Anzeige. Daher, sind die Daten nur von geringer Wichtigkeit. Ich möchte lediglich einen gewissen Zeitraum der vergangenen Daten sichtbar erhalten.

Die Lösung von:

Zitat von hathor:
Delphi-Quellcode:
const
   Memo1Limit = 10;

implementation

{$R *.dfm}

procedure TForm2.Memo1Change(Sender: TObject);
begin
   if Memo1.lines.Count > Memo1Limit then
     Memo1.Lines.Delete(0);
end;

nutze ich ja bereits. Allerdings, wird das OnChange ja bei jeder Änderung des Inhaltes ausgelöst. Soll heißen, eine Zeile hat bei mir etwa 80 Zeichen. Davon möchte ich z.B. die letzten 2000 sichtbar erhalten. Daraus folgt...

if TMemo.Lines.Count >= 2000 then TMemo.Lines.Delete[0] und das ins OnChange.

Nachteil: 80 Zeichen/Zeile -> 80 x OnChange ohne Sinn, Weiter gedacht: 80 Zeichen x 2000 Zeilen = 80.000 Zeichen -> 80.000 x OnChange, bis das erste mal die Funktion

TMemo.Lines.Delete[0] ausgeführt wird. Nicht zu vergessen, die fehlenden Sonderzeichen wie Zeilenvorschub, Leerzeichen etc..
Jens Hartmann
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Überlauf TMemo

  Alt 12. Feb 2014, 19:30
Wenn du die Werte direkt in das Memo schreibst und die überflüssigen Zeilen aus dem Memo löschst, dann benutzt du das Memo eben nicht nur zum Anzeigen, sondern auch zum Speichern der Daten.

Korrekterweise eben in eine StringList, diese anpassen und dann mit Memo.Lines.Assign( LogStrings ); an das Memo durchreichen.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.919 Beiträge
 
Delphi 12 Athens
 
#3

AW: Überlauf TMemo

  Alt 12. Feb 2014, 19:45
Ich würde wieder einmal eine TVirtualStringTree benutzen.

Das ist um Größenordnungen schneller als ein TMemo und auch viel einfacher als ständig den Text zu justieren, da du nur in OnGetText die passende Zeile zur Verfügung stellen musst. Außerdem sieht das für den Benutzer auch komisch aus, wenn er im Memo gerade scrollt und du dann etwas änderst.
Du kannst mit einer VirtualTree im Hintergrund auch einen schnellen Ringpuffer benutzen, wenn du nur einen Teil der Daten anzeigen willst.
Sebastian Jänicke
AppCentral

Geändert von jaenicke (12. Feb 2014 um 19:47 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#4

AW: Überlauf TMemo

  Alt 12. Feb 2014, 21:35
@Sir Rufo: Danke erstmal. Hab das ganze aktuell mal als Stringlist aufgebaut.

Delphi-Quellcode:
//Global
MemoBuffer : TStringList;

const
  MemoMaxLimit = 2000;

//im OnCreate der Form
MemoBuffer := TStringlist.Create;

//im OnDestroy
MemoBuffer.Free;

//In den erforderlichen Datenpacketen
UpdateStríngList('Datenpacket');

procedure TfMainVtServer.UpdateStringList(NewLine: string);
begin
  try
    MemoBuffer.Add(NewLine);
    if MemoBuffer.Count = MemoMaxLimit then
      begin
        MemoBuffer.Delete(0);
      end;
    mProtokoll.Lines.Assign(MemoBuffer);
  except
    on E: Exception do
    begin
      redtErrorMessages.Lines.Add(e.Message);
    end;
  end;
end;
funktioniert erst mal soweit ganz gut.

@jaenicke: Das mit vst ist eventuell auch ein Idee. Werde ich bei Gelegenheit mal ausprobieren. Allerdings, ist das Ding schon recht wuchtig für den Sinn den es erfüllen soll.

Trotzdem nochmal Danke...

Gruß Jens
Jens Hartmann
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#5

AW: Überlauf TMemo

  Alt 13. Feb 2014, 06:41
Listview und Listboxlassen sich ebenfalls virtuell betreiben OwnerData bzw. lbVirtual.
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#6

AW: Überlauf TMemo

  Alt 13. Feb 2014, 07:23
Wenn du die Werte direkt in das Memo schreibst und die überflüssigen Zeilen aus dem Memo löschst, dann benutzt du das Memo eben nicht nur zum Anzeigen, sondern auch zum Speichern der Daten.
Ich finde, das ist genau anders herum: Indem ich die Zeilen rausschmeiße, verwende ich das Memo nur als vertikalen Lauftext oder 'TTY', also als Darstellungsparadigma einer Logs. Hmm. Noch noch einmal ein Zwitter, denn außer Darstellung geschieht ja nix. Aber ich weiß, worauf Du hinaus wolltest: '...direkt in das Memo schreibst...'.

Dein Ansatz würde bedeuten, das die Darstellung jeder neuen Zeile immer länger dauert, weil ja jedes Mal *alle* Zeilen erneut dem Memo zugewiesen werden.

Allgemein gesehen würde ich eine TLogFile-Komponente sehr praktisch finden, die alle Logausgaben speichert, aber nur die letzten N (z.B. =2000) zum Darstellen zur Verfügung stellt. Manchmal ist es doch wichtig, im Logfenster zu scrollen, um zu prüfen, was 'eben' (oder neulich) passiert ist.

Diese TLogFile-Komponente würde auch einem etwaigen Darsteller der Logausgaben per Event mitteilen können, das neue Daten zum Darstellen eingetroffen sind. Falls dies zu oft vorkommt (z.B. punktuell mehrere 1000 pro Sekunde), kann man das auch entprellen, d.h. maximal 10 Events pro Sekunde z.B. Wir hatten z.B. so ein Teil im Einsatz, das die Logausgaben mehrerer TCP-Clients verwaltet hat. Manchmal waren 20 TCP-Clients aktiv, mit 10-100 Logausgaben pro Sekunde (hoher Loglevel). Da fror dann die UI ein, weil die Events (wir haben Messages verwendet) den Messagebuffer einfach zugemüllt haben.

Diese Komponente wäre dann ein ViewModel zur Darstellung einer Logausgabe, und man könnte sowohl Jänicke als auch Bummi zufriedenstellen (oder mich mit meinem DevExpress-TcxGrid-Overkill).

Geändert von Furtbichler (13. Feb 2014 um 07:26 Uhr)
  Mit Zitat antworten Zitat
arnof

Registriert seit: 25. Apr 2013
1.261 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#7

AW: Überlauf TMemo

  Alt 13. Feb 2014, 08:40
Größe des TMemo kommt auf die Windows und die Delphi Version an, bei D5 sind es 32 KB oder 64KB.

Wenn man mal schnell eine Anzeige braucht und hier den Bug umgehen will, so nehme einfach ein TRICHEDIT stelle es auf PLAINText, dann sind es sicher 2 GB
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#8

AW: Überlauf TMemo

  Alt 13. Feb 2014, 08:29
Zitat von P80286:
Zum einen ist ein TMemo eigentlich nur für die Anzeige gedacht.
Ich nutze das ganze ja auch nur als Anzeige. Daher, sind die Daten nur von geringer Wichtigkeit. Ich möchte lediglich einen gewissen Zeitraum der vergangenen Daten sichtbar erhalten.

Die Lösung von:

Zitat von hathor:
...
nutze ich ja bereits. Allerdings, wird das OnChange ja bei jeder Änderung des Inhaltes ausgelöst. Soll heißen, eine Zeile hat bei mir etwa 80 Zeichen. Davon möchte ich z.B. die letzten 2000 sichtbar erhalten. Daraus folgt...

if TMemo.Lines.Count >= 2000 then TMemo.Lines.Delete[0] und das ins OnChange.

Nachteil: 80 Zeichen/Zeile -> 80 x OnChange ohne Sinn, Weiter gedacht: 80 Zeichen x 2000 Zeilen = 80.000 Zeichen -> 80.000 x OnChange, bis das erste mal die Funktion

TMemo.Lines.Delete[0] ausgeführt wird. Nicht zu vergessen, die fehlenden Sonderzeichen wie Zeilenvorschub, Leerzeichen etc..
Du interpretierst da etwas hinein, was ich NICHT geschrieben habe!
Es zeigt nur die letzten 10 Datenzeilen an - mehr nicht.
Wozu willst Du 2000 Zeilen in der Anzeige haben von "geringer Wichtigkeit"?
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

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

AW: Überlauf TMemo

  Alt 13. Feb 2014, 10:55
Du interpretierst da etwas hinein, was ich NICHT geschrieben habe!
Es zeigt nur die letzten 10 Datenzeilen an - mehr nicht.
Wozu willst Du 2000 Zeilen in der Anzeige haben von "geringer Wichtigkeit"?
Ungeschickt ausgedrückt?
Ich kenne durchaus Situationen, wo man wochenlang nur die letzten 2..5 Ausgabezeilen eines Programmes braucht, und dann hat's geknirscht und man muß die letzten 1..1000 Zeilen nach der relevanten Meldung durchsuchen.

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


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 09:17 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