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
Z.B. trotzdem den Messagerequester abfeuern, wenn ein User die Prozedurliste gar nicht aktiviert hat.

