AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Warum ist das Löschen einer Zeile aus einer Memo so langsam?
Thema durchsuchen
Ansicht
Themen-Optionen

Warum ist das Löschen einer Zeile aus einer Memo so langsam?

Ein Thema von Der schöne Günther · begonnen am 25. Mär 2013 · letzter Beitrag vom 26. Mär 2013
Antwort Antwort
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.224 Beiträge
 
Delphi 10.4 Sydney
 
#1

AW: Warum ist das Löschen einer Zeile aus einer Memo so langsam?

  Alt 25. Mär 2013, 17:48
Weil du den Control mitteilst das anhängende Aktionen nach einem Ändern der Datenbasis erst mit dem EndUpdate erfolgen sollen.
und mit Begin/Endupdate wird statt 400* die aktion nur einmal aufgeführt. WEnn nun jedes Aktualisieren 0,25 ms dauert kommst du auf deine Sekunde.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.201 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Warum ist das Löschen einer Zeile aus einer Memo so langsam?

  Alt 25. Mär 2013, 20:16
Wenn mich meine Erinnerungen nicht trügen, dann hat schon das Delete() selbst so lange gebraucht, obwohl das EndUpdate() noch gar nicht kam. Ich könnte mich aber auch irren.

Kann das jemand reproduzieren? Einfach ein paar hundert Zeilen in ein Memo kloppen und dann die vorderen mittels Delete() entfernen - Das ist doch ein schlechter Witz wie lange das dauert...
  Mit Zitat antworten Zitat
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.101 Beiträge
 
Delphi XE2 Professional
 
#3

AW: Warum ist das Löschen einer Zeile aus einer Memo so langsam?

  Alt 26. Mär 2013, 00:27
Vielleicht so
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
   Memo1.Clear;
   Memo1.Lines.BeginUpdate;
   for i:=1 to 10000 do Memo1.Lines.Add('Test '+IntToStr(i));
   Memo1.Lines.EndUpdate;
end;

procedure TForm1.Button2Click(Sender: TObject);
const cr=#13; lf=#10;
var count:integer; p,p1:PChar;
begin
   if Memo1.Text='then exit;
   p:=PChar(Memo1.text);
   p1:=p;
   count:=0;
   repeat
      case p^ of
         cr : begin
                  inc(p);
                  if p^=lf then inc(p);
                  inc(count);
               end;
         lf : begin
                  inc(p);
                  inc(count);
               end;
         else inc(p);
      end;
   until (p^=#0) or (count=400);
   if p^=#0 then begin
      Memo1.Text:='';
   end else begin
      count:=(NativeInt(p)-NativeInt(p1)) div SizeOf(char)+1;
      Memo1.Text:=Copy(Memo1.Text, count,maxint);
   end;
end;
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

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

AW: Warum ist das Löschen einer Zeile aus einer Memo so langsam?

  Alt 26. Mär 2013, 07:43
Kann das jemand reproduzieren? Einfach ein paar hundert Zeilen in ein Memo kloppen und dann die vorderen mittels Delete() entfernen - Das ist doch ein schlechter Witz wie lange das dauert...
Kopiere den Text einfach in eine TStringList, lösche dort die Zeilen und kopiere den Text wieder zurück...

Ein visuelles Control wie ein TMemo ist nun einmal nicht zur Datenhaltung oder -bearbeitung gedacht, sondern nur zur Anzeige und Eingabe.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

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

AW: Warum ist das Löschen einer Zeile aus einer Memo so langsam?

  Alt 26. Mär 2013, 11:01
Ein visuelles Control wie ein TMemo ist nun einmal nicht zur Datenhaltung oder -bearbeitung gedacht, sondern nur zur Anzeige und Eingabe.
Dem ist nichts hinzuzufügen. Wenn Du aber unbedingt willst, dann arbeite von hinten nach vorne, das ist etwas schneller.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.201 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Warum ist das Löschen einer Zeile aus einer Memo so langsam?

  Alt 26. Mär 2013, 11:09
Aber warum ist es dann so blitzschnell wenn ich im Endeffekt ein
  • Setze Cursor nach ganz oben
  • Markiere die ersten 400 Zeilen
  • Entferne sie

mit der mysteriösen Perform() -Methode (siehe erster Beitrag) ausführe?
  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
 
#7

AW: Warum ist das Löschen einer Zeile aus einer Memo so langsam?

  Alt 26. Mär 2013, 11:40
Aber warum ist es dann so blitzschnell wenn ich im Endeffekt ein
  • Setze Cursor nach ganz oben
  • Markiere die ersten 400 Zeilen
  • Entferne sie

mit der mysteriösen Perform() -Methode (siehe erster Beitrag) ausführe?
Weil dann nur eine Aktualisierung ausgelöst wird und weil ein TMemo keine TStringList hat, sondern der Inhalt irgendwie als TStrings veröffentlicht wird. Je nachdem, wie dieses implementiert ist, geht das eben langsam oder schnell

Ich vermute mal dass bei deinem Delete 400x diese Perform Funktion aufgerufen wird und das BeginUpdate, EndUpdate hier nicht greift
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)

Geändert von Sir Rufo (26. Mär 2013 um 11:42 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.660 Beiträge
 
Delphi 12 Athens
 
#8

AW: Warum ist das Löschen einer Zeile aus einer Memo so langsam?

  Alt 26. Mär 2013, 12:36
Ein Blick in die StdCtrls.pas wirkt manchmal Wunder (TCustomMemo.Lines ist vom Typ TMemoStrings, Zitat vorsichtshalber gekürzt):
Zitat:
Delphi-Quellcode:
procedure TMemoStrings.Delete(Index: Integer);
begin
  ... SendMessage(Memo.Handle, EM_LINEINDEX, Index, 0);
  ...
    ... SendMessage(Memo.Handle, EM_LINEINDEX, Index + 1, 0);
    if ... then
      SendMessage(Memo.Handle, EM_LINELENGTH, SelStart, 0);
    SendMessage(Memo.Handle, EM_SETSEL, SelStart, SelEnd);
    SendTextMessage(Memo.Handle, EM_REPLACESEL, 0, '');
  end;
end;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
terence14
(Gast)

n/a Beiträge
 
#9

AW: Warum ist das Löschen einer Zeile aus einer Memo so langsam?

  Alt 26. Mär 2013, 13:29
Aber warum ist es dann so blitzschnell wenn ich im Endeffekt ein
  • Setze Cursor nach ganz oben
  • Markiere die ersten 400 Zeilen
  • Entferne sie

mit der mysteriösen Perform() -Methode (siehe erster Beitrag) ausführe?
Weil nach jedem Löschen einer Zeile eine Nachricht verschickt wird.
Du kannst das mit Memo1.BeginUpdate vor dem zeilenweisen Löschen und Memo1.EndUpdate wenn alle Zeilen gelöscht wurden, unterdrücken.

MfG,
terence
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.660 Beiträge
 
Delphi 12 Athens
 
#10

AW: Warum ist das Löschen einer Zeile aus einer Memo so langsam?

  Alt 26. Mär 2013, 13:31
Ein bisschen spät, gell?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  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 19:49 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