Seite 2 von 2
Re: Clipboardinhalt unabhängig vom Typ speichern und zurück
Verfasst: 01.10.2009 12:55
von Hyper
Hi ts-soft!
Wird der Speicher freigegeben? Dann wirds in der Tat schwierig. Hm, wie könnte ich dann meine Aufgabe anders lösen? Kann ich ja mal kurz darstellen, ist ja kein Geheimnis:
Aufgabe: Mehrere RTF-Strings miteinander korrekt kombinieren.
Meine derzeitige Lösung:
Code: Alles auswählen
1. Baue ein unsichtbares Fenster mit Editor_Links und Editor_Rechts
2. (Sicherung Inhalt Zwischenablage)
3.0 Beginn Durchlauf für alle RTF-Strings
3.1 Setze RTF-String in Editor_Links
3.2 Ausschneiden kompletten Inhalt von Editor_Links in Zwischenablage
3.3 Einfügen aus Zwischenablage ans Ende von Editor_Rechts
3.4 Ende Durchlauf
4. Hole kompletten RTF-Text aus Editor_Rechts
5. (Zurücksetzen Zwischenablage)
Funktioniert 100%ig. Vorteil: man bekommt einen sauberen zusammengefügten RTF-String zurück und erspart sich das Auseinandersetzen mit der RTF-Syntax. Aber man hat eben das Problem die Schritte 2. und 5. realisieren zu müssen.
Falls es hierfür eine andere und gleich gute Lösung gibt, würde ich sehr gern die Zwischenablage in Ruhe lassen.
PS: Bleibt noch zu bemerken, dass ich das deutsche und englische Forum komplett durchsucht habe, bevor ich mich für diese Lösung entschloss.
Re: Clipboardinhalt unabhängig vom Typ speichern und zurück
Verfasst: 01.10.2009 19:46
von Kiffi
Hyper hat geschrieben:Funktioniert 100%ig.
... solange kein anderer Programmierer auf die Idee kommt, eine
Applikation zu schreiben, die genauso vorgeht wie Dein Programm.
Außerdem gibt's ja auch noch den Anwender, der das Clipboard
für seine Zwecke nutzen will.
Wie willst Du sicherstellen, dass Du mit Deinem Programm nicht dazwischenfunkst?
Grüße ... Kiffi
Re: Clipboardinhalt unabhängig vom Typ speichern und zurück
Verfasst: 01.10.2009 21:13
von Hyper
Hi Kiffi,
nun der Anweder gibt den Befehl zum Anzeigen, in diesem Moment werden im Hintergrund die Texte zusammengestellt und vorbereitet und dann in direkter Folge ineinanderkopiert und ausgegeben.
Während des Ablaufes muss der Anwender theoretisch auf der Ergebnis warten. Praktisch geht es natürlich so schnell, dass er davon nichts mitbekommt.
Der Anwender soll ja auch das Clipboard nutzen, selbstverständlich. Dafür brauche ich ja genau dass, was ich hier angefragt habe: Speichern und Wiederherstellen des Clipboards.
Sollte es eine andere Lösung geben RTF-Texte zu kombinieren, würde ich natürlich nicht über das CP gehen, ist doch klar. Hast Du eine Idee?
Re: Clipboardinhalt unabhängig vom Typ speichern und zurück
Verfasst: 01.10.2009 21:32
von Kiffi
Hyper hat geschrieben:Hast Du eine Idee?
sagen wir mal so: Ich habe eine Ahnung. Allerdings so ganz ohne
Code ist das ein wenig der trübe Blick in die Glaskugel.
Du kopierst eine Zeile aus einem Editorgadget in das Clipboard? Mit welchem Befehl?
Grüße ... Kiffi
Re: Clipboardinhalt unabhängig vom Typ speichern und zurück
Verfasst: 01.10.2009 21:44
von Hyper
Hi Kiffi,
ich nutze die Windows APIs:
Code: Alles auswählen
Procedure sy_Editor_Select_All (i_Gadget.i)
SendMessage_(GadgetID(i_Gadget),#EM_SETSEL, 0, -1)
EndProcedure
Procedure sy_Editor_Cut (i_Gadget.i )
SendMessage_(GadgetID(i_Gadget), #WM_CUT, 0, 0)
EndProcedure
Procedure sy_Editor_Copy (i_Gadget.i )
SendMessage_(GadgetID(i_Gadget), #WM_COPY, 0, 0)
EndProcedure
Procedure sy_Editor_Paste (i_Gadget.i )
SendMessage_(GadgetID(i_Gadget), #WM_PASTE, 0, 0)
EndProcedure
Zunächst setze ich den Code in Editor_Links über SetGadgetText() rein, kopiere ihn dann mit
Code: Alles auswählen
sy_Editor_Select_All(Editor_Links)
sy_Editor_Cut(Editor_Links)
und setze ihn mit
an den schon vorhandenen RTF-Text im Editor_Rechts. Dann kommt der nächste Text (Ich arbeite eine LinkedList ab.) Das Hilfs-Fenster bleibt bleibt immer unsichtbar und wird ganz am Ende wieder geschlossen.
Re: Clipboardinhalt unabhängig vom Typ speichern und zurück
Verfasst: 01.10.2009 21:55
von Kiffi
mit #EM_GETSEL kannst Du Dir den markierten Text in eine
Variable einlesen. Dann benötigst Du kein #WM_COPY und
dementsprechend auch kein Clipboard mehr.
Grüße ... Kiffi
Re: Clipboardinhalt unabhängig vom Typ speichern und zurück
Verfasst: 01.10.2009 22:00
von Hyper
Aha, das probiere ich morgen mal. Und wie füge ich den Text dann im rechten Editor an?
Re: Clipboardinhalt unabhängig vom Typ speichern und zurück
Verfasst: 01.10.2009 22:07
von Kiffi
Hyper hat geschrieben:Und wie füge ich den Text dann im rechten Editor an?
mit #EM_REPLACESEL
Grüße ... Kiffi
// Edit: Wieso erst morgen? Der Abend ist noch jung!

Re: Clipboardinhalt unabhängig vom Typ speichern und zurück
Verfasst: 02.10.2009 11:42
von Hyper
Guten Morgen Kiffi,
so, die ersten Versuche sehen ganz gut aus. Aber leider wird die Formatierung nicht mit kopiert. Muss ich die extra auslesen oder mache ich hier etwas falsch?
Code: Alles auswählen
Procedure.s RTF_GetSelectedText(i_Gadget.i)
;/ -----------------------------------------------------------------------------
;/ Copy selected Text to String
;/ -----------------------------------------------------------------------------
Protected l_marked.CHARRANGE
Protected l_txt.s
SendMessage_(GadgetID(i_Gadget), #EM_EXGETSEL , 0, @l_marked )
l_txt = Space (1 + l_marked\cpMax - l_marked\cpMin)
SendMessage_(GadgetID(i_Gadget), #EM_GETSELTEXT, 0, @l_txt)
ProcedureReturn l_txt
EndProcedure
text$ = "{\rtf1\ansi\ansicpg1252\deff0\deflang1031{\fonttbl{\f0\fmodern\fprq1\fcharset0 Courier New;}{\f1\fswiss\fprq2\fcharset0 Arial;}{\f2\fswiss\fprq2\fcharset0 Verdana;}}"
text$ = text$ + "{\colortbl ;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;\red0\green0\blue0;}"
text$ = text$ + "\viewkind4\uc1\pard\f0\fs20 normal \cf1 rot\cf0 \cf2 gr\'fcn\cf0 \b fett\b0 \cf3\b fettblau \cf0\b0 normal\par "
text$ = text$ + "Jetzt Text markieren und Fenster schließen klicken! \f1 Arial, \f2\fs28 Verdana\fs20 , \f0 Courier New\cf4\par "
text$ = text$ + "}"
OpenWindow(#PB_Any, 216, 0, 590, 300, "Popup Menu im Editor-Gadget" , #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar)
EditorGadget(9000, 10, 10 , 280, 280)
EditorGadget(9001, 300, 10 , 280, 280)
SetGadgetText( 9000, text$ ) ;/ Text reinsetzen
;/ Pause: Jetzt Textteile markieren
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
l_sel.s = RTF_GetSelectedText( 9000 )
;/ Rechts reinsetzen [leider ohne Format]
SetGadgetText( 9001, l_sel )
;/ Pause
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow