Scintilla - Text ersetzen ?
Verfasst: 24.05.2013 18:32
Hallo.
Für ein IDE-Werkzeug, habe ich die Funktion SendIDE() von Stargate/ts-soft benutzt um in das IDE-Scintilla Text zu
schreiben. Allerdings würde ich gerne das Verhalten der IDE herstellen, wie es mit den Code-Bausteinen umgeht.
Also wenn ein Text im Scintilla selektiert ist, überschreibt die IDE diesen selektierten Bereich mit dem CodeBaustein (per doppelklick)
Die Funktion SendIDE dagegen fügt nur an der Cursorposition ein.
Ich habe schon mit der Konstante #SCI_ADDTEXT rumgespielt, aber alle die ich ausprobierte
(#SCI_INSERTTEXT, #SCI_REPLACESEL, #SCI_SETTEXT usw) brachten nicht das gewünschte Ergebnis.
Welche Messages muss ich denn senden, damit ich (wenn ein Textblock selektiert ist) den Textblock auch überschreibe...
Als Basis nochmal meine leicht abgeänderte SendIDE Funktion :
Ich hoffe ich hab mein Problem verständlich genug ausgedrückt 
Für ein IDE-Werkzeug, habe ich die Funktion SendIDE() von Stargate/ts-soft benutzt um in das IDE-Scintilla Text zu
schreiben. Allerdings würde ich gerne das Verhalten der IDE herstellen, wie es mit den Code-Bausteinen umgeht.
Also wenn ein Text im Scintilla selektiert ist, überschreibt die IDE diesen selektierten Bereich mit dem CodeBaustein (per doppelklick)
Die Funktion SendIDE dagegen fügt nur an der Cursorposition ein.
Ich habe schon mit der Konstante #SCI_ADDTEXT rumgespielt, aber alle die ich ausprobierte
(#SCI_INSERTTEXT, #SCI_REPLACESEL, #SCI_SETTEXT usw) brachten nicht das gewünschte Ergebnis.
Welche Messages muss ich denn senden, damit ich (wenn ein Textblock selektiert ist) den Textblock auch überschreibe...
Als Basis nochmal meine leicht abgeänderte SendIDE Funktion :
Code: Alles auswählen
Procedure SendIDE(Message.s)
Protected ProcessID, PID, Length, Format, *Buffer, *MemoryID
Protected WindowID = Val(GetEnvironmentVariable("PB_TOOL_MAINWINDOW"))
Protected ScintillaID = FindWindowEx_(WindowID, 0, "Scintilla", 0)
If ScintillaID
If GetWindowThreadProcessId_(WindowID, @PID)
ProcessID = OpenProcess_(#PROCESS_ALL_ACCESS, #False, PID)
If ProcessID
Select SendMessage_(ScintillaID, #SCI_GETCODEPAGE, #Null, #Null)
Case 0 : Format = #PB_Ascii
Case 65001 : Format = #PB_UTF8
EndSelect
Length = StringByteLength(Message, Format)
*Buffer = AllocateMemory(Length + SizeOf(Character))
If *Buffer
PokeS(*Buffer, Message, -1, Format)
*MemoryID = VirtualAllocEx_(ProcessID, #Null, Length, #MEM_RESERVE|#MEM_COMMIT, #PAGE_EXECUTE_READWRITE)
If *MemoryID
WriteProcessMemory_(ProcessID, *MemoryID, *Buffer, Length, #Null)
; Hier hatte ich auch schon die erwähnten Konstanten probiert...
SendMessage_(ScintillaID, #SCI_ADDTEXT, Length, *MemoryID)
VirtualFreeEx_(ProcessID, *MemoryID, Length, #MEM_RELEASE)
EndIf
FreeMemory(*Buffer)
EndIf
CloseHandle_(ProcessID)
EndIf
EndIf
EndIf
EndProcedure
Delay(5000)
SendIDE("Hallo")