| Autor |
Beitrag |
longhugo
      
Beiträge: 35
Dephi 7, WinXP, C++
|
Verfasst: Mo 15.08.05 15:11
Moin!
Angenommen ich habe einen RTF Text und vor und hinter jedem Wort befinden sich
Indizes in Form von Textmarken/Bookmarks. Wenn ich jetzt mit der Maus über
dem Wort bin (oder das Wort markiere) sollen diese Indizes ausgelesen
werden.
Habt Ihr eine Idee...bzw. ist das mit RichEdit möglich oder muss ich
mir eine erweitere Editor VCL installieren?
Danke schonmal
Euer Hugo
|
|
Lannes
      
Beiträge: 2352
Erhaltene Danke: 4
Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
|
Verfasst: Di 16.08.05 13:36
Hallo,
wenn ich Dich richtig verstanden habe, willst Du eine Anzeige der
mit den Bookmarks verbunden Texte realisieren.
Das ist mit dem Standard-RichEdit möglich.
In dem Code-Beispiel wird im Ereignis OnMouseMove ein String in der Art z.B. [2] unter dem Mauszeiger gesucht und dann aus einer ListBox der zugehörige Text als Hint angezeigt.
Nun der Code, zum Anpassen an Dein Vorhaben:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53:
| uses RichEdit; procedure TForm1.FormCreate(Sender: TObject); begin RichEdit1.Lines.Add('Dies ist der Text mit dem Bookmark [1]'); RichEdit1.Lines.Add('Dies ist der Text in dem Bookmark [2] enthalten ist'); RichEdit1.Lines.Add('Mit Bookmark [3] beginnt dieser Satz'+#13#10+'und hier ist das Ende.'); ListBox1.Items.Add('Bookmark Nr. 1 liegt unter der Maus'); ListBox1.Items.Add('Bookmark Nr. 2 liegt unter der Maus'); ListBox1.Items.Add('Bookmark Nr. 3 liegt unter der Maus'); end;
procedure TForm1.RichEdit1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var iCharIndex, iLineIndex, iCharOffset, i, j,iErg: Integer; Pt: TPoint; s,sErg: string; begin with TRichEdit(Sender) do begin Pt := Point(X, Y); iCharIndex := Perform(Messages.EM_CHARFROMPOS, 0, Integer(@Pt)); if iCharIndex < 0 then Exit; iLineIndex := Perform(EM_EXLINEFROMCHAR, 0, iCharIndex); iCharOffset := iCharIndex - Perform(EM_LINEINDEX, iLineIndex, 0); if Lines.Count - 1 < iLineIndex then Exit; s := Lines[iLineIndex]; i := iCharOffset + 1; while (i > 0) and (s[i] <> ' ') do Dec(i); j := iCharOffset + 1; while (j <= Length(s)) and (s[j] <> ' ') do Inc(j); sErg:= Trim(Copy(s, i, j - i)); if (Length(sErg) > 2) and (sErg[1] = '[') and (sErg[Length(sErg)] = ']') then begin iErg := StrToInt(Copy(sErg,2,Length(sErg)-2)); Hint := ListBox1.Items[iErg-1]; if iErg <> RichEdit1.Tag then begin Application.CancelHint; RichEdit1.Tag := iErg; end; end else Application.CancelHint; end; end; |
_________________ MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
|
|
longhugo 
      
Beiträge: 35
Dephi 7, WinXP, C++
|
Verfasst: Di 16.08.05 13:57
Hallo das ist eigentlich nicht das was ich meinte. In RichEdit gibts ja die Option
Plaintext True/False. Im Plaintext des Textes den ich per Loadfile o. Stream ins
Richedit hole gibt es Steuerzeichen wie z.B.:
"\bkmkstart\74747\ICHBINEINWORT\bkmkend\74900"
Das soll der User ja nicht sehen - also gebe ich Plaintext:= False mit, damit der
Text leserlich bleibt. Im RichEdit Control steht dann ja nur "ICHBINEINWORT"
Ich brauche aber für mein Progi diese beiden Zahlen hinter bkmstart und bkmend.
Ich muss eingenltlich nur wissen, wo Delphi die RTF Steuerzeichen/Tags usw. speichert, dann kann ich ja
mit nem Pointer abgreifen. Hab mit GetSelTextBuf experimentiert - aber ich finde einfach
nicht heraus wie man an diese Daten kommt. Sie müssen ja da sein, sonst würde
RichEdit sie ja nicht ausblenden. Und in den von Richedit vorgegebenen Steuerzeichen
(TTextAttributes) gibts ja nur Farben usw. ICh hab auch schon probiert: Plaintext aus, Text anzeigen
jetzt Plaintext wieder an und mit GetSelText und SelAttributes usw. ranzukommen...geht aber
alles nich...
Sorry, wenn ich mich vorher nicht korrekt genug ausgedrückt habe...Das sind ja eigentlich keine
Bookmarks sondern Textmarken...
Ciao
...es scheint irgendeine Lösung zu geben...beim Googeln erscheinen so 10 Seiten auf kyrillisch...
-> ich verstehs natürlich nich...
|
|
Lannes
      
Beiträge: 2352
Erhaltene Danke: 4
Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
|
Verfasst: Di 16.08.05 15:24
Hallo,
das ist imho die korrekte Formatbeschreibung.
Quelltext 1:
| {\*\bkmkstart 74747} ICHBINEINWORT {\bkmkend 74747} |
An den PlainText der Richedit kommst Du mit einem Tipp bei den Schweitzern : ...die Rtf Formatierung von einem RichEdit auslesen?
Das hilft Dir aber nicht weiter, weil dann dein bkmkstart nicht im Ergebnisstring vorhanden ist.
Das ist das gleiche als wenn man eine RTF-Datei mit LoadFromFile in einem Richedit(PlainText=False) öffnet und dann wieder speichert. Die RichEdit überliest beim Einlesen unbekannte und nicht genutzte (z.B Farben) Formatierungscodes, nur die bekannten und genutzten werden wieder in die Datei geschrieben.
Mit PlainText=True ist die Ausgabedatei unverändert weil sie nur als Text behandelt wird..
Ich sehe da keine andere Möglichkeit als die Datei seperat in einen String o.ä. zu laden und die Steuerzeichen dann auszulesen.
_________________ MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
|
|
longhugo 
      
Beiträge: 35
Dephi 7, WinXP, C++
|
Verfasst: Di 16.08.05 16:15
ja das denk ich auch...als Trick dann vielleicht zwei Richedits aufmachen. Eins mit PlainText True und
eins mit False. Das mit True Invisible machen und dann irgendwie die beiden mit einander verbinden
aber zum Teufel wie...eine Inidzierung oder so...muss mal schaun...
ich möchte so ungern auf dsa Word  OLE zurückgreifen
totzdem danke...
|
|
|