PB IDE Werkzeug ProzedurNamen auslesen (Scintilla)

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

PB IDE Werkzeug ProzedurNamen auslesen (Scintilla)

Beitrag von hjbremer »

Warum ? Weil bei mir die Schnellhilfe in der IDE Statusbar die Prozedurnamen incl. Parameter von Include Dateien nicht immer angezeigt wird.
Obwohl diese in der IDE geladen sind. Egal ob Projekt oder nicht. Ich weiß nicht woran das liegt. Wahrscheinlich an irgendwelchen Einstellungen.

Darum dieses kleine Programm. Es ist recht einfach gehalten. Besonders bei den Befehlen den Inhalt vom IDE Scintilla Gadget zu lesen.
Seit die IDE auf Unicode, genauer UTF 8 umgestellt wurde ist dies auch recht einfach. Im Gegensatz zu älteren Beispielen wo aufs Memory
zugegriffen wird, benutze ich einfach simple Windows Api-Befehle.

Das einzige wo ich etwas Hilfe bräuchte ist der SizHandler. Schieben Sie das Fenster vom Rand in die Mitte und drücken den Button SIZE.

Code: Alles auswählen

EnableExplicit

Define version$ = "showProc V1.12 HJBremer" ;PB 5.70x86, 5.72x64, 6.02x64 - PB IDE UTF8 - Windows 10

ExamineDesktops() ;für SizeHandler()

;- Start
Enumeration   
   #window 
   #liste 
   #liste2 
   #buttonSize
   #buttonSort
   #buttonImport
   #buttonDelete
   #buttonSticky
   #buttonPrgEnd
EndEnumeration

Global winx=800, winy=100, winwidth=310, winheight=400
Global lastfile_item, prfFile$ = "ShowProcedurePrf.txt"

;Diese 2 GetHwnd.. Proceduren funktionieren bei mir innerhalb der IDE und compiliert als Exe.
;EnumWindows wäre sicherer. siehe z.B. https://www.purebasic.fr/english/viewtopic.php?t=80739

Procedure.i GetHwnd_Purebasic() 
   ProcedureReturn FindWindowEx_(GetDesktopWindow_(), 0, "WindowClass_2", 0)    
EndProcedure

Global banane

Procedure.i GetHwnd_Scintilla(hwnd)
   ;findet aktives Scintilla
   hWnd = FindWindowEx_(hWnd, 0, "PureSplitter", 0)
   hWnd = FindWindowEx_(hWnd, 0, "PureSplitter", 0)
   hWnd = FindWindowEx_(hWnd, 0, "PureContainer", 0)
   hWnd = FindWindowEx_(hWnd, 0, "Scintilla", 0) 
   ProcedureReturn hWnd
EndProcedure

