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

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
HeX0R
Beiträge: 3040
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: Erledigt- wie im Forum üblich, geht das? BBCode EditorGa

Beitrag von HeX0R »

Nimm integer (.i) und nicht long (.l)!
Spätestens, wenn Du x64 kompiliert und #PB_Any zur Gadgeterstellung nutzt, könnte es sonst zu merkwürdigen Effekten kommen.
Benutzeravatar
udg
Beiträge: 566
Registriert: 20.06.2013 23:27

Re: Erledigt- wie im Forum üblich, geht das? BBCode EditorGa

Beitrag von udg »

Danke, habe es geändert.

aber ich habe folgendes Problem entdeckt , dass mir auf die Schnelle nicht auffiehl:
Wenn ich längeren Text benutze und einen späteren Abschnitt in BB tags setzen will, werden am letzten Wort Buchstaben weggeschnitten :(

---------
Beispiel:

... Welt verliebte sich in dieses rehäugige, unerfahrene, immer etwas schüchtern wirkende Mädchen. Gleich für ihre erste Hauptrolle wurde die Schauspielerin 1954 mit einen Oscar ausgezeichnet und war fortan ein Star.

[u]
Doch Hepburn wurde nic[/u] <--- hier wird vom WORT "nicht" das "ht" weggeschnitten.

nur eine bekannte Schauspielerin - ...

------------------------
wie kann ich das lösen?

je länger der Text um so ungenauer wird das korrekte Umschließen.
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
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Erledigt- wie im Forum üblich, geht das? BBCode EditorGa

Beitrag von Kiffi »

udg hat geschrieben:je länger der Text um so ungenauer wird das korrekte Umschließen.
genauer gesagt: Je mehr Zeilenumbrüche, desto ungenauer. Die werden meiner Erfahrung nach mit EM_GETSEL nicht mitgezählt. Diese Zeichen musst Du separat berechnen und auf Dein cende addieren.

Grüße ... Peter
a²+b²=mc²
Benutzeravatar
udg
Beiträge: 566
Registriert: 20.06.2013 23:27

Re: noch BUG- wie im Forum üblich, geht das? BBCode EditorGa

Beitrag von udg »

Code: Alles auswählen

text = Mid(text, cstart + 1, cende - cstart)  ;Text zwischen Anfang und Ende ausschneiden
liegt es an dieser Codezeile?

ich selektiere zb. im weiteren Text nur 3 Wörter. Dort ist doch kein Zeilenumbruch vorhanden und

Code: Alles auswählen

SendMessage_(GadgetID(gID), #EM_GETSEL, @cstart, @cende)  ;Anfang und Ende der Markierung holen
sagt doch dem Programm, dass es nur die Markierung berücksichtigen soll.
Sehe ich was falsch?

Code: Alles auswählen

cende
wenn sich der Text ändert, was die länge angeht, kann ich dann überhaupt einzeln noch was berechnen?

Code: Alles auswählen

cende + 5
zB. geht hier in der Mitte vom text jetzt, dann aber weiter hinten nicht mehr.
Da gibts doch bestimmt eine ordentliche Lösung.
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
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: noch BUG- wie im Forum üblich, geht das? BBCode EditorGa

Beitrag von Kiffi »

udg hat geschrieben:Dort ist doch kein Zeilenumbruch vorhanden
aber mit Sicherheit vor der Markierung.

Grüße ... Peter
a²+b²=mc²
Benutzeravatar
udg
Beiträge: 566
Registriert: 20.06.2013 23:27

Re: noch BUG- wie im Forum üblich, geht das? BBCode EditorGa

Beitrag von udg »

Kiffi hat geschrieben:
udg hat geschrieben:Dort ist doch kein Zeilenumbruch vorhanden
aber mit Sicherheit vor der Markierung.

Grüße ... Peter
ja vor der markierung sind 6 Zeilenumbrüche und diese 6 Zeichen werden dann weggelassen.

Worried. Gibt es noch eine andere Methode außer #EM_GETSEL ?

Für mich nur gerade unverständlich warum ich sage: "nehme nur den markierten Text" aber alles davor wird auch mit verarbeitet.

Gruß
Zuletzt geändert von udg am 08.07.2015 04:42, insgesamt 1-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
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: noch BUG- wie im Forum üblich, geht das? BBCode EditorGa

Beitrag von Kiffi »

Schau mal hier:

Original-Posting von Christi (ein wenig modifiziert und lauffähig gemacht):

Code: Alles auswählen

OpenWindow(0, 0, 0, 200, 220, "Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

editorid = EditorGadget(0, 0, 0, 200, 200)
ButtonGadget(1, 50, 200, 100, 20, "Klick")

For z = 1 To 10
  AddGadgetItem(0, -1, "zeile " + Space(z) + Str(z))
Next

Repeat
  w_ereignis = WaitWindowEvent()
  Select w_ereignis
  	Case #PB_Event_Gadget
  		
      If EventGadget() = 1
        
        textlaenge = SendMessage_(editorid, #WM_GETTEXTLENGTH, 0, 0)
        text = AllocateMemory(textlaenge)
        SendMessage_(editorid, #WM_GETTEXT, textlaenge, text)
        
        SendMessage_(editorid, #EM_GETSEL, @anfang, @ende)
        
        anfang + SendMessage_(editorid, #EM_EXLINEFROMCHAR, 0, anfang)
        ende + SendMessage_(editorid, #EM_EXLINEFROMCHAR, 0, ende)
        
        SendMessage_(editorid, #EM_REPLACESEL, 0, ">" + PeekS(text + anfang, ende - anfang) + "<")
 
        FreeMemory(text)
      EndIf
 
    Case #PB_Event_CloseWindow
      End
   EndSelect
 
ForEver
Grüße ... Peter
a²+b²=mc²
Benutzeravatar
udg
Beiträge: 566
Registriert: 20.06.2013 23:27

Re: noch BUG- wie im Forum üblich, geht das? BBCode EditorGa

Beitrag von udg »

Danke für deine Version. Ich habe dies mal eingearbeitet.

PS:
bei deiner Version wird bei Zeile 10, am Schluss bei der 10 die "null" weggeschnitten. Da ist auch noch ein Bug

So, weiter im Text.

Hier mein Code:

Code: Alles auswählen

EnableExplicit

Enumeration
   #Window_0
EndEnumeration

Enumeration
  #Editor_Info
  #btnPaste
  #btnBBCode
  #btnClearText
EndEnumeration

Define.l Event, EventWindow, EventGadget, EventType, EventMenu, editorid, textlaenge, text, start, ende

OpenWindow(#Window_0, 0, 0, 600, 400, "BB Code in EditorGadget", #PB_Window_SystemMenu|#PB_Window_TitleBar|#PB_Window_ScreenCentered)
;Editor Gadget
editorid = EditorGadget(#Editor_Info, 20, 70, 560, 280, #PB_Editor_WordWrap)
;Buttons
ButtonGadget(#btnBBCode, 20, 10, 85, 30, "[u][/u]")
ButtonGadget(#btnPaste, 120, 10, 140, 30, "füge Text aus clipboard ein")
ButtonGadget(#btnClearText, 275, 10, 100, 30, "lösche Text")
;MAIN
Repeat
   Event = WaitWindowEvent()
    Select Event
      Case #PB_Event_Gadget
        Select EventGadget()
          Case #btnPaste
            SendMessage_(GadgetID(#Editor_Info),#WM_PASTE,0,0)   
              Case #btnClearText
                 SetGadgetText(#Editor_Info,"")
                    Case #btnBBCode
                      textlaenge = SendMessage_(editorid, #WM_GETTEXTLENGTH, 0, 0)
                      text = AllocateMemory(textlaenge)
                      SendMessage_(editorid, #WM_GETTEXT, textlaenge, text)
                      SendMessage_(editorid, #EM_GETSEL, @start, @ende)
                      start + SendMessage_(editorid, #EM_EXLINEFROMCHAR, 0, start)
                      ende + SendMessage_(editorid, #EM_EXLINEFROMCHAR, 0, ende)
                      SendMessage_(editorid, #EM_REPLACESEL, 0, "[u]" + PeekS(text + start, ende - start) + "[/u]")                     
                      FreeMemory(text)
        EndSelect
           Case #PB_Event_CloseWindow
            EventWindow = EventWindow()
              If EventWindow = #Window_0
                CloseWindow(#Window_0)
                ClearClipboard()
                Break
              EndIf
    EndSelect
Until Event = #PB_Event_CloseWindow
End
funktioniert, wie vorher auch schon mit der Version von Sven - AAAber:
Ich konnte nun das Problem lokalisieren warum es nicht funktioniert wie gedacht.
Vorab: fügst Du in meine Version Langen Text ein und machst irgendwo unten eine Markierung und dann klick auf den [BBCode button], wirst Du sehen, dass wieder etwas weggeschnitten wird. (wer gerade keinen längeren Text zur Hand hat, hier ein Online "Lorem Ipsum" Generator: http://www.blindtextgenerator.com/lorem-ipsum)

Schuld ist in der Zeile:editorid = EditorGadget(#Editor_Info, ... das #PB_Editor_WordWrap am Ende.

nimmst Du: #PB_Editor_WordWrap raus, funktioniert es. /:->
Nun will ich aber nicht, dass der lange Text bis 1 Meter nach rechts geht (als Beispiel) sondern es soll schon am Rand des EditorGadgets umgebrochen werden.

Wie kann man das nun wieder lösen???

Das ist ja zum Mäuse melken. >_<

Grüße aus der Ver2flungs Ecke
Zuletzt geändert von udg am 08.07.2015 04:54, insgesamt 1-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
Ligatur
Beiträge: 196
Registriert: 09.07.2006 00:41

Re: noch BUG- wie im Forum üblich, geht das? BBCode EditorGa

Beitrag von Ligatur »

Wir wäre es so? Finde ich auch etwas elegantger, einfach die Tags an die entsprechenden Stellen zu schreiben

Code: Alles auswählen

EnableExplicit

Define.i ev, start, ende, editorID

OpenWindow(0, 0, 0, 300, 300, "Einfügen", #PB_Window_SystemMenu)

EditorGadget(1, 5, 35, 290, 255)
editorID = GadgetID(1)
ButtonGadget(2, 5, 5, 45,20,"Unterstreichen")
Repeat
  ev = WaitWindowEvent()
  If (ev = #PB_Event_Gadget And EventGadget() = 2)
    SendMessage_(editorID, #EM_GETSEL, @start, @ende)
    SendMessage_(editorID, #EM_SETSEL, ende , ende)
    SendMessage_(editorID, #EM_REPLACESEL, 0, "[/u]")
    SendMessage_(editorID, #EM_SETSEL, start, start)
    SendMessage_(editorID, #EM_REPLACESEL, 0, "[u]")
    SendMessage_(editorID, #EM_SETSEL, start, ende + 7)  ; Nur nötig, falls Selektion bestehen bleiben soll
  EndIf
Until ev = #PB_Event_CloseWindow
Damit sollten auch keine Probleme durch Zeilenumbrüchen auftreten da setsel und getsel gleich arbeiten und nichts anderes benutzt wird zur Positionsbestimmung.
Benutzeravatar
udg
Beiträge: 566
Registriert: 20.06.2013 23:27

Re: noch BUG- wie im Forum üblich, geht das? BBCode EditorGa

Beitrag von udg »

Ligatur! mein Held. So funktioniert es . Kann keine Fehler finden. :praise:

CODE: FINAL VERSION

Code: Alles auswählen

EnableExplicit

Enumeration
   #Window_0
EndEnumeration

Enumeration
  #Editor_Info
  #btnPaste
  #btnBBCode
  #btnClearText
EndEnumeration

Define.l Event, EventWindow, EventGadget, EventType, EventMenu, editorid, textlaenge, text, start, ende

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, 280, #PB_Editor_WordWrap)
editorID = GadgetID(#Editor_Info)
;Buttons
ButtonGadget(#btnBBCode, 20, 10, 85, 30, "[u][/u]")
ButtonGadget(#btnPaste, 120, 10, 140, 30, "füge Text aus clipboard ein")
ButtonGadget(#btnClearText, 275, 10, 100, 30, "lösche Text")
;MAIN
Repeat
   Event = WaitWindowEvent()
    Select Event
      Case #PB_Event_Gadget
        Select EventGadget()
          Case #btnPaste
            SendMessage_(GadgetID(#Editor_Info),#WM_PASTE,0,0)   
              Case #btnClearText
                 SetGadgetText(#Editor_Info,"")
                    Case #btnBBCode
                        SendMessage_(editorID, #EM_GETSEL, @start, @ende)
                        SendMessage_(editorID, #EM_SETSEL, ende , ende)
                        SendMessage_(editorID, #EM_REPLACESEL, 0, "[/u]")
                        SendMessage_(editorID, #EM_SETSEL, start, start)
                        SendMessage_(editorID, #EM_REPLACESEL, 0, "[u]")
                        SendMessage_(editorID, #EM_SETSEL, start, ende + 7)  ; Nur nötig, falls Selektion bestehen bleiben soll
                    EndSelect
           Case #PB_Event_CloseWindow
            EventWindow = EventWindow()
              If EventWindow = #Window_0
                CloseWindow(#Window_0)
                ClearClipboard()
                Break
              EndIf
    EndSelect
Until Event = #PB_Event_CloseWindow
End
Zuletzt geändert von udg am 08.07.2015 16:30, 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
Antworten