Seite 1 von 3
erledigt- wie im Forum üblich, geht das? BBCode EditorGadget
Verfasst: 06.07.2015 15:22
von udg
ist es möglich für ein EditorGadget folgendes zu realisieren?
wie auch in einem Forum üblich, dass man einen markierten Text mit [u] und [/u] umschließt?
Beispiel:
"Dieser Beitrag soll helfen das Problem zu lösen."
im Forum üblich, markiere ich den Text und klicke oben auf "u"
heraus soll kommen:
"Dieser Beitrag [u]soll helfen[/u] das Problem zu lösen."
Ich möchte nicht, das der Text dann unterstrichen wird, sondern die BB-Tags den markierten Text im Endergebnis umschließen.
ich erstell einen Button "[u]". Nun markiere ich im EditorGadget, Text, und dieser markierte Text soll nun am Anfang eingefügt bekommen:
"[u]" und am Ende der Markierung "[/u]"
Es muss also der markierte Bereich erkannt werden und per klick auf den erstellten Button in die Tags gesetzt werden.
Ansatz Hilfen?
Vielen Dank
Re: Frage- wie im Forum üblich, geht das?
Verfasst: 06.07.2015 15:46
von thinkitsimple
Du kannst doch den String selbst zusammensetzen, etwa so:
Code: Alles auswählen
neuerString.s = chr(91) + "u" + chr(93) + markierterText.s + chr(91) + chr(92) "u" + chr(93)
Re: Frage- wie im Forum üblich, geht das?
Verfasst: 06.07.2015 15:56
von Sven
Aus diesen zwei Funktionen
Code: Alles auswählen
Procedure InsertGadgetText(gID.l, text.s) ;Text bei Cursor in StringGadget einfügen
SendMessage_(GadgetID(gID), #EM_REPLACESEL, #True, @text)
EndProcedure
Procedure.s GetSelGadgetText(gID.l) ;Text aus Markierung von StringGadget kopieren
text.s = GetGadgetText(gID) ;Buffer reservieren
SendMessage_(GadgetID(gID), #EM_GETSEL, @cstart.l, @cende.l)
text = Mid(text, cstart + 1, cende - cstart)
ProcedureReturn text
EndProcedure
müßtest Du Dir was basteln können. Den Text der Auswahl mit #EM_GETSEL holen, die Textteile davor und dahinter einfügen und den neuen Text mit #EM_REPLACESEL an Stelle der Auswahl setzen.
Re: Frage- wie im Forum üblich, geht das?
Verfasst: 06.07.2015 16:10
von udg
Danke euch beiden. Ich werde das eben mal testen.
Re: Frage- wie im Forum üblich, geht das?
Verfasst: 06.07.2015 16:40
von Sven
thinkitsimple hat geschrieben:Code: Alles auswählen
neuerString.s = chr(91) + "u" + chr(93) + markierterText.s + chr(91) + chr(92) "u" + chr(93)
Es spricht natürlich nichts dagegen, das gleich so zu schreiben:
Oder wenn Du flexibler sein willst:
Code: Alles auswählen
#in_u$ = "[u]" : #out_u$ = "[/u]"
#in_b$ = "[b]" : #out_b$ = "[/b]"
...
neuerString.s = #in_u$ + markierterText.s + #out_u$
Re: Frage- wie im Forum üblich, geht das?
Verfasst: 06.07.2015 17:35
von udg
So, erstmal ein Gerüst gebaut:
Code: Alles auswählen
EnableExplicit
Enumeration
#Window_0
EndEnumeration
Enumeration
#Editor_Info
#btnPaste
#btnBBCode
EndEnumeration
Define.l Event, EventWindow, EventGadget, EventType, EventMenu
OpenWindow(#Window_0, 0, 0, 600, 400, "", #PB_Window_SystemMenu|#PB_Window_TitleBar|#PB_Window_ScreenCentered)
;Editor Gadget
EditorGadget(#Editor_Info, 20, 70, 560, 180,#PB_Editor_WordWrap)
ButtonGadget(#btnPaste, 120, 10, 140, 30, "füge Text aus clipboard ein")
ButtonGadget(#btnBBCode, 20, 10, 85, 30, "[u][/u]")
;MAIN
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_Gadget
Select EventGadget()
Case #btnPaste
SendMessage_(GadgetID(#Editor_Info),#WM_PASTE,0,0)
Case #btnBBCode
If EventGadget()= #btnBBCode
;bb Code
EndIf
EndSelect
Case #PB_Event_CloseWindow
EventWindow = EventWindow()
If EventWindow = #Window_0
CloseWindow(#Window_0)
Break
EndIf
EndSelect
Until Event = #PB_Event_CloseWindow
End
jetzt muss ich den BB Code noch integrieren.
Re: Frage- wie im Forum üblich, geht das?
Verfasst: 06.07.2015 18:19
von udg
was bedeutet dies hier: gID.l
wo gibt es infos dazu?
aus der Prozedur:
Procedure InsertGadgetText(gID.l, text.s) ;Text bei Cursor in StringGadget einfügen
SendMessage_(GadgetID(#hier_mein_editorGadget), #EM_REPLACESEL, #True, @text)
EndProcedure
Im Moment fügt es nichts ein sondern löscht das markierte wenn ich auf meinen Button klicke.
Re: Frage- wie im Forum üblich, geht das?
Verfasst: 06.07.2015 18:27
von Sven
udg hat geschrieben:was bedeutet dies hier: gID.l
Das ist die Gadget-ID, die wird hier mit übergeben, damit die Funktion universell auf verschiedene Gadgets anwendbar ist. Das wäre bei Dir #Editor_Info.
Du mußt unterscheiden:
#Editor_Info ist die PB-eigene ID, anhand der PB das Gadget erkennt.
SendMessage_ möchte aber die Windows-eigene ID, die Windows einmalig vergibt. Die bekommst Du mit GadgetID(#Editor_Info) für genau dieses Gadget oder GadgetID(gID) für das übergebene Gadget in meiner Funktion.
Es empfiehlt sich, in Prozeduren keine festen IDs zu verwenden, sondern diese als Variablen zu übergeben, um die Prozedur universell einsetzen zu können.
Re: Frage- wie im Forum üblich, geht das?
Verfasst: 06.07.2015 18:39
von Sven
Ungetestet, aber so sollte es gehen:
Code: Alles auswählen
#in_u$ = "[u]" : #out_u$ = "[/u]"
Procedure InsertBrackets(gID.l, intxt.s, outtxt.s)
Protected text.s, cstart.l, cende.l
text = GetGadgetText(gID) ;Text aus Gadget holen
SendMessage_(GadgetID(gID), #EM_GETSEL, @cstart, @cende) ;Anfang und Ende der Markierung holen
text = Mid(text, cstart + 1, cende - cstart) ;Text zwischen Anfang und Ende ausschneiden
text = intxt + text + outtext ;Brackets um Text setzen
SendMessage_(GadgetID(gID), #EM_REPLACESEL, #True, @text) ;Text an Markierung einfügen
EndProcedure
InsertBrackets(#Editor_Info, #in_u$, #out_u$)
Re: Frage- wie im Forum üblich, geht das?
Verfasst: 06.07.2015 19:04
von udg
Danke für die super Erklärung.
Wieder etwas dazugelernt. Die Hilfe hat mir nichts darüber ausgegeben.
Sven hat geschrieben:Ungetestet, aber so sollte es gehen:
Code: Alles auswählen
#in_u$ = "[u]" : #out_u$ = "[/u]"
Procedure InsertBrackets(gID.l, intxt.s, outtxt.s)
Protected text.s, cstart.l, cende.l
text = GetGadgetText(gID) ;Text aus Gadget holen
SendMessage_(GadgetID(gID), #EM_GETSEL, @cstart, @cende) ;Anfang und Ende der Markierung holen
text = Mid(text, cstart + 1, cende - cstart) ;Text zwischen Anfang und Ende ausschneiden
text = intxt + text + outtext ;Brackets um Text setzen
SendMessage_(GadgetID(gID), #EM_REPLACESEL, #True, @text) ;Text an Markierung einfügen
EndProcedure
InsertBrackets(#Editor_Info, #in_u$, #out_u$)
einen Schreibfehler noch schnell gefixd und so gehts nun:
Code: Alles auswählen
#in_u$ = "[u]" : #out_u$ = "[/u]"
Procedure InsertBrackets(gID.l, intxt.s, outtxt.s)
Protected text.s, cstart.l, cende.l
text = GetGadgetText(gID) ;Text aus Gadget holen
SendMessage_(GadgetID(gID), #EM_GETSEL, @cstart, @cende) ;Anfang und Ende der Markierung holen
text = Mid(text, cstart + 1, cende - cstart) ;Text zwischen Anfang und Ende ausschneiden
text = intxt + text +
outtxt ;Brackets um Text setzen
Code: Alles auswählen
SendMessage_(GadgetID(gID), #EM_REPLACESEL, #True, @text) ;Text an Markierung einfügen
EndProcedure
...
InsertBrackets(#Editor_Info, #in_u$, #out_u$)[/color]
FIXED VERSION LETZTE SEITE
Ergebnis:
Code: Alles auswählen
EnableExplicit
Enumeration
#Window_0
EndEnumeration
Enumeration
#Editor_Info
#btnPaste
#btnBBCode
EndEnumeration
Define.l Event, EventWindow, EventGadget, EventType, EventMenu
#in_u$ = "[u]" : #out_u$ = "[/u]"
Procedure InsertBrackets(gID.i, intxt.s, outtxt.s)
Protected text.s, cstart.l, cende.l
text = GetGadgetText(gID) ;Text aus Gadget holen
SendMessage_(GadgetID(gID), #EM_GETSEL, @cstart, @cende) ;Anfang und Ende der Markierung holen
text = Mid(text, cstart + 1, cende - cstart) ;Text zwischen Anfang und Ende ausschneiden
text = intxt + text + outtxt ;Brackets um Text setzen
SendMessage_(GadgetID(gID), #EM_REPLACESEL, #True, @text) ;Text an Markierung einfügen
EndProcedure
OpenWindow(#Window_0, 0, 0, 600, 400, "BB Code in EditorGadget", #PB_Window_SystemMenu|#PB_Window_TitleBar|#PB_Window_ScreenCentered)
;Editor Gadget
EditorGadget(#Editor_Info, 20, 70, 560, 180,#PB_Editor_WordWrap)
ButtonGadget(#btnPaste, 120, 10, 140, 30, "füge Text aus clipboard ein")
ButtonGadget(#btnBBCode, 20, 10, 85, 30, "[u][/u]")
;MAIN
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_Gadget
Select EventGadget()
Case #btnPaste
SendMessage_(GadgetID(#Editor_Info),#WM_PASTE,0,0)
Case #btnBBCode
InsertBrackets(#Editor_Info, #in_u$, #out_u$)
EndSelect
Case #PB_Event_CloseWindow
EventWindow = EventWindow()
If EventWindow = #Window_0
CloseWindow(#Window_0)
Break
EndIf
EndSelect
Until Event = #PB_Event_CloseWindow
End
Dickes Danke.