Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   RRichEdit LoadFromFile (https://www.delphipraxis.net/203220-rrichedit-loadfromfile.html)

Amateurprofi 25. Jan 2020 00:14


RRichEdit LoadFromFile
 
Liste der Anhänge anzeigen (Anzahl: 4)
Ich habe in einem Formular ein RichEdit.
Wenn ich das Programm starte und mit nachstehender Prozedur eine etwa 1 MB große.rtf Datei lade
1) dauert das unverhältnismäßig lange (etwa 20 s).
2) der Text wird unformatiert angezeigt (Bild1).

Wenn ich dann den Text lösche und noch einmal lade
1) geht das blitzschnell
2) der Text wird korrekt angezeigt (Bild2).
Frage:
Was muss ich tun, damit das auch beim ersten Mal korrekt funktioniert.

Delphi-Quellcode:
procedure TMain.LoadText(Sender: TObject);
begin
   if OpenDialog.Execute then
      reText.Lines.LoadFromFile(OpenDialog.FileName);
end;

Luckie 25. Jan 2020 02:02

AW: RRichEdit LoadFromFile
 
Beim zweiten mal hat Windows sie wohl nur aus dem Cache geladen, nehme ich mal an.

Von wo kommt die Datei? Festplatte, Netzwerk, USB(-Stick), ...

Amateurprofi 25. Jan 2020 02:48

AW: RRichEdit LoadFromFile
 
Danke Luckie.
Die Datei ist auf der Festplatte.
Aber mit/ohne Cache erklärt m.E. nicht 20 Sekunden.
Und vor allem erklärt es nicht ohne/mit Formatierung.

hoika 25. Jan 2020 03:06

AW: RRichEdit LoadFromFile
 
Hallo,
kannst Du die Datei + Demo-Projekt (Minimalbsp. ) mal hochladen..

Amateurprofi 25. Jan 2020 03:32

AW: RRichEdit LoadFromFile
 
Zitat:

Zitat von hoika (Beitrag 1455973)
Hallo,
kannst Du die Datei + Demo-Projekt (Minimalbsp. ) mal hochladen..

Ist jetzt in #1.

Das Ganze bezieht sich auf eine Prozedur, die Texte in einem RichEdit finden und markieren kann.
Die hatte ich vor einigen Jahren in die DP gestellt.
https://www.delphipraxis.net/187707-...markieren.html
Die Prozedur habe ich in einigen Punkten erweitert/optimiert und ein kleines Programm zum Testen geschrieben.

Luckie 25. Jan 2020 03:44

AW: RRichEdit LoadFromFile
 
Passiert zwischen Laden und Anzeigen noch was in deinem Programm?

Amateurprofi 25. Jan 2020 04:35

AW: RRichEdit LoadFromFile
 
Zitat:

Zitat von Luckie (Beitrag 1455975)
Passiert zwischen Laden und Anzeigen noch was in deinem Programm?

Nein.
Ich habe zwischenzeitlich meinen Rechner heruntergefahren und neu gestartet (läuft normalerweise im 24/7 Modus).
Hat nichts gebracht.
Nach Neustart des Programms dauert das Laden der .rtf Datei sehr lange und im RichEdit steht unformatierter Text.
Beim erneuten Laden geht es schnell und der Text erscheint formatiert.

Übrigens:
Wenn ich nach Neustart des Programms eine ähnlich große .txt Datei lade, geht das rucki zucki.
Bei anschließendem Laden der .rtf Datei geht das auch sehr schnell.
Für mich absolut unverständlich.

hoika 25. Jan 2020 04:55

AW: RRichEdit LoadFromFile
 
Hallo,
kannst Du die Datei
Wo ist die Datei?

Wenn ich dein Programm mit einer anderen einfachen RTF-Datei starte,
funktioniert es gar nicht.

Hier meine RTF-Datei

{\rtf1\ansi\ansicpg1252\deff0\nouicompat\deflang10 31{\fonttbl{\f0\fnil\fcharset0 Calibri;}}
{\*\generator Riched20 10.0.19546}\viewkind4\uc1
\pard\sa200\sl276\slmult1\f0\fs22\lang7 1\par
2\par
3\par
4\par
5\par
}

In Textdatei (Notepad) kopieren und umbenennen als RTF.


Minimalbsp.
Du hast das ganze Projekt reingestellt, das ist kein Minimalbsp. ...
Bitte alles weg, was nichts mit dem Laden der RTF-Datei zu tun hat.

