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.