AGB  ·  Datenschutz  ·  Impressum  







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

Zeichenlänge eines Memo zu klein

Ein Thema von Hansi · begonnen am 18. Okt 2013 · letzter Beitrag vom 21. Okt 2013
Antwort Antwort
Seite 3 von 3     123   
Perlsau
(Gast)

n/a Beiträge
 
#21

AW: Zeichenlänge eines Memo zu klein

  Alt 18. Okt 2013, 17:51
Bei der MainForm ist da aber noch eine Besonderheit, denn wird diese geschlossen, dann wird der Schliessenbefehl an Application weitergegeben, genauso wie Minimieren da auch an Application durchgeht.
Ergo wird in meinen Anwendungen, in denen ich in der Hauptform (bei mir immer FormMain bzw. UnitMain) in OnCloseQuery CanClose auf True setze, immer zuverlässig das Programm beendet und alle damit zusammenhängenden Freigaben veranlaßt.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#22

AW: Zeichenlänge eines Memo zu klein

  Alt 18. Okt 2013, 18:22
Du brauchst da nichmal caFree.
Sobald das Ding geschlossen wird (Close oder Free), wird die Messageloop verlassen und dann alle anderen Fenster (welche via CreateForm erstellt wurden) geschlossen.

In wie weit dabei alles Andere ordentlich freigegeben wird, hängt davon ab, ob es es irgendwo registriert wurde, was das Freigeben übernimmt, bzw. ob es entsprechende Freigaberoutingen an der richtigen Stelle gibt.


Delphi-Referenz durchsuchenReportMemoryLeaksOnShutdown
$2B or not $2B
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#23

AW: Zeichenlänge eines Memo zu klein

  Alt 18. Okt 2013, 18:47
Von mir selbst bzw. im Code erzeugte Objekte werden bei mir immer zuverlässig freigegeben. Hab das eben mal mit ReportMemoryLeaksOnShutdown := True in einigen meiner Anwendungen getestet: Kein einziges Speicherleck ... caFree verwende ich praktisch nicht, da ich OnClose bislang ebenfalls nicht einsetzte. Freigaben können also weiterhin in OnCloseQuery der Hauptform stattfinden, da diese Methode ohne Ausnahme immer nach dem Close aufgerufen wird:
Du brauchst da nichmal caFree.
Sobald das Ding geschlossen wird (Close oder Free), wird die Messageloop verlassen und dann alle anderen Fenster (welche via CreateForm erstellt wurden) geschlossen.
In wie weit dabei alles Andere ordentlich freigegeben wird, hängt davon ab, ob es es irgendwo registriert wurde, was das Freigeben übernimmt, bzw. ob es entsprechende Freigaberoutingen an der richtigen Stelle gibt.
Delphi-Referenz durchsuchenReportMemoryLeaksOnShutdown
Wie das läuft, wenn ich einen Prozeß via TaskManager abschieße, weiß ich jetzt aber echt nicht. Aber wir kommen wohl schon eine Weile vom Thema ab ...
  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
 
#24

AW: Zeichenlänge eines Memo zu klein

  Alt 19. Okt 2013, 01:08
Der Speicher wird vom Prozess beim System angefordert.
Stirbt der Prozess ist auch der Speicher wieder frei.
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
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#25

AW: Zeichenlänge eines Memo zu klein

  Alt 19. Okt 2013, 04:00
Um nochmals zum eigentlichen Thema zurück zu kommen:

Es wäre in der Tat hier jetzt das wichtigste zu wissen, welche der 3 weiter oben genannten Zeilenumbrüche in der Datei vorliegen. Desweiteren wurde bereits angesprochen, dass ein Memo ggf. nicht die Richtige Wahl ist - das wäre sie bestenfalls dann, wenn der Text wirklich auch dem Benutzer zur Ansicht und Bearbeitung präsentiert werden soll. Ansonsten ist eine TStringList weit günstiger an dieser Stelle. (Die TMemo.Lines Property ist vom Typ TStrings, wie auch TStringList. Sie sind sich sehr ähnlich, jedoch fällt bei TStringList der gesamte Overhead zum Anzeigen raus, was durchaus beachtlich ist.) Zudem meine ich im Hinterkopf zu haben, dass TMemo nur bis zu 64kB Text verträgt (bedingt durch eine Grenze von Windows; TStringList leidet nicht darunter), jedoch kann das u.U. eine veraltete Info sein. Ich weiss nicht, wie sich Delphi >2007 da verhält.

Meine Vermutung ist hier ganz stark, dass ein Linux-Linebreak vorliegt, der versucht wurde mit dem Memo.WordWrap zu "reparieren". Das haut einfach nicht hin, da WordWrap sich auf die Breite der visuellen Komponente bezieht, NICHT auf die missverstandenen Linebreaks in dem Original-Text. Und die Notwendigkeit der Anzeige steht überdies zur Debatte.

