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