Seite 4 von 4

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

Verfasst: 21.08.2014 22:18
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.

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

Verfasst: 21.08.2014 23:09
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

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

Verfasst: 22.08.2015 11:42
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.