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:

Code: Alles auswählen

neuerString.s = "[u]" + markierterText.s + "[/u]"
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. :allright:
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]
:praise:

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.