Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   RichEdit , RTF und Großbuchstaben (https://www.delphipraxis.net/188347-richedit-rtf-und-grossbuchstaben.html)

jaikai 23. Feb 2016 11:29

Delphi-Version: 5

RichEdit , RTF und Großbuchstaben
 
Moin,

ich hab mal wieder ein unlösbares Problem:

in einem TRichEdit wird ein RTF-Text geladen, mit allen Formierungen - normale Groß-Klein Schreibweisen. Dies soll ich zu Wörtern zerhacken (ellenlange Wortlisten), die jeweils auf Art der Formatierung (Fett, kursiv etc.) interpretiert werden sollen...

Jetzt taucht tausendmal ein klein-geschriebenes Wort (Beispiel - RTF Text "APFEL") auf, welches über die RTF-Formatierung

Delphi-Quellcode:
\b\caps apfel\b0\caps0


kleingeschrieben (apfel) und im RTF als "APFEL" im RTF zu lesen ist.

Meine Analyse über

Delphi-Quellcode:
function IsGrossBuchstabe(ch: char): boolean;
begin
   Result := ch in ['A'..'Z'];    
end;

oder auch:

Result := c = AnsiUpperCase(c);
scheitern, weils zu char ausgelesen (string[1]) immer Kleinbuchstaben bleiben.

Wie bekomme ich das sichtbare RTF-"APFEL" zum String-"APFEL" konvertiert?


Danke

p80286 23. Feb 2016 14:56

AW: RichEdit , RTF und Großbuchstaben
 
Zitat:

Zitat von jaikai (Beitrag 1331078)
Dies soll ich zu Wörtern zerhacken (ellenlange Wortlisten), die jeweils auf Art der Formatierung (Fett, kursiv etc.) interpretiert werden sollen...

Dafür bietet sich rein Record an
Delphi-Quellcode:
tmyrec=record
         text:string;
         Dicke: fett/normal/mager;
         ....usw
end;
Nun kommen wir zu Deinem "Apfel".
der kann ja
Code:
\caps apfel \caps0
oder
Code:
\caps Apfel \caps0
oder
Code:
\caps aPFel \caps0
oder
Code:
\caps ApFel \caps0
...
codiert sein und immer wird er als APFEL dargestellt.

Wie lautet in diesem Zusammenhang Deine Aufgabenstellung genau?
Dementsprechend könnte man die vorhandenen Daten konvertieren.

Gruß
K-H

jaikai 23. Feb 2016 15:49

RichEdit , RTF und Großbuchstaben 2
 
Moin,

den Sring Apfel aus dem RTF herauszubekommen ist nicht das Problem.

Das Problem liegt an der Formatierung innerhalb des RTF's. Obwohl es dort großgeschrieben ist, muss ich (auf Grund der Vorgabe) den String anhand der Schreibweise verschieden bewerten. Der kann fett, kursiv etc - und eben Großbuchstaben sein (auch Groß kursiv fett, was dann eine andere interne Bedeutung hat)

Schemata :

apfel - in Liste 1 einsortieren (fett)
apfel - in Liste 2 einsortieren (italic)
APFEL - (Caps) - in Liste 3 einsortieren ((fett, groß)
APFEL - (Caps) - in Liste 4 einsortieren usw.(fett, groß, kursiv)

Ich könnte den String über die Zwischenablage in eine Textfeld importieren. Aber bei 30 MB Sourcematerial ists kein angenehmer Arbeitsschritt (langsam und flackernd).
Zudem geht mir eine resp. die Information (siehe Schemata) verloren. Diese müsste ich parallel über Positions- oder Stellenzähler mitlaufen lassen...

Ich hatte auf eine bequemere, vor allem eine elegantere Methode gehofft. Aber im komplette Internet scheint es nichts passendes zu geben.

Danke

j

himitsu 23. Feb 2016 16:18

AW: RichEdit , RTF und Großbuchstaben
 
Codegear hatte es mal geschafft Delphi von RichEdit 1.0 auf RichEdit 2.0 umzustellen, aber dann hatte sich da nichts mehr getan.
Bis RichEdit 1.0 oder ab RichEdit 3.0+ hättest du das Problem nicht. :stupid: (Aus Sicht der Datenverwaltung sind diese Eigenschaften auch eher unnütz hinderlich)

Zitat:

CFE_ALLCAPS
Characters are all capital letters. The value does not affect the way the control displays the text. This value applies only to versions earlier than Microsoft Rich Edit 3.0.

CFE_SMALLCAPS
Characters are in small capital letters. The value does not affect how the control displays the text.
RichEdit.SelAttributes.ConsistentAttributes unterstützt kein CFM_ALLCAPS, aber du kannst das ja auch selber abfragen.
https://msdn.microsoft.com/de-de/lib.../bb787883.aspx
Delphi-Quellcode:
var Format: TCharFormat2;
Format.cbSize := SizeOf(TCharFormat2);
SendGetStructMessage(RichEdit.Handle, EM_GETCHARFORMAT, 1, Format, True);
Texte mit dieser Eigenschaft suchen und dann
Delphi-Quellcode:
SelText := AnsiUpperCase(SelText);
:zwinker:

p80286 23. Feb 2016 16:58

AW: RichEdit , RTF und Großbuchstaben 2
 
Zitat:

Zitat von jaikai (Beitrag 1331133)
den Sring Apfel aus dem RTF herauszubekommen ist nicht das Problem.

Das Problem liegt an der Formatierung innerhalb des RTF's. Obwohl es dort großgeschrieben ist, muss ich (auf Grund der Vorgabe) den String anhand der Schreibweise verschieden bewerten. Der kann fett, kursiv etc - und eben Großbuchstaben sein (auch Groß kursiv fett, was dann eine andere interne Bedeutung hat)

Könnte es sein, daß Du da etwas verwechselst?
In einer RTF-Datei liegen die Formatinformationen und der angezeigte Text hintereinander (stream).
z.B.
Code:
{\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid1331219 Apfel}{\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid3025572 
\par }{\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid1331219 Apfel
\par Apfel
\par }{\rtlch\fcs1 \af31507 \ltrch\fcs0 \b\insrsid1331219\charrsid1331219 Apfel
\par }{\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid1331219 Apfelmus
\par }{\rtlch\fcs1 \af31507 \ltrch\fcs0 \b\i\insrsid1331219\charrsid1331219 Apfel
\par }
das kannst Du Lesen und die entsprechenden Attribute für jedes Wort setzen.
oder aber Du arbeitest mit einem TRichEdit und nutzt SelText/SelLength/selstart und SelAttribute den Text und die zugehörigen Attribute zu bekommen.
Um SelText zu positionieren könnte man z.b
Delphi-Quellcode:
while letzteposition<length(text) do
  lp1:=Posex(' ',meintext,letztePosition)
  lp2:=Posex(' ',meintext,letztePosition)
  selstart:=p1+1;
  sellength:=p2-1-p1;
  ..machwas
  letzteposition:=p2;
end;
nutzen. (Ist nicht getestet, nur als Anregung!)

Mit den Informationen fütterst du Dann eine Wortliste, die auch die Attribute enthält. Ob das eine Stringliste mit Objects oder eine Objectlist mit Records oder.. ist, ist zunächst einmal egal.

Gruß
K-H
Nachtrag:

Zitat:

Zitat von himitsu (Beitrag 1331139)
Aus Sicht der Datenverwaltung sind diese Eigenschaften auch eher unnütz hinderlich)

Wer ist auch so ... Dateneigenschaften am Aussehen fest zu machen.:stupid:

Sind die Jedis nicht etwas weiter gekommen?

mjustin 23. Feb 2016 18:49

AW: RichEdit , RTF und Großbuchstaben 2
 
Zitat:

Zitat von jaikai (Beitrag 1331133)
Ich hatte auf eine bequemere, vor allem eine elegantere Methode gehofft. Aber im komplette Internet scheint es nichts passendes zu geben.

Es gibt für Delphi Bibliotheken, die eine RTF Datei einlesen und in andere Formate konvertieren können. Diese enthalten daher auch mehr oder weniger ausgefeilte Parser, die den Text und die Formatierungen verarbeiten :wink:

Beispiel: http://wiki.delphi-jedi.org/wiki/JVC...RichEditToHtml

Jasocul 24. Feb 2016 07:11

AW: RichEdit , RTF und Großbuchstaben
 
Es ist zwar schon ein bisschen her, dass ich mich mit Richtext beschäftigen musste, aber die Vorgehensweise des TE irritiert mich ein wenig.
Man kann doch eine TRichEdit-Komponente wortweise durchgehen und die Formatierungen des gerade ausgewählten Bereiches feststellen. Wie man wortweise durchgeht, weiß ich im Moment nicht, aber ich bin mir ziemlich sicher, dass es relativ einfach ist. Die Formatierung war über SelAttributes.Style, festzustellen, wenn ich mich richtig erinnere.

Die Wortliste kann man also einfach erstellen und die zugehörigen Formatierungen hat man dann doch eigentlich auch sofort verfügbar. Warum soll man denn die Formatierung selbst analysieren?

Und was passiert bei
Code:
\caps Apfel und Birne \caps0
oder
Code:
\caps ap\caps0 fel
Wie ist das Wort dann formatiert?

p80286 24. Feb 2016 10:23

AW: RichEdit , RTF und Großbuchstaben
 
a) ist klar: Großdarstellung
b) 1) darf es nicht geben 2) sollte es trotzdem einmal vorkommen tritt automatisch 1) in Kraft!