PS:
Ich habe mich früher mal ein bisschen mit tex/latex beschäftigt.
Da war immer von "Minimalbsp." die Rede.
Wo man oft beim Erstellen des Minimalbsp plötzlich gemerkt hatte "Oops, jetzt geht's plötzlich"
und dann durch schrittweises Reinnehmen der eigenen Sachen selber rausgefunden hatte,
was konkret das Problem ist.

Amateurprofi 25. Jan 2020 06:30

AW: RRichEdit LoadFromFile
 
@Heiko
Erst mal Danke dafür, dass du dich überhaupt damit beschäftigst.

Ich habe den Text aus deinem Beitrag #8 kopiert, in NotePad gestellt, als .txt gespeichert, dann die .txt Datei kopiert und die Kopie in .rtf umbenannt.

Mein Programm lädt problemlos sowohl die .rtf Datei wie auch die .txt Datei.

Ein Minimalbeispiel habe in #1 hochgeladen (Project1.zip), einschließlich der Datei Astro.rtf, bei der die Probleme auftauchen.
Auf der Form ist ein RichEdit, ein OpenDialog und ein Button, mit dem eine Datei geladen werden kann.
Auch in diesem Programm treten dieselben Probleme auf, d.h. wenn ich nach Neustart des Programms die Datei Astro.rtf lade, dauert das 20s und der Text wird unformatiert gezeigt.
Lade ich die Datei erneut funktioniert alles normal, also blitzschnell und der Text wird formatiert angezeigt.

Die Datei Astro.rtf wurde mit Microsoft Word erstellt, um mit Microsoft Help Workshop eine .hlp Datei zu erstellen.
Auch wenn ein RichEdit nicht alles, was in der Datei enthalten ist, umsetzen kann, ist das keine (für mich) plausible Erklärung für die Probleme, denn beim zweiten Laden funktioniert alles normal, nur eben nicht beim ersten Laden nach Start des Programms.

Du schriebst
Zitat:

Wenn ich dein Programm mit einer anderen einfachen RTF-Datei starte,
funktioniert es gar nicht.

Wie soll ich "mit einer RTF Datei starten" verstehen?
Ich starte das Programm aus der IDE mit F9 und lade die .rtf Datei mit Menu>Text laden.
Auch wenn ich das Programm im Windows Explorer mit DoppelKlick auf die .exe starte tritt das Problem auf.

hoika 25. Jan 2020 16:00

AW: RRichEdit LoadFromFile
 
Hallo,
ich bekomme das Programm nicht zum laufen. Starten geht, ja.
Das es beim ersten mal "Datei öffnen" dauert, kann ich bestätigen.
Es wird aber trotzdem nichts angezeigt.

Die Info, dass Du die Datei aus Word heraus heraus erzeugt hast, war aber wichtig.

Öffne die RTF-Datei mal in Wordpad und speichere Sie wieder ab.
Dada -> Dateigröße auf 1/10-tel geschrumpft und die Wartezeit beim ersten Laden ist weg.

Und trotzdem, bei mir wird der Inhalt der Datei nicht angezeigt.

Amateurprofi 25. Jan 2020 20:49

AW: RRichEdit LoadFromFile
 
Zitat:

Das es beim ersten mal "Datei öffnen" dauert, kann ich bestätigen.
Zumindest mal gut zu wissen, dass das nicht nur bei mir so lange dauert.

Zitat:

Es wird aber trotzdem nichts angezeigt.
Auch dann nicht, wenn du die Datei noch mal öffnest?

Zitat:

Öffne die RTF-Datei mal in Wordpad und speichere Sie wieder ab.
Dada -> Dateigröße auf 1/10-tel geschrumpft und die Wartezeit beim ersten Laden ist weg.
Hab ich gemacht.
Dateigröße von 1043kb auf 179kb verkleinert.
Aber:
Bei der Erstellung der .hlp Datei sagt Help Workshop
Zitat:

The RTF file E:\Daten\Delphi XE2\Astro\Help\Astro.rtf is corrupted at offset 182476.
Also die Datei mit Word geöffnet und wieder gespeichert.
Dateigröße dann 612kb.
Dann mit Help Workshop wieder die .hlp Datei erstellt. Funktioniert.
Aber:
Die .hlp Datei funktioniert nicht mehr, weil WordPad alle Endnoten entfernt hat.
Auf den Endnoten basieren die Jumps und das Anzeigen der diversen Kapitel und auch die Erstellung der Suchfunktionen.
Wenn ich die Datei mit WinHelp öffne wird nur das erste Kapitel angezeigt.
Zum Glück hatte ich vom Original eine Kopie gespeichert.

