Re: PB-Tool: Namen der aktuellen Procedure ausgeben lassen
Verfasst: 21.08.2014 22:18
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.
Könnte man noch verfeinern...
Z.B. trotzdem den Messagerequester abfeuern, wenn ein User die Prozedurliste gar nicht aktiviert hat.
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.