Gruß
K-H

jaikai 25. Feb 2016 20:33

\Caps apfel \cap0 bleibt apfel...
 
Moin,

also nach zwei Tagen Recherche und wildesten, verzweifestem Herumprobieren ergibt sich folgendes:

Lösung := false; Web.Lösung := false; Frust := true;

Wer was anderes behauptet: Bitte! Sagt es mir...

Hinweis: Ich bin DTP'ler und setze Bücher, wirklich fette Bücher. Der Delphi-Zwischenschritt der Konvertierung verwandelt Format X in meine Rohdaten zum Setzen. Das spart für gewöhnlich richtig fiese, ewiglange, ermüdende Stunden Arbeit.

Also: Das gute alte Wordpad belässt die \Caps apfel \cap0 in Kleinbuchstaben, auch wenn ich sie über die Zwischenablage in den Editor kopiere. WordViewer (ich verweigere MS-Office) wandelt dito in APFEL(!!!) um, wenn ich übers Clipboard kopiere. Der Umweg über ein (OCR-) PDF ist dito (APFEL)...
Ergo: Zugriff auf \Caps muss möglich sein. Weiss das Web davon?

Als DTP'ler behaupte ich: Die ganze RTF-Kiste ist fürn Ar...
Leider ist html auch kein Ausweg. No alternate, no way...
Die zusätzlichen Meta-Informationen, die einer Schrift-Art und Farbe oder Groß-/Kleinschreibung innewohnen kann, bekommt man nicht kopiert. Nonverbale Kommunikation. Da steckt mehr Info, drin, wie sichtbar - ähem - auslebar!

