#1: 74 FPS
#3: 52 FPS
R7 3700X, RTX 2070 Super, 16GB RAM, W10 Pro x64
#1: 74 FPS
#3: 52 FPS
R7 3700X, RTX 2070 Super, 16GB RAM, W10 Pro x64
Ein CallTip ist das kleine Fensterchen im Editor, das die Syntax und -Beschreibung zur jeweiligen Funktion anzeigt. Ich vermute, du meinst die Syntax-Beschreibungen in der au3.api? Falls ja, um die geht es nicht.
Führst du denn deine Erweiterung als Skript aus und nicht am Ende als Exe? Wenn ja, dann spar dir auf jeden Fall die älteren Versionen, es macht da keinen Sinn noch irgendwas nachzuliefern, der Aufwand ist viel zu groß, der Nutzen viel zu klein.
Du müsstest verschiedene Versionen schreiben und dann mit einem Masterscript erstmal prüfen welche AutoIt-Version installiert ist und dann das entsprechende Skript ausführen. (Das Problem hättest du bei einem Kompilat übrigens nicht).
Die Calltips werden immer für die installierte Version mitgeliefert, das macht AutoIt von Haus aus so. Es gibt keine Unterstützung für ältere Versionen da du ja nur eine Instanz von AutoIt installiert haben kannst.
Dass man noch nebenher eine Beta parallel haben kann lassen wir mal außen vor.
Dein Calltip-Viewer sollte also ebenfalls die Standardfunktionen bereits geparst haben und sie nur noch aus einer Datei auslesen.
Und für das WinAPI-Problem gibts einen ganz einfachen Fix: Einfach nur WinAPI.au3 includen. Das wars.
Nur wie bekomme ich dann den bearbeiteten String wieder in den Originalstring.
Wie wärs denn wenn du den String replaced den du mit StringBetween rausgeparst hast ![]()
Was können denn die beliebigen Zeichen sein? Wenn du vorhersehen kannst was da steht könntest du doch auch einfach :", " mit :"- " StringReplacen.
Kann es nicht daran liegen, dass "Exit" keine Funktion sondern ein Keyword/Schlüsselwort der Sprache ist?
in der engl. Hilfe heißt es ja: "Calls a user-defined or built-in function ...". In der "Function Reference" von AutoIt taucht "Exit" aber nicht auf.Aus meiner Sicht daher kein Bug. Oder doch?
Korrekt, sonst könnte man ja auch Exit in ternären Operatoren direkt verwenden, klappt aber nicht.
In AutoIt wirds als Keyword behandelt, nicht als Funktion.
Mein problem ist nicht dass ich ein Puplikum brauche um meine XY-Ungelöst lebensgeschichte zu erzählen
Deutschland 2020 ein Land der klugen Köpfe die hinterfragen müssen wozu man etwas braucht bevor man eine Punktlieferung zustande bringt.
Wow, also wer so frech mit der Tür ins Haus fällt kann sich seine Hilfe woanders suchen. Tritt gefälligst mal auf die Bremse, das hier ist kein Selbstbedienungsladen.
Hier mal ein Test-String, den ich für die Entwicklung vom CallTipViewer benutze. (ohne Tabs)
Da fehlt eine Klammer hinter der Variable, ist das der Fehler?
Mal ganz blöd gefragt, gibt es eigentlich keine API-Funktion dafür? Der Editor zeigt doch unten sogar die echte Zeichenposition und die fake Zeichenposition an.
Es gibt soviele verschiedene Einstellungen für die Tab-Weite. Die Tab-Weite kann ich aus der PSPad.ini auslesen. Aber wie dann weiter? Da stehen ja nicht nur Leerzeichen, sondern jedes beliebige Zeichen kann die Entfernung bis zum nächsten Tab-Stop (heißt das so?) beeinflussen.
Wirf die Flinte nicht so schnell ins Korn.
Es ist schon sehr spät und mein Gehirn arbeitet nur noch notdürftig aber ich hab was ekelhaftes zusammenschustern können:
Gesucht ist die Position des As. Das soll das Caret sein, aber du kannst ja dann dementsprechend zurückrechnen.
Die Regexe sind alle ausgeschrieben und können ERHEBLICH reduziert werden, da sich dort viele Elemente wiederholen. (siehe Algorithmus unten)
Wenn ich das im Halbschlaf hinbekomme, dann kriegt doch ein kluges Köpfchen wie du, dass auch sauber und vernünftig hin.
Einfach mal überlegen was man beachten muss und das Problem ist einfacher als gedacht.
Tabs sind hier mit Ts ersetzt. Und Code so strukturiert, dass ich das mit StringInStr zurückgeben kann. Ist aber nicht notwendig, geht aber auch anders.
; Tabweite = 4 !!!
Local $aStrings[] = [ _
"T012" & "3456789A", _
"0T12" & "3456789A", _
"01T2" & "3456789A", _
"012T" & "3456789A", _
"TT01" & "23456789A", _
"T0T1" & "23456789A", _
"T01T" & "23456789A", _
"0TT1" & "23456789A", _
"0T1T" & "23456789A", _
"01TT" & "23456789A", _
"TTT0" & "123456789A", _
"T0TT" & "123456789A", _
"TT0T" & "123456789A", _
"0TTT" & "123456789A", _
"TTTT" & "123456789A", _
"0000" & "0123456789A" _
]
For $i = 0 To UBound($aStrings) - 1
ConsoleWrite($aStrings[$i] & ":" & StringInStr($aStrings[$i], "A") & "(" & RechneDieVerrueckteDistanzZumAHerausAuchWennEsKomplizierterKlingtAlsEsTatsaechlichIst($aStrings[$i]) & ")" & @CRLF)
Next
Func RechneDieVerrueckteDistanzZumAHerausAuchWennEsKomplizierterKlingtAlsEsTatsaechlichIst($sZeile)
Local $sNeueZeile = ""
For $i = 1 To StringLen($sZeile) Step 4
Local $sSegment = StringMid($sZeile, $i, 4)
If StringLen($sSegment) = 1 Then $sSegment &= "000"
If StringLen($sSegment) = 2 Then $sSegment &= "00"
If StringLen($sSegment) = 3 Then $sSegment &= "0"
If StringRegExp($sSegment, "T[^T][^T][^T]") Then $sNeueZeile &= "0000" & StringMid($sSegment, 2, 3)
If StringRegExp($sSegment, "[^T]T[^T][^T]") Then $sNeueZeile &= StringMid($sSegment, 1, 1) & "000" & StringMid($sSegment, 3, 2)
If StringRegExp($sSegment, "[^T][^T]T[^T]") Then $sNeueZeile &= StringMid($sSegment, 1, 2) & "00" & StringMid($sSegment, 4, 1)
If StringRegExp($sSegment, "[^T][^T][^T]T") Then $sNeueZeile &= StringMid($sSegment, 1, 3) & "0"
If StringRegExp($sSegment, "TT[^T][^T]") Then $sNeueZeile &= "0000" & "0000" & StringMid($sSegment, 3, 2)
If StringRegExp($sSegment, "T[^T]T[^T]") Then $sNeueZeile &= "000" & StringMid($sSegment, 2, 1) & "000" & StringMid($sSegment, 4, 1)
If StringRegExp($sSegment, "T[^T][^T]T") Then $sNeueZeile &= "0000" & StringMid($sSegment, 2, 1) & StringMid($sSegment, 3, 1) & "000"
If StringRegExp($sSegment, "[^T]TT[^T]") Then $sNeueZeile &= StringMid($sSegment, 1, 1) & "000" & "0000" & StringMid($sSegment, 4, 1)
If StringRegExp($sSegment, "[^T]T[^T]T") Then $sNeueZeile &= StringMid($sSegment, 1, 1) & "000" & StringMid($sSegment, 3, 1) & "000"
If StringRegExp($sSegment, "[^T][^T]TT") Then $sNeueZeile &= StringMid($sSegment, 1, 2) & "00" & "0000"
If StringRegExp($sSegment, "TTT[^T]") Then $sNeueZeile &= "0000" & "0000" & "0000" & StringMid($sSegment, 4, 1)
If StringRegExp($sSegment, "T[^T]TT") Then $sNeueZeile &= "0000" & StringMid($sSegment, 2, 1) & "000" & "0000"
If StringRegExp($sSegment, "TT[^T]T") Then $sNeueZeile &= "0000" & "0000" & StringMid($sSegment, 3, 1) & "000"
If StringRegExp($sSegment, "[^T]TTT") Then $sNeueZeile &= StringMid($sSegment, 1, 1) & "000" & "0000" & "0000"
If StringRegExp($sSegment, "TTTT") Then $sNeueZeile &= "0000" & "0000" & "0000" & "0000"
If StringRegExp($sSegment, "[^T][^T][^T][^T]") Then $sNeueZeile &= $sSegment
Next
Return StringInStr($sNeueZeile, "A")
EndFunc
Alles anzeigen
Du kannst dir auch einen einfachen Algorithmus zusammenbasteln, der ist dann etwas platzsparender:
Betrachte ein Textsegment von der Länge 4 (Tabweite).
Tab => 4
A B C D => 4
A Tab BC => 4 + 2 (A fällt weg)
A B Tab C => 4 + 1 (A B fallen weg)
A B C Tab => 4 (A B C fallen weg)
Und das ganze wiederholst du dann einfach immer wieder.
Ein Tab füllt es ja bis zum nächsten 4er Segment auf, deshalb musst du da nichts mitschleppen sondern kannst von dort aus einfach neu draufzählen.
Im Grunde musst du nur den String durchlaufen und prüfen in welchem Teil des Segmentes du gerade bist und je nach Tab dann entsprechend mitzählen.
Vielleicht seh ich mir das morgen nochmal an, aber jez gehts erstmal in die heia
Das solltest du doch trotzdem dementsprechend berechen können. Zwei Leerzeichen + Tab = 1 Tab.
Es würde doch reichen Gruppen an x Zeichen zu parsen (x = Tabweite) und die dann einzeln auszurechnen je nachdem was drin ist.
Stehe gerade auf dem Schlauch, kannst du das mal übersetzen?
War wohl geistig abwesend. Hab das falsche dazu zitiert.
Genau so mache ich es, und genau da tauchen die Probleme mit Tabs auf. Im Text ist 1 Tab = 1 Zeichen, aber der Editor interpretiert jenach Einstellung entsprechend viele virtuelle Leerzeichen. Aber die virtuellen Leerzeichen sind in der Tat nicht echt, der Editor zieht die Darstellung für 1 Tab auf die eingestellte Länge, aber es ist und bleibt 1 Zeichen. Deshalb funktioniert die genannte Zurückrechnung nicht.
Kannst du die Einstellung nicht einfach auslesen? Wenn ein Tab 4 Leerzeichen sind verrechnest du das einfach damit. Ich schätze man wird auch die Tablänge einstellen können, und wenn man das einstellen kann, kann man die Einstellung auch sicherlich auslesen.
In PSPad kann ich mir die Pixel / Screen-Koordinaten ausgeben lassen, an der das Caret steht. So erhalte ich z. B. die X-Position vom "a" in "Hallo" (siehe Postint #1). Nun könnte ich im Au3 die Pos vom ersten FuncName-Char ermitteln, das Caret in PSPad verschieben, die gewünschte X-Pos auslesen und das Caret zurücksetzen.
Naja nicht unbedingt oder. Wann wird das Calltiperzeugt? Wenn du den Namen der Funktion getippt hast und dann die Klammer öffnest (die optionalen Leerzeichen dazwischen sind mal dahintegestellt...).
Da JEDER Programmierer, der kein absoluter Sozipath ist, monospace Schriftarten verwendet, brauchst du doch nur die Breite eines Zeichens zu ermitteln und einfach die Länge des Funktionsnamens * BreiteZeichen zurückzurechnen. Das Caret steht ja am (
Kannst du dir in PSPad nicht die Pixel-Koordinate (nicht Zeichen-koordinate) des Zeichens innerhalb des Editcontrols ausgeben lassen?
Ich glaube das dürfte dort mit Tabs aber auch nicht hinhauen, aber ich glaube du sägst am falschen Ast.
Was willst du denn erreichen wenn du die Position hast? Was ist das eigentlich Problem?
Wie kann man die X-Pos vom "M" in "MsgBox ermitteln, wenn Tabs im Text sind?
Gibts da nicht was mit GDI+ um Texte zu measuren?
Hehe, da hast du völlig recht. Ich hatte da noch irgendeinen anderen Gedanken im Kopf, der es nötig machte die Schleife kpl. zu durchlaufen. Der Gedanke verflog - aber das Konstrukt blieb.
Jetzt musst du nur noch die $bExists Variable wegschmeißen!
Alles anzeigenFor $i = 0 To UBound($aAccelerators) -1
If $aAccelerators[$i][0] = $_HotKey Then
$bExists = True
ExitLoop
EndIf
Next
If $bExists Then Return SetError(1,0,0)
Da sieht man mal wieder ein Standardkonstrukt ![]()
Bool vor der Schleife erzeugen, in der Schleife prüfen und dann rausspringen und später prüfen wofür man es braucht.
Du hättest hier ruhig das $bExists komplett weglassen können und einfach direkt aus der Funktion returnen können wenn du deine Funktion so eng zusammenstauchst, du verwendest es später ja nicht mehr. Aber gut, Stilsache.
Ich würde dir vielleicht noch raten dich an die Namenskonvention zu halten, damit das ein wenig deckungsgleich mit UDFs ist.
_GUIDummy_CreateWithAccelerator() oder sowas.
Diesmal habe ich mal NICHT vorher recherchiert, sondern frage erstmal hier.
Du Frevel, wenn ich das hier nochmal sehe dann gibts was auf die Finger.
Ich hab deinen Post gelesen, aber ich sehe nirgends ein Fragezeichen. Was ist denn deine Frage?
LibreOffice mit AutoIt zu vergleichen ist etwas unpraktisch, denn viele Software benutzen nicht die Standardfont bzw. irgendwas standardmäßiges von Windows wenn sie ihre GUI erzeugen. Siehe Chrome, Steam, Skype, TeamViewer.
Es kann auch noch sein, dass du einige Optionen im LibreOffice Dokument hast die die Schriftart etwas modifizieren: Zoom, DPI und dergleichen.
Wenn du ganz sicher gehen willst, dass es nicht AutoIts Schuld ist, dann nehm direkt die WinAPI-Funktionen um Schriftarten zu erzeugen und zeichne sie so auf deine GUI.
Du kannst im Case angeben von wo bis wohin das greifen soll. Da AutoIt intern alle Controls aufsteigend durchnummeriert kannst du dir das zu nutze machen, wenn du die TreeViews alle hintereinander erzeugst.
Anschließend musst du dem GetText nur noch das selektierte Item übergeben, und das findest du ebenfalls mit der entsprechenden Funktion raus.
#include <GUIConstantsEx.au3>
#include <MsgBoxConstants.au3>
#include <StaticConstants.au3>
#include <TreeViewConstants.au3>
#include <GUITreeView.au3>
#include <WindowsConstants.au3>
Example_Tree()
Func Example_Tree()
GUICreate("My test treeview GUI", 350, 210)
Local $idTreeview = GUICtrlCreateTreeView(5, 5, 340, 200)
Local $idTreeview1 = GUICtrlCreateTreeViewItem("#1",$idTreeview)
Local $idTreeview2 = GUICtrlCreateTreeViewItem("#2",$idTreeview)
Local $idTreeview3 = GUICtrlCreateTreeViewItem("#3",$idTreeview)
Local $idTreeviewArray[4]
$idTreeviewArray[0] = GUICtrlCreateTreeViewItem("#1.1",$idTreeview1)
$idTreeviewArray[1] = GUICtrlCreateTreeViewItem("#1.2",$idTreeview1)
$idTreeviewArray[2] = GUICtrlCreateTreeViewItem("#2.1",$idTreeview2)
$idTreeviewArray[3] = GUICtrlCreateTreeViewItem("#2.2",$idTreeview2)
GUICtrlSetState($idTreeview2, BitOR($GUI_EXPAND, $GUI_DEFBUTTON))
GUISetState(@SW_SHOW)
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
ExitLoop
Case $idTreeview1 To $idTreeviewArray[3]
MsgBox(0,"you pressed",_GUICtrlTreeView_GetText($idTreeview, _GUICtrlTreeView_GetSelection($idTreeview)))
EndSwitch
WEnd
EndFunc
Alles anzeigen