erledigt- wie im Forum üblich, geht das? BBCode EditorGadget

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
udg
Beiträge: 566
Registriert: 20.06.2013 23:27

erledigt- wie im Forum üblich, geht das? BBCode EditorGadget

Beitrag 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
Zuletzt geändert von udg am 08.07.2015 07:22, insgesamt 3-mal geändert.
PB v5.43 LTS + v6.02 LTS | Windows 7 x86 + 11 x64 - Gforce RTX 4090 - AMD Ryzen 9 5900X 12-Core Processor 4.2 GHz - 64,0 GB RAM,
ASUSTEK TUF Gaming X570 Plus
ASUS ROG Thor-1200P Platinum (1200W, Aura Sync, OLED Display, 0dB-Cooling)
1x 1 TByte Samsung MZ-V7S500BW 970 EVO Plus 1 TB NVMe M.2 Internal SSD
1x 2 TByte Samsung MZ-V7S2T0BW 970 EVO Plus 2 TB NVMe M.2 Internal SSD
von BiSONTE!. Kauft Hardware gern bei ihm.
Monitor:
LG 38GL950G-B 95 (38 Zoll) Ultragear Curved 21: 9 UltraWide QHD IPS
Benutzeravatar
thinkitsimple
Beiträge: 16
Registriert: 25.05.2012 15:14
Wohnort: Berlin, Germany
Kontaktdaten:

Re: Frage- wie im Forum üblich, geht das?

Beitrag 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)
Michael

PureBasic 5.60, Windows und macOS
Sven
Beiträge: 374
Registriert: 23.09.2004 12:01

Re: Frage- wie im Forum üblich, geht das?

Beitrag 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.
Benutzeravatar
udg
Beiträge: 566
Registriert: 20.06.2013 23:27

Re: Frage- wie im Forum üblich, geht das?

Beitrag von udg »

Danke euch beiden. Ich werde das eben mal testen.
PB v5.43 LTS + v6.02 LTS | Windows 7 x86 + 11 x64 - Gforce RTX 4090 - AMD Ryzen 9 5900X 12-Core Processor 4.2 GHz - 64,0 GB RAM,
ASUSTEK TUF Gaming X570 Plus
ASUS ROG Thor-1200P Platinum (1200W, Aura Sync, OLED Display, 0dB-Cooling)
1x 1 TByte Samsung MZ-V7S500BW 970 EVO Plus 1 TB NVMe M.2 Internal SSD
1x 2 TByte Samsung MZ-V7S2T0BW 970 EVO Plus 2 TB NVMe M.2 Internal SSD
von BiSONTE!. Kauft Hardware gern bei ihm.
Monitor:
LG 38GL950G-B 95 (38 Zoll) Ultragear Curved 21: 9 UltraWide QHD IPS
Sven
Beiträge: 374
Registriert: 23.09.2004 12:01

Re: Frage- wie im Forum üblich, geht das?

Beitrag 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$
Benutzeravatar
udg
Beiträge: 566
Registriert: 20.06.2013 23:27

Re: Frage- wie im Forum üblich, geht das?

Beitrag 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.
PB v5.43 LTS + v6.02 LTS | Windows 7 x86 + 11 x64 - Gforce RTX 4090 - AMD Ryzen 9 5900X 12-Core Processor 4.2 GHz - 64,0 GB RAM,
ASUSTEK TUF Gaming X570 Plus
ASUS ROG Thor-1200P Platinum (1200W, Aura Sync, OLED Display, 0dB-Cooling)
1x 1 TByte Samsung MZ-V7S500BW 970 EVO Plus 1 TB NVMe M.2 Internal SSD
1x 2 TByte Samsung MZ-V7S2T0BW 970 EVO Plus 2 TB NVMe M.2 Internal SSD
von BiSONTE!. Kauft Hardware gern bei ihm.
Monitor:
LG 38GL950G-B 95 (38 Zoll) Ultragear Curved 21: 9 UltraWide QHD IPS
Benutzeravatar
udg
Beiträge: 566
Registriert: 20.06.2013 23:27

Re: Frage- wie im Forum üblich, geht das?

Beitrag 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.
PB v5.43 LTS + v6.02 LTS | Windows 7 x86 + 11 x64 - Gforce RTX 4090 - AMD Ryzen 9 5900X 12-Core Processor 4.2 GHz - 64,0 GB RAM,
ASUSTEK TUF Gaming X570 Plus
ASUS ROG Thor-1200P Platinum (1200W, Aura Sync, OLED Display, 0dB-Cooling)
1x 1 TByte Samsung MZ-V7S500BW 970 EVO Plus 1 TB NVMe M.2 Internal SSD
1x 2 TByte Samsung MZ-V7S2T0BW 970 EVO Plus 2 TB NVMe M.2 Internal SSD
von BiSONTE!. Kauft Hardware gern bei ihm.
Monitor:
LG 38GL950G-B 95 (38 Zoll) Ultragear Curved 21: 9 UltraWide QHD IPS
Sven
Beiträge: 374
Registriert: 23.09.2004 12:01

Re: Frage- wie im Forum üblich, geht das?

Beitrag 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.
Sven
Beiträge: 374
Registriert: 23.09.2004 12:01

Re: Frage- wie im Forum üblich, geht das?

Beitrag 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$)
Benutzeravatar
udg
Beiträge: 566
Registriert: 20.06.2013 23:27

Re: Frage- wie im Forum üblich, geht das?

Beitrag 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.
Zuletzt geändert von udg am 08.07.2015 07:22, insgesamt 2-mal geändert.
PB v5.43 LTS + v6.02 LTS | Windows 7 x86 + 11 x64 - Gforce RTX 4090 - AMD Ryzen 9 5900X 12-Core Processor 4.2 GHz - 64,0 GB RAM,
ASUSTEK TUF Gaming X570 Plus
ASUS ROG Thor-1200P Platinum (1200W, Aura Sync, OLED Display, 0dB-Cooling)
1x 1 TByte Samsung MZ-V7S500BW 970 EVO Plus 1 TB NVMe M.2 Internal SSD
1x 2 TByte Samsung MZ-V7S2T0BW 970 EVO Plus 2 TB NVMe M.2 Internal SSD
von BiSONTE!. Kauft Hardware gern bei ihm.
Monitor:
LG 38GL950G-B 95 (38 Zoll) Ultragear Curved 21: 9 UltraWide QHD IPS
Antworten