Seite 1 von 1

Scintilla - Text ersetzen ?

Verfasst: 24.05.2013 18:32
von Bisonte
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 :

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")
Ich hoffe ich hab mein Problem verständlich genug ausgedrückt ;)

Re: Scintilla - Text ersetzen ?

Verfasst: 24.05.2013 19:42
von edel
Versuch es noch mal mit SCI_REPLACESEL, das ist das was du suchst. Vielleicht hast du ja etwas falsch gemacht?

Re: Scintilla - Text ersetzen ?

Verfasst: 24.05.2013 20:30
von Bisonte
edel hat geschrieben:Versuch es noch mal mit SCI_REPLACESEL, das ist das was du suchst. Vielleicht hast du ja etwas falsch gemacht?
Ich denke mal der richtige Aufruf wäre :

Code: Alles auswählen

SendMessage_(ScintillaID, #SCI_REPLACESEL, #Null, *MemoryID)
Und nun gehts... komischerweise hab ich das genauso vorher auch schon probiert, da mir das am sinnvollsten erschien...

Danke.