p80286 26. Jan 2020 12:09

AW: RRichEdit LoadFromFile
 
Ich hab einmal etwas herumgetestet.
a) Mit Libreoffice dauert es auch ein paar Sekunden. Datai aus Libreoffice gespeichert ist jetzt etwas kleiner und das laden geht etwas schneller, allerdings scheint Formatierung verloren gegangen zu sein.
b) Ein altes Programm zur Analyse von RTF-Files ausgepackt und beide Dateien geladen. Gleiches Verhalten wie von Dir beschrieben. Dann die Aufbereitete TempRTF datei geladen: Nochmals schneller (Aufbereitung: Zeilenumbrüche statt 255-Zeilen).

c) Was die Falschdarstellung angeht, das ist eine Macke von TRichedit. Wenn ich mich richtig erinnere gibt es dafür auch einen Workaround (hier in der DP) aber mir war das damals zu aufwendig das nochmals richtig zu stellen, sooo oft hab ich das Programm nicht gebraucht und verglichen mit Word ist TRichEdit arg kastriert.

Gruß
K-H

P.S.
hab gerade folgendes gefunden:
https://www.delphipraxis.net/163218-...-sichtbar.html

Luckie 26. Jan 2020 12:21

AW: RRichEdit LoadFromFile
 
Eventuell einfach ein RePaint oder Update nach dem Laden aufrufen?

p80286 26. Jan 2020 23:30

AW: RRichEdit LoadFromFile
 
Nö hilft nicht!
Ich hab mir den Fernsehabend mit ein bischen Testen versüßt. Bei einem
Delphi-Quellcode:
.LoadfromFile
wird ein Dummyload für die Initialisierung benötigt. das kann auch eine sehr kleine Datei sein z.B.
Code:
{\rtf1\ansi\ansicpg1252\deff0\nouicompat\deflang1031{\fonttbl{\f0\fnil\fcharset0 Calibri;}}
{\*\generator Riched20 6.3.9600}\viewkind4\uc1 
\pard\sa200\sl276\slmult1\f0\fs22\lang7 hallo rtf1\par
}
Ich hab es auch mit einem (zwei)
Delphi-Quellcode:
.LoadFromStream
versucht, wobei der Initialload von einem Memorystream und der eigentliche Datenload von einem Filestream vorgenommen wurde. Das war nicht von Erfolg gekrönt. Würde mich nicht wundern wenn ich da nicht alle Möglichkeiten ausgeschöpft habe, vllt. habt Ihr da noch eine gute Idee.

Gruß
K-H

p80286 27. Jan 2020 18:17

AW: RRichEdit LoadFromFile
 
Delphi-Quellcode:
SendMessage(self.RichEdit1.Handle, EM_EXLIMITTEXT, 0,$7FFFFFF0);
Dasisses! ggf muß noch die Richedit-Unit eingebunden werden.

Gruß
K-H

himitsu 28. Jan 2020 01:33

AW: RRichEdit LoadFromFile
 
Die Remarks in MSDN-Library durchsuchenEM_EXLIMITTEXT erklären dann auch, warum gewisse Streamingfunktionen anders reagieren, als wie das Zuweisen an .Text.

p80286 28. Jan 2020 08:57

AW: RRichEdit LoadFromFile
 
Aber warum für das erste Laden einer Datei/Stream erst einmal eine BillGatesGedächtnisMinute eingelegt wird, erklärt es nicht. Aber egal, damit läuft es wie gewünscht.

Gruß
K-H

himitsu 28. Jan 2020 19:09

AW: RRichEdit LoadFromFile
 
Für "viel" Text und mit "ungewöhnlichen" Formatierungen sind diese Text-Controls des OS noch nie gut gewesen.

Amateurprofi 29. Jan 2020 01:57

AW: RRichEdit LoadFromFile
 
Zitat:

Zitat von p80286 (Beitrag 1456105)
Delphi-Quellcode:
SendMessage(self.RichEdit1.Handle, EM_EXLIMITTEXT, 0,$7FFFFFF0);
Dasisses! ggf muß noch die Richedit-Unit eingebunden werden.

Gruß
K-H

Hab ich gemacht, Problem scheint gelöst.
Vielen Dank für die Hilfe.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:33 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