Einzelnen Beitrag anzeigen

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