Es macht einfach keinen Sinn, Zugriff auf die Schrift zuzulassen - wie Fett, kursiv oder zu unterstreichen (was auch über zB. if SelAttributes.Style = [fsBold] durchaus wieder abfragbar kann). Anderes ist gar nicht direkt zuweisbar/lesbar - was an meinem veraltenten Delphi + VCL liegen mag). Schrift-Attribute wie Versalien, Kapitälchen, Hochstellen etc. sind weder zuweisbar, geschweige denn auslesbar. Versalien sind doch vom Kern her nix anderes wie fett oder kursiv.

DTP-Programme (Windows-Versionen - Mac unbekannt) InDesign, Quark etc. verfahren übrigens genauso: Caps ist nur virtuell, beim Kopieren ists noch immer im Original (ggf mit Formatierung), was logisch durchaus richtig ist (wenn man alles wieder verwirft/verwerfen möchte). Beim Export als/zu RTF werden wunderbarerweise unlesbare Formatierungen übergeben...

Irgendwas läuft da falsch...

Ich habs über die Schiene: Suchen und Ersetzen beim Autor in den Griff bekommen. Attribute in einer anderer Schrift oder Farbe... das kann ich über Style etc auslesen. Purer Pfusch, Interimslösung, mehr nicht.

Für alle die suchen : Es geht nicht! \Caps apfel \cap0 bleibt apfel...
... ich ess jetzt Birnen.

Gut Nächtle

j

himitsu 26. Feb 2016 01:38

AW: \Caps apfel \cap0 bleibt apfel...
 
Zitat:

Zitat von jaikai (Beitrag 1331396)
Also: Das gute alte Wordpad belässt die \Caps apfel \cap0 in Kleinbuchstaben, auch wenn ich sie über die Zwischenablage in den Editor kopiere. WordViewer (ich verweigere MS-Office) wandelt dito in APFEL(!!!) um, wenn ich übers Clipboard kopiere.

Ist doch auch vollkommen Klar?

Hast dir meinen Beitrag und die Links bestimmt durchgelesen? :stupid:

Word und Co. lesen das RTF und konvertieren es in ihr Format.
WordPad kann es nicht, da es aktuell RichEdit 3.0 verwendet und dieses \Caps ausschließlich in 2.x vorhanden war, welches aber Delphi "aktuell" verwendet, allerdings mit der VCL-Schnittstelle für 1.x mit paar Änderungen, aber ohne neue Funktionalitäten. -> In RichEdit 1.x gab es \Caps noch nicht, also kennt die VCL das nicht.

Und natürlich hatte ich die Lösung auch schon erwähnt. :roll:


PS: Es gibt Fonts, welche nur Großbuchstaben kennen. :lol:


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