Seite 1 von 1
String/Leerschritt aus Editorgadget direkt auslesen
Verfasst: 25.01.2013 17:00
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
Re: String/Leerschritt aus Editorgadget direkt auslesen
Verfasst: 25.01.2013 20:35
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
Re: String/Leerschritt aus Editorgadget direkt auslesen
Verfasst: 26.01.2013 09:43
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
Re: String/Leerschritt aus Editorgadget direkt auslesen
Verfasst: 26.01.2013 15:48
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

Re: String/Leerschritt aus Editorgadget direkt auslesen
Verfasst: 26.01.2013 18:41
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.
Original aus der RichEdit.pbi.
Re: String/Leerschritt aus Editorgadget direkt auslesen
Verfasst: 26.01.2013 18:49
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

Re: String/Leerschritt aus Editorgadget direkt auslesen
Verfasst: 26.01.2013 19:13
von dysti
Hey TS-Soft,
jetzt habe ich es gemerkt:
REG = GadgetID(Gadget)
Die Variable REG nicht deklariert.
Du hast da mit einer Classe gearbeitet.
Wollte zum Lernen aber nicht die ganze ".pbi" einbinden.
Re: String/Leerschritt aus Editorgadget direkt auslesen
Verfasst: 26.01.2013 19:39
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
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
Re: String/Leerschritt aus Editorgadget direkt auslesen
Verfasst: 26.01.2013 19:56
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.
Re: String/Leerschritt aus Editorgadget direkt auslesen
Verfasst: 27.01.2013 11:25
von dysti
TS-Soft/Danilo,
prima Erläuterungen und Erklärungen. Sowas nennt man Hilfe.
