Seite 1 von 1

Wie kann ich den PB-Editor von außen bearbeiten?

Verfasst: 20.02.2009 16:38
von STARGÅTE
Tachchen,

Ich würde gerne von außen (also einem anderen Programm) Texte in den PB-Editor einfügen lassen bzw löschen lassen.

Kann mir einer n stück Code schreiben wo ich zB irgendein Wort an einer stelle des Quellcode einfügen kann ?

Mit SendKeys() aus dem Archiv will ich es nicht machen, es wäre gut wenn sowas mit ScintillaSendMessage gehen würde ...

Verfasst: 20.02.2009 23:30
von edel
Hier mal ein kleines Programm das ich nutze (als Werkzeug starten) :

Code: Alles auswählen

Procedure.s GetPBDir()
  ProcedureReturn GetPathPart(GetEnvironmentVariable("PB_TOOL_IDE"))
EndProcedure

Procedure.l GetSCI()
  ProcedureReturn Val(GetEnvironmentVariable("PB_TOOL_Scintilla"))
EndProcedure

Procedure GetProcessFromWindow(hwnd)
  Protected pid.l = 0
  Protected result.l = 0
  
  If GetWindowThreadProcessId_(hwnd, @pid)
    result = OpenProcess_(#PROCESS_ALL_ACCESS, #False, pid)
  EndIf
  
  ProcedureReturn result
EndProcedure

ProcedureDLL PasteText(buffer.s)
  Protected hProc.l = 0
  Protected mem.l = 0
  Protected bW.l = 0
  Protected hsci.l = GetSCI()
  Protected len.l = 0
  
  hProc = GetProcessFromWindow(hsci)
  
  If hProc
    
    len = Len(buffer)
    mem = VirtualAllocEx_(hProc, 0, len, #MEM_RESERVE | #MEM_COMMIT, #PAGE_EXECUTE_READWRITE)
    
    If mem
      WriteProcessMemory_(hProc, mem, @buffer, len, @bW)
      ret = SendMessage_(hsci, #SCI_ADDTEXT, len, mem)
      VirtualFreeEx_(hProc, mem, len, #MEM_RELEASE)
    EndIf
    
    CloseHandle_(hProc)
  EndIf
  
EndProcedure

Procedure.s GetInclude(dir.s)
  
  ClearGadgetItems(0)
  
  If ExamineDirectory(0, GetPBDir() + dir, "*.pbi")
    
    While NextDirectoryEntry(0)
      
      If DirectoryEntryType(0) = #PB_DirectoryEntry_File
        AddGadgetItem(0, -1, DirectoryEntryName(0))
      EndIf
      
    Wend
    
    FinishDirectory(0)
    
  EndIf
  
EndProcedure

Procedure.s BuildBuffer(dir.s)
  buffer.s = "XIncludefile ( #PB_Compiler_Home + " + Chr(34)
  buffer.s + dir + GetGadgetText(0)
  buffer.s + Chr(34) + ")" + #LF$
  ProcedureReturn buffer
EndProcedure

Procedure main()
  
  hwnd = OpenWindow(0, #PB_Ignore, #PB_Ignore, 300, 155, "Select Include")
  
  ListViewGadget(0, 5, 5, 290, 110)
  ButtonGadget(1, 5, 125, 75, 23, "Paste")
  ButtonGadget(2, 295-75, 125, 75, 23, "Open")
  ButtonGadget(3, 295/2-(75/2), 125, 75, 23, "New")
  
  DisableGadget(1, #True)
  DisableGadget(2, #True)
  
  If ProgramParameter(0)
    dir.s = ProgramParameter(0) + "\"
  Else
    dir.s = "include\"  
  EndIf 
  
  GetInclude(dir)
  
  Repeat
    event = WaitWindowEvent()
    
    If event = #PB_Event_Gadget
      
      If EventGadget() = 1
        If GetGadgetText(0)
          PasteText(BuildBuffer(dir))
        EndIf 
      EndIf
      
      If EventGadget() = 2
        If GetGadgetText(0)
          RunProgram(GetPBDir() + dir + GetGadgetText(0))
        EndIf 
        Break
      EndIf
      
      If EventGadget() = 3
      
        Repeat
      
          file.s = InputRequester("New Inlude","Set a name or press ESC","inc.temp.pbi")
      
          If file
            
            If FileSize(GetPBDir() + dir + file) = -2
              MessageRequester("Error","File is a directory !")
              Continue
            EndIf 
            
            If FileSize(GetPBDir() + dir + file) > -1
              If Not MessageRequester("Error","File exists, overrides ?",#PB_MessageRequester_YesNo) = #PB_MessageRequester_Yes
                Continue
              EndIf             
            EndIf 
            
            If CreateFile(0,GetPBDir() + dir + file)
              CloseFile(0)
            EndIf
            
            GetInclude(dir)
            
            SetGadgetText(0,file)
            
          EndIf    
               
        Until #True  
        
      EndIf
      
      If EventGadget() = 0
        
        If EventType() = #PB_EventType_LeftDoubleClick
          If GetGadgetText(0)
            PasteText(BuildBuffer(dir))
          EndIf   
        EndIf
        
        If GetGadgetState(0)> -1
          DisableGadget(1, #False)
          DisableGadget(2, #False)
        Else
          DisableGadget(1, #True)
          DisableGadget(2, #True)
        EndIf
        
      EndIf
      
    EndIf
    
    If event = #WM_KEYDOWN
      If EventwParam() = #VK_ESCAPE
        Break
      EndIf 
    EndIf 
    
  Until event = #PB_Event_CloseWindow
  
EndProcedure : main()


Verfasst: 21.02.2009 00:18
von STARGÅTE
Danke edel, kannst du noch kurz sagen was das Werkzeug für Parameter bekommt, damit ich es mal in Aktion sehen kann, sonst gucke ich einafch was ich gebrauchen kann

Verfasst: 21.02.2009 00:23
von ts-soft
Ich denke mal das Verzeichnis, wo Du Deine Includes aufbewahrst. Trigger
wird das nicht benötigen.

Verfasst: 21.02.2009 00:29
von STARGÅTE
jo schon gut brauchs nicht mehr, habe bereits das "gefiltert" was ich brauche.

SUPER großen danke an edel :allright:

Verfasst: 23.04.2009 18:09
von edel
Oh gar nicht gelesen :oops:
Dein Programm, meins da oben oder der Editor?

Verfasst: 23.04.2009 20:04
von Andesdaf
Danke für den Code :D :allright: