Autor Beitrag
alias5000
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2145

WinXP Prof SP2, Ubuntu 9.04
C/C++(Code::Blocks, VS.NET),A51(Keil),Object Pascal(D2005PE, Turbo Delphi Explorer) C# (VS 2008 Express)
BeitragVerfasst: Fr 08.06.07 14:36 
Hi!
folgendes:
Im Moment habe ich noch ein RichEdit, das formatierten Text enthält. Diese Formatierungen werden von mir geparst, um sie weiterzuverarbeiten. Das läuft im Moment so, dass ich das RichEdit für die Zeit des parsens dem RichEdit seine Zeichenmöglichkeit mittels der Eigenschaft visible (auf false setzen) raube. Dann geht das ganze ne ganze Ecke schneller, wenn man sich dann mit SelStart, SelLength und SelAttributes durchhangelt (Zeichen für Zeichen).
Nur ist das so, dass bei längeren Texten das Umwandeln dann schon einen bemerkbaren Moment dauert und solange die Anwendungsoberfläche blockiert ist.
Das stört mich. Es geht in erster Linie nicht darum, dass das Parsen jetzt extra schnell geht, sondern, es sollte nach Möglichkeit nicht den Zeichenthread blockieren.

Das würde natürlich heißen, dass das ganze in einem anderen Thread passieren sollte. Da aber das TRichEdit, wie alles in der VCL nicht threadsicher ist, kann ich das ja nicht einfach so in einen Thread packen und arbeiten lassen (geht ja auch nicht, wenn ichs von vorne herein mit visible auf false lasse, oder?)

Den resultierenden rtf-Text zu parsen, stelle ich mir relativ kompliziert vor (auch, weil ich dafür bisher nur eine 100-seitige Dokumentation von Microsoft über das Format gefunden habe).
Ich muss dazu sagen, dass beim Parsen nur 6 Formatierungstypen interessant sind: Fett, Kursiv, Unterstrichen, Schriftart, -Farbe und -Größe.

Da ist jetzt natürlich die Frage, ob das mit einem nicht-sichtbaren RichEdit in einem Thread irgendwie doch klappen kann (ich frage hier bewusst ersteinmal, da mir Aufwand , das in einem Thread zu erproben im Moment etwas arg aufwendig erscheint, solange hier jemand eine Antwort weiß).

Oder kennt jemand Quelltexte, Komponenten, Anleitungen, wie ich die Formatierungen des RTFs irgendwie anders auf die Schliche kommen könnte?

Gruß
alias5000

_________________
Programmers never die, they just GOSUB without RETURN
Lannes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: Fr 08.06.07 15:11 
Hallo,

die Dokumentation in deutsch dürfte interessant sein:
www.aboutvb.de/bas/formate/basformate.htm
unter dem Bild ist ein Auswahlfeld, dort findest Du auch den Abschnitt RTF mit 78 Seiten.
Das ist das Original aus dem Buch. Drucken oder kopieren der Seiten geht aber nicht.


Eventuell kannst Du es auch mit einem virtuellen Richedit lösen.

Erzeugen funktioniert so:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
public
  fVirtualRE: TRichEdit;
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
  fVirtualRE := TRichEdit.CreateParented(THandle(-3));
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  fVirtualRE.Free;
end;

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
alias5000 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2145

WinXP Prof SP2, Ubuntu 9.04
C/C++(Code::Blocks, VS.NET),A51(Keil),Object Pascal(D2005PE, Turbo Delphi Explorer) C# (VS 2008 Express)
BeitragVerfasst: Fr 08.06.07 18:51 
Woooow ist das interessant :D (das gemeint ist das virtuelle RichEdit)
Also, ich hab jetzt das ganze gleich in einen extra Thread gepackt und das arbeitet auch noch. Ich habs jetzt aber nur ein-, zweimal angetestet, begehe ich da ein großes Verbrechen, wenn ich das in einem extra Thread laufen lasse, oder ist das so auch vorgesehen?

Da würde mich doch glatt noch der Hintergrund interessieren, was sich hinter einem "virtuellen RichEdit" verbirgt, v.a. wofür das THandle(-3) steht.

Gruß
alias5000

