PB-Tool: Namen der aktuellen Procedure ausgeben lassen

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
HeX0R
Beiträge: 2959
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Re: PB-Tool: Namen der aktuellen Procedure ausgeben lassen

Beitrag von HeX0R »

Ich hab damit mal ein bisschen gespielt.
Unter Win wird die Prozedur in der Liste markiert, bei den anderen OS kommt der Messagerequester.

Allerdings wird nicht "unmarkiert", falls man sich in keiner Prozedur befindet.

Code: Alles auswählen

; GetProcedureName

; #################################################################
; In den Werkzeug-Einstellungen als Argumente "%TEMPFILE" eintragen
; #################################################################

EnableExplicit

Procedure.s RemoveLeadingWhitespaceFromString(InString.s)
	
	While Left(InString, 1) = Chr(32) Or Left(InString, 1) = Chr(9)
		InString = LTrim(InString, Chr(32))
		InString = LTrim(InString, Chr(9))
	Wend
	
	ProcedureReturn InString
	
EndProcedure

Procedure.s GetScintillaText()
	
	; thx to sicro (http://www.purebasic.fr/german/viewtopic.php?p=324916#p324916)
	
	Protected ReturnValue.s
	Protected FilePath.s
	Protected File, BOM
	
	FilePath = ProgramParameter(0) ; %TEMPFILE (Datei existiert auch, wenn Code nicht gespeichert ist)
	
	File = ReadFile(#PB_Any, FilePath, #PB_File_SharedRead)
	If IsFile(File)
		BOM = ReadStringFormat(File) ; BOM überspringen, wenn vorhanden
		ReturnValue = ReadString(File, #PB_File_IgnoreEOL | BOM)
		CloseFile(File)
	EndIf
	
	ProcedureReturn ReturnValue
	
EndProcedure

CompilerIf #PB_Compiler_OS = #PB_OS_Windows
	Procedure EnumChildProc(hWnd, *lParam)
		Protected CName.s{128}, Count, i, Size, Buffer.s, searchfull
		
		GetClassName_(hWnd, @CName, 128)
		If CName = "ListBox"
			Count = SendMessage_(hWnd, #LB_GETCOUNT, #Null, #Null)
			For i = 0 To Count - 1
				Size   = SendMessage_(hWnd, #LB_GETTEXTLEN, i, #Null)
				Buffer = Space(Size)
				If SendMessage_(hWnd, #LB_GETTEXT, i, @Buffer)
					If searchfull = 0
						;check if parameters are shown in listview
						If FindString(Buffer, "(")
							searchfull = 1
						Else
							searchfull = -1
						EndIf
					EndIf
					If searchfull = 1
						If PeekS(*lParam) = Buffer
							SendMessage_(hWnd, #LB_SETCURSEL, i, #Null)
							ProcedureReturn #False
						EndIf
					ElseIf FindString(PeekS(*lParam), Buffer)
						SendMessage_(hWnd, #LB_SETCURSEL, i, #Null)
						ProcedureReturn #False
					EndIf
				EndIf
			Next i
		EndIf
		
		ProcedureReturn #True
	EndProcedure
CompilerEndIf


Procedure ShowIt(Line.s)
	Protected hwnd, s.s, i

	CompilerSelect #PB_Compiler_OS
		CompilerCase #PB_OS_Windows
			hwnd = Val(GetEnvironmentVariable("PB_TOOL_MainWindow"))
			i    = FindString(Line, " ")
			If i = 0
				i = FindString(Line, #TAB$)
			EndIf
			Line = Mid(Line, i + 1)
			Line = RemoveLeadingWhitespaceFromString(Line)
			EnumChildWindows_(hWnd, @EnumChildProc(), @Line)
			
			
		CompilerDefault
			;Linux / Mac?
			MessageRequester("You are here:", Line)
	CompilerEndSelect
	
	
EndProcedure

Define ScintillaText.s
Define CursorLine = Val(StringField(GetEnvironmentVariable("PB_TOOL_Cursor"), 1, "x"))
Define Line.s
Define LineCounter

ScintillaText = GetScintillaText()

CompilerSelect #PB_Compiler_OS
	CompilerCase #PB_OS_Windows
		#LineFeed = #CRLF$
	CompilerDefault
		#LineFeed = #LF$
CompilerEndSelect

If ScintillaText <> ""
	
	For LineCounter = CursorLine - 1 To 1 Step - 1
		
		Line = RemoveLeadingWhitespaceFromString(StringField(ScintillaText, LineCounter, #LineFeed))
		
		If Left(LCase(Line), Len("endprocedure")) = "endprocedure"
			Break
		EndIf
		
		If Left(LCase(Line), Len("procedure")) = "procedure"
			If Left(LCase(Line), Len("procedurereturn")) <> "procedurereturn"
				ShowIt(Line)
				Break
			EndIf
		EndIf
		
	Next
	
EndIf
Könnte man noch verfeinern...
Z.B. trotzdem den Messagerequester abfeuern, wenn ein User die Prozedurliste gar nicht aktiviert hat.
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

Re: PB-Tool: Namen der aktuellen Procedure ausgeben lassen

Beitrag von ts-soft »

RSBasic hat geschrieben:Man könnte auch den anderen Code verwenden, aber im Enum-Code muss aber auf jeden Fall besser abgefragt werden, weil sonst passieren kann, dass er die falsche ListBox nimmt.
Abgesehen von der SideBar gibt es nur eine ListBox und die SideBar wird erst später abgefragt, da später erstellt.
Die Abfrage sollte also sicher sein solange nichts grundlegendes von Freak geändert wird. Jedenfalls ist sie unabhängig
davon in welchem Container sich das Gadget befindet.

Es wird immer die erste ListBox zuerst gefunden, auch wenn dieses Ausgeblendet ist.

Gruß
Thomas
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
Sicro
Beiträge: 955
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: PB-Tool: Namen der aktuellen Procedure ausgeben lassen

Beitrag von Sicro »

Kiffi hat geschrieben:Aus diesem Grund hier folgender Code (Windows only) [...]
Kannst du das bitte noch korrigieren? Das Tool ist ja inzwischen OS-unabhängig.
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Antworten