Procedure.s GetScintillaText()
   
   Protected purebasic_hwnd = GetHwnd_Purebasic()
   Protected scintilla_hwnd = GetHwnd_Scintilla(purebasic_hwnd)   ;activer IDE-TAB   
   Protected chracterlength = SendMessage_(scintilla_hwnd, #SCI_GETLENGTH, #Null, #Null) + 1
   
   Protected text$ = Space(chracterlength) 
   Protected bytes = SendMessage_(scintilla_hwnd, #WM_GETTEXT, chracterlength, @text$)
   
   ProcedureReturn text$
EndProcedure

Procedure.i ScintillaToClipboard()
   ;kopiert den ScintillaText ins Clipboard ( Alternative zu GetScintillaText() )
   
   Protected purebasic_hwnd = GetHwnd_Purebasic()
   Protected scintilla_hwnd = GetHwnd_Scintilla(purebasic_hwnd)   ;activer IDE-TAB
   
   Protected caretpos = SendMessage_(scintilla_hwnd, #SCI_GETCURRENTPOS, #Null, #Null)
   
   SendMessage_(scintilla_hwnd, #WM_SETREDRAW, #Null, #Null)      ;damit man Select nicht sieht
   
   SendMessage_(scintilla_hwnd, #SCI_SELECTALL, #Null, #Null)     ;alles markieren
   SendMessage_(scintilla_hwnd, #SCI_COPY, #Null, #Null)          ;ab ins Clipboard
   SendMessage_(scintilla_hwnd, #SCI_SETEMPTYSELECTION, #Null, #Null) ;no Selection  
   
   SendMessage_(scintilla_hwnd, #WM_SETREDRAW, #True, #Null)      ;Redraw wieder ein
   SendMessage_(scintilla_hwnd, #SCI_SETSEL, caretpos, caretpos)  ;Caret sichtbar
   
   ;weitere Befehle: SendMessage_(scintilla_hwnd, #SCI_PASTE, #Null, #Null)  ;vom Clipboard nach Scintlla                    
   
EndProcedure

Procedure.i SetTextColor()
   
   Protected j, item$, count = CountGadgetItems(#liste2)-1
   
   Protected such1$ = "Macro ",     s1lg = Len(such1$)
   Protected such2$ = "Procedure ", s2lg = Len(such2$)
   Protected such3$ = "Procedure.", s3lg = Len(such3$)
   
   For j = 0 To count 
      item$ = GetGadgetItemText(#liste2, j)
      If     Left(item$, s1lg) = such1$ : SetGadgetItemColor(#liste2, j, #PB_Gadget_FrontColor, $700070) ;RotBlau
      ElseIf Left(item$, s2lg) = such2$ : SetGadgetItemColor(#liste2, j, #PB_Gadget_FrontColor, $0000CC) ;Rot
      ElseIf Left(item$, s3lg) = such3$ : SetGadgetItemColor(#liste2, j, #PB_Gadget_FrontColor, $CC0000) ;Blau
      EndIf 
   Next
   
EndProcedure

Procedure.i ImportProcedurLine()
   
   ;ScintillaToClipboard()
   
   Protected text$ = GetScintillaText()  ; = GetClipboardText() 
   
   Protected item$, j, ok, anz, count = CountString(text$, #CRLF$)
   
   SendMessage_(GadgetID(#liste2), #WM_SETREDRAW, 0,0) ;schaltet anzeigen von AddGadgetItem aus
   ClearGadgetItems(#liste2)
   
   Protected such1$ = "Macro ",     s1lg = Len(such1$)
   Protected such2$ = "Procedure ", s2lg = Len(such2$)
   Protected such3$ = "Procedure.", s3lg = Len(such3$)
   
   For j = 1 To count 
      item$ = LTrim(StringField(text$, j, #CRLF$))       
      If     Left(item$, s1lg) = such1$ : AddGadgetItem(#liste2, -1, item$): anz + 1
      ElseIf Left(item$, s2lg) = such2$ : AddGadgetItem(#liste2, -1, item$): anz + 1 
      ElseIf Left(item$, s3lg) = such3$ : AddGadgetItem(#liste2, -1, item$): anz + 1
      EndIf 
   Next
   SendMessage_(GadgetID(#liste2), #WM_SETREDRAW, 1,0)
   
   ProcedureReturn anz
EndProcedure

Procedure.i CheckImportName(importname$)
   ;check auf bereits vorhanden in Liste
   
   Protected j, ok = 1, anz = CountGadgetItems(#liste)
   
   For j = 0 To anz -1
      If GetGadgetItemText(#liste, j) = importname$
         SetGadgetState(#liste, j)
         ok = 0: Break
      EndIf
   Next   
   ProcedureReturn ok   ;return 1 wenn Name nicht vorhanden 
EndProcedure

Procedure.i SaveImport(liste, importname$)
   
   Protected filename$ = GetFilePart(importname$, #PB_FileSystem_NoExtension) + ".txt"   
   Protected anz = CountGadgetItems(liste)
   
   If anz      
      Protected j, t$, nr = CreateFile(#PB_Any, filename$, #PB_Ascii)      
      If nr
         For j = 0 To anz-1
            t$ = GetGadgetItemText(liste, j, 0)
            WriteStringN(nr, t$)           
         Next         
         CloseFile(nr)         
      Else
         anz = 0
         MessageRequester("Information","Konnte Datei nicht erstellen! " + filename$)
      EndIf
   EndIf   
   ProcedureReturn anz
EndProcedure

Procedure.i LoadImport(liste, importname$)
   
   Protected filename$ = GetFilePart(importname$, #PB_FileSystem_NoExtension) + ".txt"    
   Protected j, t$, nr = ReadFile(#PB_Any, filename$, #PB_Ascii)
   
   ClearGadgetItems(liste): SetGadgetItemText(liste, -1, "")   
   
   If nr
      While Eof(nr) = 0 
         t$ = ReadString(nr): AddGadgetItem(liste, j, t$): j + 1
      Wend      
      CloseFile(nr)      
   Else
      j = 0
      MessageRequester("Information","Konnte Datei nicht lesen! " + filename$)
   EndIf   
   ProcedureReturn j
EndProcedure

Procedure SizeHandler(size)
   
   Protected x = WindowX(#window), w = WindowWidth(#window), desktopwidth = DesktopWidth(0)
   
   If size: w - 250: Else: w + 250: EndIf   
   If x + w > desktopwidth: x - 250: Else: x + 250: EndIf

   ResizeWindow(#window, x, #PB_Ignore, w, #PB_Ignore)
   
   ResizeGadget(#liste, #PB_Ignore, #PB_Ignore, w+2, #PB_Ignore)
   SetGadgetItemAttribute(#liste, 0, #PB_ListIcon_ColumnWidth , w-19) ;Scrollbalken abziehen
   
   ResizeGadget(#liste2, #PB_Ignore, #PB_Ignore, w+2, #PB_Ignore)
   SetGadgetItemAttribute(#liste2, 0, #PB_ListIcon_ColumnWidth , w-19)
   
EndProcedure

Procedure ListeSort(pbnr, sortflag)
   
   Protected j, anz = CountGadgetItems(pbnr)-1
   
   If anz = -1: ProcedureReturn: EndIf ;Liste leer
   
   Dim text$(anz) 
   
   For j = 0 To anz
      text$(j) = GetGadgetItemText(pbnr, j)
   Next
   
   SortArray(text$(), sortflag | #PB_Sort_NoCase)
   
   For j = 0 To anz
      SetGadgetItemText(pbnr, j, text$(j))
   Next
      
EndProcedure

Procedure.i ListeSort1()
   
   Protected state = GetGadgetState(#liste) 
   Protected count = CountGadgetItems(#liste) 
   Protected j, i$ = GetGadgetItemText(#liste, state) 
   
   ListeSort(#liste, 0)
   
   For j = 0 To count-1
      If GetGadgetItemText(#liste, j) = i$
         SetGadgetState(#liste, j): Break
      EndIf
   Next
   
EndProcedure

Procedure.i ListeSort2(sortflag)   
      
   SetGadgetState(#buttonSort, 1)
   SetGadgetText(#buttonSort, "Sort " + Chr($2191))
   If sortflag
      SetGadgetText(#buttonSort, "Sort " + Chr($2193))
   EndIf   
   ListeSort(#liste2, sortflag): SetTextColor()
   
EndProcedure

Procedure ResetSort()      
   SetGadgetState(#buttonSort, 0)
   SetGadgetText(#buttonSort, "Sort")
   ProcedureReturn 1
EndProcedure

Procedure.i PrgVariablen(flag=0)  
   
   Protected ok = OpenPreferences(prfFile$, #PB_Preference_GroupSeparator)
   If ok = 0: CreatePreferences(prfFile$, #PB_Preference_GroupSeparator): EndIf
   
   If flag = 0         
      PreferenceGroup("Diverses")
      winx = ReadPreferenceInteger("winx", 800)
      winy = ReadPreferenceInteger("winy", 100)         
      lastfile_item = ReadPreferenceInteger("fileitem", 0) ;zuletzt geladene Datei
      
   ElseIf flag
      RemovePreferenceGroup("Diverses")
      PreferenceGroup("Diverses")
      WritePreferenceInteger("winx", WindowX(#window)) 
      WritePreferenceInteger("winy", WindowY(#window))         
      WritePreferenceInteger("fileitem", GetGadgetState(#liste))
      
   EndIf   
   ClosePreferences()   
   
EndProcedure

;- OpenWindow 

Define x,y,w,h

PrgVariablen()  

OpenWindow(#window, winx, winy, winwidth, winheight, version$, #PB_Window_Invisible|#PB_Window_MaximizeGadget|#PB_Window_MinimizeGadget)

ListIconGadget(#liste,  -1, -1, winwidth+2, winheight/3, "", winwidth-19, #PB_ListIcon_FullRowSelect|#PB_ListIcon_GridLines|#LVS_NOCOLUMNHEADER) 
ListIconGadget(#liste2, -1, winheight/3, winwidth+2, winheight/3*2-22, "", winwidth-19, #PB_ListIcon_FullRowSelect|#PB_ListIcon_GridLines) 

y = GadgetHeight(#liste) + GadgetHeight(#liste2) + 1 : w = 50
ButtonGadget(#buttonSize,   0, y, w, 22," Size ", #PB_Button_Toggle) : x + w + 5
ButtonGadget(#buttonSort,   x, y, w, 22," Sort ", #PB_Button_Toggle) : x + w + 5 
ButtonGadget(#buttonImport, x, y, w, 22,"Import") : x + w + 5
ButtonGadget(#buttonDelete, x, y, w, 22,"Delete") : x + w + 5
ButtonGadget(#buttonSticky, x, y, w, 22,"Sticky", #PB_Button_Toggle) : x + w + 5
ButtonGadget(#buttonPrgEnd, x, y+1, 34, 20,"End")
SetGadgetState(#buttonSticky, 1)

SetWindowTheme_(GadgetID(#liste), "explorer", 0)
SetWindowTheme_(GadgetID(#liste2), "explorer", 0)
SetGadgetColor(#liste, #PB_Gadget_BackColor, $DFFFFF)       ;Farbe nicht zu dunkel
SetGadgetColor(#liste2, #PB_Gadget_BackColor, $CFFFFF)      ;  beeinflußt Balkenfarbe in Liste

LoadImport(#liste, "Inhalt.txt")
SetGadgetState(#liste, lastfile_item)
PostEvent(#PB_Event_Gadget, #window, #liste, #PB_EventType_LeftClick) ;auf Liste oben clicken

HideWindow(#window, 0) : StickyWindow(#window, 1)  ;Fenster anzeigen + Sticky als Vorgabe 

Define purebasic_hwnd = GetHwnd_Purebasic()        ;Handle PB Fenster für Prog beenden siehe unten 
 
Define event, sticky = 1, size = 1, sort = 1
Define text$, importname$, anzahl, state, ok, jn

;- Event-Loop   
Repeat      
   event = WaitWindowEvent()   
   If event = #PB_Event_Gadget
      Select EventGadget() 
         Case #buttonSize:   size ! 1 : SizeHandler(size)            
         Case #buttonSort:   sort ! 1 : ListeSort1() : ListeSort2(sort) 
         Case #buttonSticky: sticky ! 1 : StickyWindow(#window, sticky)            
            
         Case #buttonDelete
            state = GetGadgetState(#liste) 
            If state <> -1
               importname$ = GetGadgetItemText(#liste, state)               
               jn = MessageRequester("Löschen", importname$ + " löschen ?", #PB_MessageRequester_YesNo)
               If jn = #PB_MessageRequester_Yes
                  RemoveGadgetItem(#liste, state)
                  ClearGadgetItems(#liste2)
                  SetGadgetItemText(#liste2, -1, "")
                  DeleteFile(importname$ + ".txt")
                  SaveImport(#liste, "Inhalt.txt") 
               EndIf
            EndIf

         Case #buttonImport   ;vom aktiven Scintilla IDE Panel            
            importname$ = InputRequester("Filename", "Eingabe Import Name:", importname$)            
            If importname$ 
               sort = ResetSort()
               anzahl = ImportProcedurLine(): SetTextColor()
               If anzahl 
                  importname$ = LTrim(importname$)
                  SetGadgetItemText(#liste2, -1, UCase(importname$))
                  ok = SaveImport(#liste2, importname$)
                  If ok
                     If CheckImportName(importname$)
                        AddGadgetItem(#liste, 0, importname$)
                        SetGadgetState(#liste, 0)
                        SaveImport(#liste, "Inhalt.txt")                        
                     EndIf
                  EndIf
               Else
                  MessageRequester("Information","no imports von " + importname$)
               EndIf
            EndIf
            
         Case #liste
            Select EventType() 
               Case #PB_EventType_LeftClick
                  state = GetGadgetState(#liste)
                  If state <> -1
                     importname$ = GetGadgetItemText(#liste, state) 
                     anzahl = LoadImport(#liste2, importname$)
                     If anzahl
                        SetTextColor()
                        SetGadgetItemText(#liste2, -1, UCase(importname$))
                     EndIf
                     sort = ResetSort()
                  EndIf 
               Case #PB_EventType_RightClick: SetGadgetState(#liste,-1)    
            EndSelect 
            
         Case #liste2            
            state = GetGadgetState(#liste2) 
            If state <> -1
               text$ = Trim(GetGadgetItemText(#liste2, state))               
               Select EventType() 
                  Case #PB_EventType_DragStart: DragText(text$) 
                  Case #PB_EventType_LeftClick: SetClipboardText(text$) 
                  Case #PB_EventType_RightClick: SetGadgetState(#liste,-1) 
               EndSelect
            EndIf
            
         Case #buttonPrgEnd: 
            SaveImport(#liste, "Inhalt.txt"): Break            
      EndSelect
   EndIf
   
   If IsWindow_(purebasic_hwnd) = 0 : Break : EndIf   ;wenn null=kein PB, dann Programm beenden      
Until Event = #PB_Event_CloseWindow

PrgVariablen(1) ;FensterPosi speichern

PS: Fehler gibt es immer wieder, her damit :D
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Benutzeravatar
dige
Beiträge: 1182
Registriert: 08.09.2004 08:53

Re: PB IDE Werkzeug ProzedurNamen auslesen (Scintilla)

Beitrag von dige »

Wie ist denn das Tool anzuwenden? Dachte mit Argument "%TEMPFILE", aber da kommt auch die Fehlermeldung..
"Papa, mein Wecker funktioniert nicht! Der weckert immer zu früh."
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Re: PB IDE Werkzeug ProzedurNamen auslesen (Scintilla)

Beitrag von hjbremer »

Wie ist denn das Tool anzuwenden? Dachte mit Argument "%TEMPFILE", aber da kommt auch die Fehlermeldung..
einfach starten,
ein Ide Panel wählen
Button Import drücken, Name eingeben
die ProcNamen werden von der Ide in die Liste geschrieben
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Antworten