Mein Vorschlag, wie es vermutlich klappen könnte:
Delphi-Quellcode:
var
  rawText, line: String;
  s: TStringList;
begin
  url := 'http://www.xxx.com/daten.txt';

  try
    rawText := IdHTTP1.get(url);
  except
    on e: Exception do
      raise Exception.Create('Fehler beim Download von "'+url+'": '+e.Message);
  end;

  s := TStringList.Create;
  try
    try
      s.Text := StringReplace(rawText, #13, #13#10, [rfReplaceAll]);

      For i := 1 to s.Count - 1 do
      begin
        Application.ProcessMessages;
        line := s[i];
        try
          ...
        except
          on e: Exception do
            raise Exception.Create('Fehler beim Verarbeiten von Zeile '+IntToStr(i)+': '+e.Message);
        end;
      end;
      ...
    except
      on e: Exception do
        raise Exception.Create('Fehler beim verarbeiten der Datei: '+e.Message);
  finally
    s.Free;
  end;
end;
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)

Geändert von Medium (19. Okt 2013 um 04:17 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#26

AW: Zeichenlänge eines Memo zu klein

  Alt 19. Okt 2013, 10:50
Zitat:
s.Text := StringReplace(rawText, #13, #13#10, [rfReplaceAll]);
Das StringReplace kann ganz beruhigt weg, da die TStringList mit allen Zeilenumbrüchen klarkommen wird. (#13#10, #10 und #13)

Zitat:
For i := 1 to s.Count - 1 do
0 bis count-1


Delphi-Quellcode:
var
  s: TStringList;
  line: String;
begin
  url := 'http://www.xxx.com/daten.txt';

  s := TStringList.Create;
  try
    try
      s.Text := IdHTTP1.Get(url);
    except
      on e: Exception do
        raise Exception.CreateFmt('Fehler beim Download von "%s": %s', [url, e.Message]);
    end;
    for i := 0 to s.Count - 1 do
      begin
        //Application.ProcessMessages;
        line := s[i];
        try
          ...
        except
          on e: Exception do
            raise Exception.CreateFmt('Fehler beim Verarbeiten von Zeile %d der Datei "%s": %s %s', [i, url, s[i], sLineBreak + e.Message]);
        end;
      end;
  finally
    s.Free;
  end;
end;
$2B or not $2B
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#27

AW: Zeichenlänge eines Memo zu klein

  Alt 20. Okt 2013, 15:34
Das StringReplace kann ganz beruhigt weg, da die TStringList mit allen Zeilenumbrüchen klarkommen wird. (#13#10, #10 und #13)
Seit welcher Version? Ich meine, dass die D7 StringList das noch nicht tat, kann mich aber irren. (Der TE hat seine Version nicht angegeben, daher bin ich mit meiner mutmaßlichen Erinnerung auf Nummer Sicher gegangen.)

Zitat:
0 bis count-1
Wenn man alle Zeilen durchgehen will ja, aber der TE hat irgendwo hier erwähnt, dass er wirklich erst ab Zeile 1 anfangen will
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#28

AW: Zeichenlänge eines Memo zu klein

  Alt 20. Okt 2013, 18:16
Seit welcher Version? Ich meine, dass die D7 StringList das noch nicht tat, kann mich aber irren.
Ich wollte vorhin nachsehn, wie es in D7 aussieht, aber mir ist grade eben der Server abgeraucht und ich komm an die D7-VM nicht ran.
Also nächste Woche dann mal.

Zitat:
0 bis count-1
Wenn man alle Zeilen durchgehen will ja, aber der TE hat irgendwo hier erwähnt, dass er wirklich erst ab Zeile 1 anfangen will
Na dann
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#29

AW: Zeichenlänge eines Memo zu klein

  Alt 21. Okt 2013, 00:05
Ein Blick in den Delphi7-Quellcode (TStrings.SetTextStr) sagt mir, daß .Text mit Allem (#13#10, #10 und #13) zurecht kommt.
$2B or not $2B
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#30

AW: Zeichenlänge eines Memo zu klein

  Alt 21. Okt 2013, 00:15
Dann war's nur meine Verwirrtheit Danke für die Aufklärung!

Edit: Wenn das schon in TStrings enthalten ist, wirft das natürlich die Frage auf, was nun das Problem beim TE wirklich ist... Weil dann sollte auch das Memo dies berücksichtigen, und das Abstellen von WordWrap zum Ziel führen (wenn auch mit dem Overhead der grafischen Ausgabe bzw. Nutzen eines WinControls für Aufgaben, für die es nicht gedacht ist.)
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)

Geändert von Medium (21. Okt 2013 um 00:17 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


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 13:50 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