Screen-PosX von bestimmtem Zeichen, wenn Text Tabs enthält

  • Ich hab das ganze gerade auch noch mal ohne Regulaeren Ausdruck umgesetzt, da du die ja scheinbar nicht magst ;)

    _getLengthNoRegExp <== :thumbup::P

    Das Problem ist das Verbinden der einzigen Position, die von PSPad / VBScript zu bekommen ist (CaretX), mit der Position des ersten Funktionsnamen-Zeichens.

    Wow, ich habe überlegt und überlegt, wie ich das erklären kann. Zwischenzeitlich hat BugFix einen Beitrag geschrieben, der das richtig gut umreißt. :thumbup:

    Ich kriege halt nicht auf die Reihe, wie ich an die Position vom FuncNameFirstChar komme. Denn das übermittelte CaretX enthält auf für Tabs nur 1 Zeichen. Der FuncName kann z. B. mal an der Grenze eines 2er (oder 4er) Segments stehen, oder mitten drin, oder ... Ich kann ja nur von der CaretX-Pos zurückrechnen, und weiß aber nie, wo der Text-Part vom FuncName bis CaretX steht, als mitten in einem Segment, oder am Anfang, usw. Ich kann auch nicht die komplette Zeile z. B. mit deinem Code konvertieren zu einem Text, der die Tabs als Leerzeichen auffüllt, weil dann die CaretX-Pos nicht mehr stimmt.

    Die Umwandlung / Auffüllung der Tabs mit den fehlenden Leerzeichen funktioniert nur vom Zeilenanfang, die übermittelte CaretX-Pos ist quasi das Zeilenende. Und vom CaretX den Abstand zum FuncNameFirstChar zu berechnen geht auch nur vom CaretX rückwärts. =O:S *verwirrt*

    Bis ich das auf der Reihe habe, sage ich: Kanashius , vielen Dank für deine Mühe! :)  BugFix , vielen Dank für das verständliche Umreißen des komplizierten Themas "Tab, das böse Konstrukt!". :)

    Bernd.

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

  • Ich denke, ich hab das Problem groesstenteils in den Griff bekommen... Der Regulaere Ausdruck (um den ich jetzt nicht so wirklich drumherum gekommen bin, weils sonst echt komplex wird) scheint zu funktionieren.

    Die neue Funktion gibt -1 zurueck, wenn keine Funktion gefunden wurde, andernfalls wird der Funktionsname sowie die Anzahl Zeichen (mit Einbeziehung der Tabs) bis zu dem Funktionsnamen berechnet.

    Vllt. testet ihr den Ausdruck ja auch noch und findet noch Fehler, wobei das fixen etwas schwieriger sein duerfte :D

    Ich fueg auch mal wieder einen Screenshot an um die Funktionsweise besser darzustellen:

    Der Ausdruck scheint auch teilweise fuer Macros zu funktionieren... ein netter nebeneffekt :P

    MfG Kanashius

    PS: Sorry fuer die fehlenden Sonderzeichen der Deutschen Sprache, ich bin grad dabei auf US-Tastaturlayout umzusteigen und dort gibt es die Tasten nunmal nicht :D

  • Ich freue mich sehr über deinen Code, aber ich verstehe nicht ganz, wie er funktionieren soll.

    Hier mal ein Test-String, den ich für die Entwicklung vom CallTipViewer benutze. (ohne Tabs)

    AutoIt
    ; $testData="   Local $hGui = GUICreate(" MsgBox ( " & StringTrimRight(@ScriptName, StringLen(".exe")) & "  Demo", (2 * (3 + 1) + (10 * 10) * 4), 400, -1, -1, BitOR($WS_BORDER, $WS_CAPTION), $WS_EX_DLGMODALFRAME)"
    $testData='   Local $hGui = GUICreate(" MsgBox ( " & StringTrimRight(@ScriptName, StringLen(".exe")) & "  Demo", (2 * (3 + 1) + (10 * 10) * 4), 400, -1, -1, BitOR($WS_BORDER, $WS_CAPTION), $WS_EX_DLGMO'
    ; $testData='   Local $hGui = GUICreate(" MsgBox ( " & StringTrimRight(@ScriptName, StringLen(".exe")) & "  Demo", (2 * (3 + 1) + (10 * 10) * 4), 400, -1, -1, BitOR($WS_BORDER, $WS_CAPTION), '
    ; $testData='   Local $hGui = GUICreate(" MsgBox ( " & StringTrimRight(@ScriptName, StringLen(".exe")) & "  Demo", (2 * (3 + 1) + (10 * 10) * 4), 400, -1, -1, BitOR($WS_BORDER, $WS_CAPTION)'
    ; $testData='   Local $hGui = GUICreate(" MsgBox ( " & StringTrimRight(@ScriptName, StringLen(".exe")) & "  Demo", (2 * (3 + 1) + (10 * 10) * 4), 400, -1, -1, BitOR($WS_B'
    ; $testData='   Local $hGui = GUICreate(" MsgBox ( " & StringTrimRight(@ScriptName, StringLen(".exe")) & "  Demo", (2 * (3 + 1) + (10 * 10) * 4), 400, -1, -1, '
    ; $testData='   Local $hGui = GUICreate(" MsgBox ( " & StringTrimRight(@ScriptName, StringLen(".exe"))'

    Bernd.

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

  • Da fehlt eine Klammer hinter der Variable, ist das der Fehler?

    Nein, das ist beabsichtigt. Kanshius hat eine elegante Methode verwendet, um die CaretX-Pos zu simmulieren: Der Test-String wird einfach an der Stelle abgeschnitten, an der das Caret stehen soll. ;)

    Deswegen enthält mein oben gepostetes Test-String-Beispiel einfach immer den gleichen String, nur jeweils an anderer Stelle abgeschnitten.

    Bernd.

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

  • Na, er nimmt nur manchmal variablen/makros als funktionsnamen... da weiss ich nur nicht wie ich das verhindern soll.

    Das ist auch gut so! :evil: Da habe ich Wochen (Monate?) dran gearbeitet, bis das funktioniert hat. Wäre ja noch schöner, wenn du das in Minuten aus dem Ärmel schütteln würdest! 8o

    Bernd.

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

  • Leute, könnt ihr mir mal helfen? Ich weiß gerade nicht, ob selbst das Feature Request etwas hilft, um die Position von FuncNameFirstChar zu ermitteln.

    Sebst wenn ich die virtuelle Pos-X vom Caret habe, weiß ich einfach nicht, wie ich davon ausgehend die Pos-X vom ersten Zeichen des Funktionsnamens ermitteln kann. Es kann ja nicht festgestellt werden, wo genau die Tabs sitzen, und welche davon expandiert werden. Zur Veranschaulichung folgender Screenshot. Die rote Linie zeigt stellvertretend die Pos-X des Carets im Editor, die vom VBScript übermittelt wird. Wie man sieht, ist die virtuelle Pos-X bei allen gleich, die reale Pos-X unterschiedlich, und sogar die Pos-X des FuncNameFirstChar ist unterschiedlich. ... Mit Sicherheit habe ich seit gestern mindestens 1 graues Haar mehr bekommen. =O

    Bernd.

    Nachtrag: Ich habe Tabs noch nie so richtig gemocht, aber jetzt fange ich an, sie zu hassen! :cursing:

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

  • Hätte ich dieses "Problem", würde ich weniger Zeit investieren :)
    Hauptziel 1: Tooltip darstellen, Ziel 2: gerade aktuellen Parameter farblich hervorheben, Neben-Neben-Ziel: Schönheitsfragen.


    Als Basis für die Positionierung würde ich sauber formatierten Code heranziehen (in Scite das, was nach der Anwendung von Tidy rauskommt). Wenn der Benutzer fast unlesbaren Code produziert, dann hat er auch kein Problem mit nicht 100% perfekt positioniertem Tooltip ;)

  • Ich bin froh, dass du das schreibst, denn ich hab das genauso gesehen. Deshalb habe ich im PSPad Forum meinen Feature Request geändert, und der PSPad Autor hat zugesagt. Somit wird die korrekte Positionierung bei Text mit Tabs von meiner Seite auf Eis gelegt. Falls das Feature in PSPad eingebaut wird, kann ich das im CallTipViewer aufnehmen.

    Genauso habe ich auch das Thema mit der falschen Schriftgröße in Labels vorerst eingestellt. Mal sehen, ob das überhaupt jemand bemerkt. 8o

    Bernd.

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.