AGB  ·  Datenschutz  ·  Impressum  







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

RichEdit , RTF und Großbuchstaben

Ein Thema von jaikai · begonnen am 23. Feb 2016 · letzter Beitrag vom 26. Feb 2016
Antwort Antwort
jaikai

Registriert seit: 1. Jun 2005
70 Beiträge
 
#1

RichEdit , RTF und Großbuchstaben

  Alt 23. Feb 2016, 12:29
Delphi-Version: 5
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

\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
Wenn die Programme das machen, wie's wir machen, wären sie unbrauchbar...
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#2

AW: RichEdit , RTF und Großbuchstaben

  Alt 23. Feb 2016, 15:56
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
jaikai

Registriert seit: 1. Jun 2005
70 Beiträge
 
#3

RichEdit , RTF und Großbuchstaben 2

  Alt 23. Feb 2016, 16:49
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
Wenn die Programme das machen, wie's wir machen, wären sie unbrauchbar...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: RichEdit , RTF und Großbuchstaben

  Alt 23. Feb 2016, 17:18
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. (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 SelText := AnsiUpperCase(SelText);
$2B or not $2B

Geändert von himitsu (23. Feb 2016 um 17:26 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#5

AW: RichEdit , RTF und Großbuchstaben 2

  Alt 23. Feb 2016, 17:58
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:

Aus Sicht der Datenverwaltung sind diese Eigenschaften auch eher unnütz hinderlich)
Wer ist auch so ... Dateneigenschaften am Aussehen fest zu machen.

Sind die Jedis nicht etwas weiter gekommen?
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector

Geändert von p80286 (23. Feb 2016 um 18:03 Uhr)
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#6

AW: RichEdit , RTF und Großbuchstaben 2

  Alt 23. Feb 2016, 19:49
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

Beispiel: http://wiki.delphi-jedi.org/wiki/JVC...RichEditToHtml
Michael Justin
habarisoft.com

Geändert von mjustin (23. Feb 2016 um 19:51 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.355 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: RichEdit , RTF und Großbuchstaben

  Alt 24. Feb 2016, 08:11
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?
Peter
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#8

AW: RichEdit , RTF und Großbuchstaben

  Alt 24. Feb 2016, 11:23
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
jaikai

Registriert seit: 1. Jun 2005
70 Beiträge
 
#9

\Caps apfel \cap0 bleibt apfel...

  Alt 25. Feb 2016, 21:33
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
Wenn die Programme das machen, wie's wir machen, wären sie unbrauchbar...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

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

  Alt 26. Feb 2016, 02:38
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?

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.


PS: Es gibt Fonts, welche nur Großbuchstaben kennen.
$2B or not $2B
  Mit Zitat antworten Zitat
Antwort Antwort

 

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 02:52 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