String/Leerschritt aus Editorgadget direkt auslesen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

String/Leerschritt aus Editorgadget direkt auslesen

Beitrag von dysti »

Mit diesem Code emuliere ich den Überschreibemodus im Editorgadget:

Code: Alles auswählen

            SendMessage_(GadgetID(Gadget),#EM_EXGETSEL,0,Range.CHARRANGE)
            SendMessage_(GadgetID(#Gadget_Main_Editor),#EM_SETSEL,Range\cpMax, Range\cpMax+1)
            SendMessage_(GadgetID(#Gadget_Main_Editor),#WM_CUT,0,0)
            SendMessage_(GadgetID(#Gadget_Main_Editor), #EM_REPLACESEL, 1, @"3"); Text wird eingesetzt
Es wird ein rechts befindlicher Buchstabe/String gelöscht und neu eingefügt.

Wie kann ich aber an der Cursorposition des Editorgadget den rechts befindlichen Buchstaben/String auslesen?

Beispielcode: http://forums.purebasic.com/german/view ... cea232c4b2
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
Benutzeravatar
CSHW89
Beiträge: 489
Registriert: 14.12.2008 12:22

Re: String/Leerschritt aus Editorgadget direkt auslesen

Beitrag von CSHW89 »

Code: Alles auswählen

text.s = Space(1)
SendMessage_(GadgetID(#Gadget_Main_Editor), #EM_GETSELTEXT, #Null, @text)
Debug text
Da du nur ein Zeichen auslesen willst, reicht "Space(1)". Das müsste dann entsprechend dem Bereich, der selektiert ist, vergrößert werden.

lg Kevin
Bild Bild Bild
http://www.jasik.de - Windows Hilfe Seite
padawan hat geschrieben:Ich liebe diese von hinten über die Brust ins Auge Lösungen
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Re: String/Leerschritt aus Editorgadget direkt auslesen

Beitrag von dysti »

CSHW89,
danke, auch für die weiteren Info´s.

Das habe ich bisher herausgefunden, weiß aber nicht, ob man das so verwenden würde?
Bitte um Kritik.

Code: Alles auswählen

strl=Len(GetGadgetText(#Gadget_Main_Editor))
            SendMessage_(GadgetID(Gadget),#EM_EXGETSEL,0,Range.CHARRANGE)                     ;Cursor abfragen / in cpMax speichern
            For i=0 To strl
            SendMessage_(GadgetID(#Gadget_Main_Editor),#EM_SETSEL,Range\cpMax+i, Range\cpMax+i+1)
            SendMessage_(REG, #EM_GETSELTEXT, 0, *mem)
            zeichen$= RichEdit_GetSelText(#Gadget_Main_Editor)
            Debug zeichen$
            SendMessage_(GadgetID(#Gadget_Main_Editor),#EM_SETSEL,Range\cpMax, Range\cpMax)
            If zeichen$=" "
              Debug "Ein Leerschritt"
            EndIf
          Next

hier die Procedure dazu (stammt von TS-Soft):

Code: Alles auswählen

Procedure.s RichEdit_GetSelText(gadget)
  Protected startpos.l, endpos.l, size.l, *mem, result.s
  REG = GadgetID(Gadget) 
  If SendMessage_(REG, #EM_GETSEL, @startpos, @endpos)
    size = endpos - startpos + 1
    size * SizeOf(Character)
    *mem = AllocateMemory(size)
    If *mem
      SendMessage_(REG, #EM_GETSELTEXT, 0, *mem)
      result = PeekS(*mem)
      FreeMemory(*mem)
    EndIf
  EndIf
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: String/Leerschritt aus Editorgadget direkt auslesen

Beitrag von ts-soft »

dysti hat geschrieben: hier die Procedure dazu (stammt von TS-Soft):

Code: Alles auswählen

Procedure.s RichEdit_GetSelText(gadget)
  Protected startpos.l, endpos.l, size.l, *mem, result.s
  REG = GadgetID(Gadget) 
  If SendMessage_(REG, #EM_GETSEL, @startpos, @endpos)
    size = endpos - startpos + 1
    size * SizeOf(Character)
    *mem = AllocateMemory(size)
    If *mem
      SendMessage_(REG, #EM_GETSELTEXT, 0, *mem)
      result = PeekS(*mem)
      FreeMemory(*mem)
    EndIf
  EndIf
Nett das Du das erwähnst, aber in meiner Variante wurden mit Sicherheit alle Variablen
deklariert. Von dieser schlampigen Abwandlung distanziere ich mich dann lieber :mrgreen:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Re: String/Leerschritt aus Editorgadget direkt auslesen

Beitrag von dysti »

Von dieser schlampigen Abwandlung distanziere ich mich dann lieber
Ich habe da nichts abgewandelt. So die Zip vor paar Tagen von deiner HP heruntergeladen. Entpackt und Procedure in den PB-Editor hineinkopiert. :bounce:
Original aus der RichEdit.pbi.
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: String/Leerschritt aus Editorgadget direkt auslesen

Beitrag von ts-soft »

Hier ist das Original:

Code: Alles auswählen

Procedure.s RichEdit_GetSelText(*this.RichEditClassTemplate)
  Protected startpos.l, endpos.l, size.l, *mem, result.s
  
  If SendMessage_(*this\hWnd, #EM_GETSEL, @startpos, @endpos)
    size = endpos - startpos + 1
    size * SizeOf(Character)
    *mem = AllocateMemory(size)
    If *mem
      SendMessage_(*this\hWnd, #EM_GETSELTEXT, 0, *mem)
      result = PeekS(*mem)
      FreeMemory(*mem)
    EndIf
  EndIf
  
  ProcedureReturn result
EndProcedure
Alle Variablen sind deklariert. EnableExplicit hat nichts auszusetzen. Dein obiger Code ist
nicht von mir, so schlampig programmiere ich meist nicht :wink:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Re: String/Leerschritt aus Editorgadget direkt auslesen

Beitrag von dysti »

Hey TS-Soft,
jetzt habe ich es gemerkt:
REG = GadgetID(Gadget)
Die Variable REG nicht deklariert. :praise:
Du hast da mit einer Classe gearbeitet.
Wollte zum Lernen aber nicht die ganze ".pbi" einbinden.
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: String/Leerschritt aus Editorgadget direkt auslesen

Beitrag von ts-soft »

Ich hab nach Einführung von EnableExplicit, lange benötigt einzusehen, wie wichtig und sinnvoll die
Nutzung dessen doch ist. Inzwischen empfinde ich code ohne dieses als drittklassig :mrgreen:
Die Declaration von Variablen erhöht die Lesbarkeit. Es werden stupide Fehler vermieden, so das
dann meist nur noch die logischen Fehler auftreten, deren Suche aber mehr Spaß macht.

Und wenn hier um Hilfe gebeten wird, wo im Code diese Möglichkeit der Fehlervermeidung nicht
genutzt wird, werde ich meist auch nicht helfen, da diese Personen nicht mal diese einfache
Möglichkeit zum selber finden des Fehlers genutzt haben.

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: String/Leerschritt aus Editorgadget direkt auslesen

Beitrag von Danilo »

dysti hat geschrieben:Das habe ich bisher herausgefunden, weiß aber nicht, ob man das so verwenden würde?
Bitte um Kritik.

Code: Alles auswählen

strl=Len(GetGadgetText(#Gadget_Main_Editor))
            SendMessage_(GadgetID(Gadget),#EM_EXGETSEL,0,Range.CHARRANGE)                     ;Cursor abfragen / in cpMax speichern
            For i=0 To strl
            SendMessage_(GadgetID(#Gadget_Main_Editor),#EM_SETSEL,Range\cpMax+i, Range\cpMax+i+1)
            SendMessage_(REG, #EM_GETSELTEXT, 0, *mem)
            zeichen$= RichEdit_GetSelText(#Gadget_Main_Editor)
            Debug zeichen$
            SendMessage_(GadgetID(#Gadget_Main_Editor),#EM_SETSEL,Range\cpMax, Range\cpMax)
            If zeichen$=" "
              Debug "Ein Leerschritt"
            EndIf
          Next
Ich denke das geht einfacher für Anfänger. Trotzdem musst Du verschiedene Dinge beachten.
Erst holst Du Range.CHARRANGE. Dann solltest Du vergleichen ob Range\cpMax und Range\cpMin gleich sind.
Sind sie gleich, gibt es keinen selektierten Text. Den Text hast Du ja eh schon durch GetGadgetText() am Anfang.
Mit einem Character-Pointer hast Du so einfachen Zugriff auf den String, mit der Position in Range\cpMax bzw. cpMin.
Dann veränderst Du diesen String (cpMax+1 löschen) und schon hast Du Deinen überschriebenen String, den
Du wieder ins EditorGadget schiebst.
Sind cpMin und cpMax aber unterschiedlich gibt es eine Textselektion. Dann solltest Du genau diese Selection
entfernen, also nimmst du Left() + "neuer char" + Right() um einen String zu bauen, der die Mitte zwischen
cpMin und cpMax raus lässt und den neuen Character dort einsetzt.
Das ganze am Ende noch in einen Callback rein und diese Prozedur immer bei #WM_CHAR wiederholen.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Re: String/Leerschritt aus Editorgadget direkt auslesen

Beitrag von dysti »

TS-Soft/Danilo,
prima Erläuterungen und Erklärungen. Sowas nennt man Hilfe. :allright:
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
Antworten