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

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

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

Beitrag 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 ...
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag 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()

Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
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

Beitrag von ts-soft »

Ich denke mal das Verzeichnis, wo Du Deine Includes aufbewahrst. Trigger
wird das nicht benötigen.
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
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

jo schon gut brauchs nicht mehr, habe bereits das "gefiltert" was ich brauche.

SUPER großen danke an edel :allright:
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Oh gar nicht gelesen :oops:
Dein Programm, meins da oben oder der Editor?
Andesdaf
Moderator
Beiträge: 2671
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Beitrag von Andesdaf »

Danke für den Code :D :allright:
Win11 x64 | PB 6.20
Antworten