_________________
Programmers never die, they just GOSUB without RETURN
Lannes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: Fr 08.06.07 19:51 
Hallo,

denke nicht das Du damit ein Verbrechen begehst :wink:

Dort gibt es weitere Informationen:
Die letzten Beiträge in [url=www.delphipraxis.net/post727794.html]DP: Farbe als Klartext [/url]
msdn2.microsoft.com/...ibrary/ms632599.aspx > Message-Only Windows

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
alias5000 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2145

WinXP Prof SP2, Ubuntu 9.04
C/C++(Code::Blocks, VS.NET),A51(Keil),Object Pascal(D2005PE, Turbo Delphi Explorer) C# (VS 2008 Express)
BeitragVerfasst: Fr 08.06.07 21:06 
Cool, vielen Dank, ich hätte nicht gedacht, dass das so gut funktioniert :D

Gruß
alias5000

_________________
Programmers never die, they just GOSUB without RETURN
alias5000 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2145

WinXP Prof SP2, Ubuntu 9.04
C/C++(Code::Blocks, VS.NET),A51(Keil),Object Pascal(D2005PE, Turbo Delphi Explorer) C# (VS 2008 Express)
BeitragVerfasst: So 10.06.07 14:09 
Hm, die Sache ist leider doch noch nicht vorbei.
Ich habe ja das virtuelle RichEdit in einem Thread. Leider bekomme ich, mit der Zeit (sprich wenn schon öfters geparst wurde, je nachdem bis zu ~25 Mal) knappe Resourcen.
Dann bekomme ich irgendwann eine EOutOfResources, wenn mir die TBX Komponenten irgendwas neu zeichnen wollen.
Führe ich das Parsen aber im MainThread aus, dann kommt dieses Verhalten nicht. Zusätzlich kann ich dieses Verhalten nur auf Windows Vista reproduzieren, nicht auf windows XP

Wie kann ich da beim Debuggen ansetzen?

Gruß
alias5000

_________________
Programmers never die, they just GOSUB without RETURN
Lannes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: So 10.06.07 22:01 
Hallo,

fürchte das ich dir dabei wenig helfen kann da ich noch keine Bekanntschaft mit Vista gemacht habe.

Aber bei EOutOfResources ist mir das folgende Thema in der DP wieder eingefallen EOutOfResources: 'Fehler bei Einfügen von RichEdit -Zeile'
Kannst es Dir ja mal durchlesen, eventuell hilft es weiter.

Welche RichEd**.dll wird denn in Vista genutzt?

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
alias5000 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2145

WinXP Prof SP2, Ubuntu 9.04
C/C++(Code::Blocks, VS.NET),A51(Keil),Object Pascal(D2005PE, Turbo Delphi Explorer) C# (VS 2008 Express)
BeitragVerfasst: So 10.06.07 22:19 
Also ich weiß gerade nicht, wie ich das feststellen kann, aber mein Windows Vista Verzeichnis sagt mir was von einer RichEd20.dll (In der Beschreibung ist die Version 3.1 des Controls angegeben).
Die RichEd32.dll scheint etwas anderes zu sein.

Der verlinkte Thread an sich hilft wahrscheinlich nicht weiter. Denn die Routine, die ich im RichEdit verwende, funktioniert einwandfrei, solange ich im MainThead arbeite. Erst, wenn ich unter Vista in einen anderen Thread gehe, bekomme ich irgendwann aus irgendeiner Anwendungsecke das EOutOfResources.

Gruß
alais5000

_________________
Programmers never die, they just GOSUB without RETURN
Lannes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: Mo 11.06.07 00:27 
Hallo,

user profile iconalias5000 hat folgendes geschrieben:
Also ich weiß gerade nicht, wie ich das feststellen kann, aber mein Windows Vista Verzeichnis sagt mir was von einer RichEd20.dll (In der Beschreibung ist die Version 3.1 des Controls angegeben).
Die RichEd32.dll scheint etwas anderes zu sein.

Dann scheint es zwischen Vista und XP keine wesentlichen Unterschiede zu geben.
Die riched32.dll verlinkt auf die riched20.dll.

user profile iconalias5000 hat folgendes geschrieben:
Der verlinkte Thread an sich hilft wahrscheinlich nicht weiter.
Was passiert den wenn die riched32.dll und riched20.dll aus XP in das Anwendungsverzeichnis Deines Programms unter Vista kopiert wird(wie in#3 beschrieben)?

user profile iconalias5000 hat folgendes geschrieben:
Denn die Routine, die ich im RichEdit verwende, funktioniert einwandfrei, solange ich im MainThead arbeite. Erst, wenn ich unter Vista in einen anderen Thread gehe, bekomme ich irgendwann aus irgendeiner Anwendungsecke das EOutOfResources.
folglich müsste man vermuten das unter Vista Threads anders behandelt werden :nixweiss: Hab mal danach gegoogelt, aber nichts in der Richtung gefunden.

Startest Du die Anwendung bei beiden BS unter Delphi?

Eventuell hilfreiche Infos: Link

Mehr fällt mir jetzt dazu nicht ein :(

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Mo 11.06.07 08:17 
Wieso willst du den den RTF-Text parsen? Na wie dem auch sei, schau Dir doch mal den SynEdit Code bzw. den MWEdit-Quelltext an (auf dem SyEdit basiert). MWEdit ist ein Pascalsyntaxhilighter, den man an ein RichEdit anhängt. Der parst den RichEdit-Text und hebt die Pascal-Schlüsselwörter hervor.

_________________
Na denn, dann. Bis dann, denn.
alias5000 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2145

WinXP Prof SP2, Ubuntu 9.04
C/C++(Code::Blocks, VS.NET),A51(Keil),Object Pascal(D2005PE, Turbo Delphi Explorer) C# (VS 2008 Express)
BeitragVerfasst: Mo 11.06.07 15:17 
user profile iconLannes hat folgendes geschrieben:
user profile iconalias5000 hat folgendes geschrieben:
Also ich weiß gerade nicht, wie ich das feststellen kann, aber mein Windows Vista Verzeichnis sagt mir was von einer RichEd20.dll (In der Beschreibung ist die Version 3.1 des Controls angegeben).
Die RichEd32.dll scheint etwas anderes zu sein.

Dann scheint es zwischen Vista und XP keine wesentlichen Unterschiede zu geben.
Die riched32.dll verlinkt auf die riched20.dll.

Naja, da ist schon ein Versionsunterschied. Beim RichEd20.dll wird in den Zusatzinformationen unter XP v3.0 angegeben unter Vista v3.1.

user profile iconLannes hat folgendes geschrieben:
Was passiert den wenn die riched32.dll und riched20.dll aus XP in das Anwendungsverzeichnis Deines Programms unter Vista kopiert wird(wie in#3 beschrieben)?

Es ändert sich etwas, aber nicht wirklich viel. Wenn ich die Anwendung unter Delphi laufen lasse, kommt die Exception grundsätzlich früher, als ohne Delphi (jeweils unter Vista). Mit den dlls von XP kommen die Exceptions um einiges später, aber sie kommen.

user profile iconLannes hat folgendes geschrieben:

Startest Du die Anwendung bei beiden BS unter Delphi?

Unter Vista kann ich das ganz sicher sagen, unter XP kann ich das jetzt nicht versprechen. Ohne habe ichs auf jeden Fall schon gemacht. Allerdings hab ich auch schon XP und Vista (2 Rechner) parallel getestet (jeweils ohne Delphi) und da ist der Vista Rechner schon nach einigen Durchläufen abgeschmiert, während ich beim XP Rechner noch froh weitermachen konnte.

user profile iconLannes hat folgendes geschrieben:
Mehr fällt mir jetzt dazu nicht ein :(

Das ganze hat jetzt nicht unbedingt Priorität, weil die funktionierende Lösung im MainThread an sich schon ausreicht. Es dreht sich hier eher um ein I-Tüpfelchen, was es aber nicht geben muss.

@Alzaimar:
Ja, ich will nicht Quelltext highlighten (da wäre IMHO ja auch ein anderer Ansatz über eine TConversion, wenns umbedingt ein Selbstbau sein müsste), sondern grob gesagt betreibe ich ein Konvertieren von dem Text im RichEdit in ein HTML-ähnliches Format. Und dazu parse ich den Spaß.

Vielen Dank
und gruß
alias5000

_________________
Programmers never die, they just GOSUB without RETURN