diff --git a/AHKL_ChangeLog.htm b/AHKL_ChangeLog.htm index bca6ce36..99abaf1f 100644 --- a/AHKL_ChangeLog.htm +++ b/AHKL_ChangeLog.htm @@ -15,6 +15,14 @@

Änderungen und neue Features

Ältere Änderungen können in Archivierte Änderungen gefunden werden.

+

1.1.24.01 - 2. August 2016

+

Geändert: Hotkey, If, Ausdruck löst nun einen Fehler aus, wenn der nicht-dokumentierte dritte Parameter benutzt wird.

+

Behoben: &&, || und der ternäre Operator geben nun jedes Objekt frei, das als Bedingung benutzt wurde, wie bei if (a.Unterobjekt && b).

+

Behoben: Gui/GuiControl konnte Radio-Buttons innerhalb eines Tab3-Steuerelements nicht markieren.

+

Behoben: FileCreateShortcut's Verknüpfung-Parameter kann in Windows 10 absofort einen relativen Pfad enthalten.

+

Behoben: Ein Tab3-Steuerelement mit aktivierter Theme-Option wird die benutzerdefinierte Farbe seiner Steuerelemente nicht länger überschreiben.

+

Behoben: Der Debugger behandelte Ablaufsteuerungsbefehle in einigen bestimmten Fällen nicht korrekt.

+

1.1.24.00 - 22. Mai 2016

Gravierende Änderungen:

Der Versuch, eine leere Variable oder einen Ausdruck, der zu einem leeren Wert führt, an SetTimer's Label-Parameter zu übergeben, wird absofort als Fehler eingestuft. Dieser Parameter darf weder leer sein noch fehlen.

@@ -541,7 +549,7 @@

1.1.07.01 - 2. März 2012

Behoben: Dynamische Funktionsaufrufe mit Built-in-Variablen wie z. B. %A_ThisLabel%().

1.1.07.00 - 27. Februar 2012

-

Verbessert: %var%() unterstützt nun Funktionsverweise, Funktion-nachahmende Objekte und die __Call-Meta-Standardfunktion.

+

Verbessert: %var%() unterstützt nun Funktionsobjekte und die __Call-Meta-Standardfunktion.

Behoben: ControlGet List funktioniert nun bei ListViews, wenn das Skript und der Zielprozess nicht im 32-Bit-Format sind, oder alle beide im 64-Bit-Format sind.

Behoben: SendEvent mit einer Tastenverzögerung von 0; eine Änderung, die in v1.1.05.04 eigenführt wurde, bewirkte, dass SendEvent langsamer war, als gedacht.

Behoben: Object.Remove(i) passte die Keys nicht an, wenn Object[i] nicht existierte.

diff --git a/AutoHotkey.htm b/AutoHotkey.htm index 7efab693..1ac4bfcf 100644 --- a/AutoHotkey.htm +++ b/AutoHotkey.htm @@ -11,7 +11,7 @@ -

Version v1.1.24.00

+

Version v1.1.24.01

Eine deutsche Übersetzung von https://autohotkey.com/docs/ (siehe hier für mehr Details).

©2003-2014 Chris Mallett, und zum Teil ©AutoIt-Team und die AHK-Community

Software-Lizenz: GNU General Public License

diff --git a/ChangeLogHelp.htm b/ChangeLogHelp.htm index 76a6d5e9..bed7d761 100644 --- a/ChangeLogHelp.htm +++ b/ChangeLogHelp.htm @@ -86,7 +86,7 @@

1.0.47.05 - 21. November 2007

Hinzugefügt: GUI-Steuerelement "Tab2" behebt im originalen "Tab"-Steuerelement seltene Probleme beim Neuzeichnen (z. B. beim Aktivieren eines GUI-Fensters durch Anklicken der Scrollleiste eines Steuerelements). Das originale Tab-Steuerelement wird aufgrund der Abwärtskompatibilität beibehalten, weil "Tab2" das Tab-Steuerelement erst einfügen wird, wenn es Steuerelemente in Navigationsreihenfolge der TAB-Taste enthält. [Danke an Xander]

1.0.47.04 - 28. August 2007

Behoben: Up-Tasten-Hotkeys wie a up:: blockieren nicht länger das Drücken der A-Taste, sofern die #IfWin-Kriterien des Hotkeys nicht erfüllt sind. [Danke an Roland]

-

Behoben: Round(Var, NegativeZahl) ging in einigen Fällen um 1 zurück. [Danke an Icarus]

+

Behoben: Round(Var, NegativeZahl) ging in einigen Fällen um 1 zurück. [Danke an Icarus]

Behoben: Es wird nicht länger ein Absturz verursacht, wenn ein Syntaxfehler erfolgt, der aus einer verwaisten IF-Anweisung besteht (fehlerhaft seit 1.0.47.00). [Danke an msgbox vom deutschen Forum]

Entfernt: Fehlermeldung "GetClipboardData". Stattdessen wird eine leere Zeichenkette abgerufen, wenn die Daten innerhalb der #ClipboardTimeout-Periode nicht zugreifbar sind. [Danke an ManaUser & Sean]

Geändert: GUI-CheckBoxen und -Radio-Buttons verwenden nun standardmäßig "keinen Zeilenumbruch", wenn keine Breite, Höhe oder CR/LF-Zeichen angegeben sind. Dadurch werden Anzeigeprobleme bei ungewöhnlichen DPI-Einstellungen gelöst. [Danke an Boskoop]

diff --git a/Functions.htm b/Functions.htm index 4cdafcc8..5fd419ba 100644 --- a/Functions.htm +++ b/Functions.htm @@ -219,7 +219,7 @@

Mehr über lokale und globale Variablen

Oft auftretende Verwechslungsgefahr: Jeder nicht-dynamische Verweis auf eine Variable erstellt diese Variable in dem Moment, wo das Skript gestartet wird. Zum Beispiel: Außerhalb einer Funktion würde MsgBox %Array1% die Array1-Variable als globale Variable erstellen, in dem Moment, wo das Skript gestartet wird. Innerhalb einer Funktion würde MsgBox %Array1% die Array1-Variable als lokale Variable erstellen, in dem Moment, wo das Skript gestartet wird (solange der global-behandelnder Modus nicht aktiv ist), selbst wenn Array und Array0 als global deklariert sind.

Dynamisches Aufrufen einer Funktion

Seit v1.0.47.06 kann eine Funktion (auch eine Built-in-Funktion) mithilfe von Prozentzeichen dynamisch aufgerufen werden. Zum Beispiel würde %Var%(x, "Fuchs") die Funktion aufrufen, deren Name in Var enthalten ist. Ebenso würde Funktion%A_Index%() Funktion1(), Funktion2() und so weiter aufrufen, abhängig vom aktuellen Wert in A_Index.

-

Seit v1.1.07.00 kann Var in %Var%() einen Funktionsnamen, Funktionsverweis oder ein Funktion-nachahmendes Objekt enthalten. Falls die Funktion nicht existiert, wird stattdessen die __Call-Meta-Funktion des Standard-base-Objekts aufgerufen.

+

Seit v1.1.07.00 kann Var in %Var%() einen Funktionsnamen oder ein Funktionsobjekt enthalten. Falls die Funktion nicht existiert, wird stattdessen die __Call-Meta-Funktion des Standard-base-Objekts aufgerufen.

Kann die Funktion aufgrund einer der unten genannten Gründe nicht aufgerufen werden, stoppt die Auswertung des Ausdrucks, der den Aufruf enthält, vorzeitig ohne Meldung, was zu widersprüchlichen Ergebnissen führen könnte:

Erweiterte Grundlagen

@@ -193,7 +194,7 @@

Funktionsverweise [v1.1.00+]; Ruft jede Funktion auf und übergibt "foo" als Parameter: Loop 2 - array[A_Index].("foo") + array[A_Index].Call("foo") ; Ruft jede Funktion auf und übergibt indirekt das Array selbst als Parameter: Loop 2 @@ -308,7 +309,7 @@

Methoden

} -

Innerhalb einer Methode kann das Pseudo-Schlüsselwort base verwendet werden, um auf Super-Klassen-Versionen von Methoden zugreifen zu können, oder auf Eigenschaften, die in einer abgeleiteten Klasse überschrieben werden. Zum Beispiel würde base.Methode(), wenn man es in der Klasse oben definiert, eine Version von Methode aufrufen, die über BaseKlassenname definiert wurde. Meta-Funktionen werden nicht aufgerufen; ansonsten verhält sich base.Methode() wie BaseKlassenname.Methode.(this). Das heißt,

+

Innerhalb einer Methode kann das Pseudo-Schlüsselwort base verwendet werden, um auf Super-Klassen-Versionen von Methoden zugreifen zu können, oder auf Eigenschaften, die in einer abgeleiteten Klasse überschrieben werden. Zum Beispiel würde base.Methode(), wenn man es in der Klasse oben definiert, eine Version von Methode aufrufen, die über BaseKlassenname definiert wurde. Meta-Funktionen werden nicht aufgerufen; ansonsten verhält sich base.Methode() wie BaseKlassenname.Methode.Call(this). Das heißt,

Wenn eine Meta-Funktion einen passenden Key im Objekt beinhaltet, aber keinen return verwendet, ist das Verhalten das gleiche wie, als wäre der Key bereits zu Beginn im Objekt da gewesen. Um zu erfahren, wie __Set funktioniert, siehe Mehrdimensionale Arrays bei Unterklassen.

Wenn die Operation immer noch nicht behandelt wurde, überprüfe, ob es eine Built-in-Methode oder -Eigenschaft ist:

@@ -405,9 +406,11 @@

Meta-Funktionen

Dynamische Eigenschaften

-

Mit __Get und __Set können Eigenschaften implementiert werden, deren Werte auf irgendeiner Weise berechnet oder beschränkt sind. Zum Beispiel können sie verwendet werden, um ein "Farbe"-Objekt mit R, G, B und RGB-Eigenschaften zu implementieren, wo tatsächlich nur der RGB-Wert gespeichert wird:

+

Mit der Eigenschaftssyntax können Eigenschaften definiert werden, die jedes Mal, wenn sie ausgewertet werden, einen Wert berechnen, aber jede Eigenschaft muss im Voraus bekannt und einzeln im Skript definiert sein. Mit __Get und __Set können hingegen Eigenschaften implementiert werden, die das Skript nicht vorher kennen muss.

+

Zum Beispiel könnte man ein "Proxy"-Objekt erstellen, das Eigenschaften über das Netzwerk (oder über einen beliebig anderen Kanal) anfordern könnte. Ein Remote-Server würde dann mit dem Wert von der Eigenschaft antworten, den das Proxy-Objekt dann an seinen Aufrufer weiterleiten könnte. Auch wenn der Name jeder Eigenschaft im Voraus bekannt war, wäre es unlogisch, jede Eigenschaft einzeln in der Proxy-Klasse zu definieren, da jede Eigenschaft dasselbe tun würde (einen Netzwerk-Request senden). Meta-Funktionen erhalten die Eigenschaftsnamen als Parameter und wären daher eine gute Lösung für dieses Problem.

+

Eine weitere Verwendungsmöglichkeit von __Get und __Set wäre es, eine Reihe von verwandten Eigenschaften zu implementieren, die Code unter sich aufteilen. In dem Beispiel unten werden sie verwendet, um ein "Farbe"-Objekt mit R, G, B und RGB-Eigenschaften zu implementieren, wo tatsächlich nur der RGB-Wert gespeichert wird:

rot := new Farbe(0xff0000), rot.R -= 5
-cyan := new Farbe(0x00ffff)
+cyan := new Farbe(0), cyan.G := 255, cyan.B := 255
 
 MsgBox % "rot: " rot.R "," rot.G "," rot.B " = " rot.RGB
 MsgBox % "cyan: " cyan.R "," cyan.G "," cyan.B " = " cyan.RGB
@@ -419,74 +422,59 @@ 

Dynamische Eigenschaften

this.RGB := aRGB } + static Verschiebung := {R:16, G:8, B:0} + __Get(aName) { - if (aName = "R") - return (this.RGB >> 16) & 255 - if (aName = "G") - return (this.RGB >> 8) & 255 - if (aName = "B") - return this.RGB & 255 + ; HINWEIS: this.Verschiebung würde hier eine Endlosschleife erzeugen! + Verschiebung := Farbe.Verschiebung[aName] ; Ermittelt die Anzahl der zu verschiebenden Bits. + if (Verschiebung != "") ; Ist sie eine bekannte Eigenschaft? + return (this.RGB >> Verschiebung) & 0xff + ; HINWEIS: Ein 'return' hier würde this.RGB kaputtmachen. } __Set(aName, aWert) { - if aName in R,G,B + if ((Verschiebung := Farbe.Verschiebung[aName]) != "") { - aWert &= 255 + aWert &= 255 ; Kürzt es auf eine geeignete Länge. - if (aName = "R") - this.RGB := (aWert << 16) | (this.RGB & ~0xff0000) - else if (aName = "G") - this.RGB := (aWert << 8) | (this.RGB & ~0x00ff00) - else ; (aName = "B") - this.RGB := aWert | (this.RGB & ~0x0000ff) + ; Errechnet und speichert den neuen RGB-Wert. + this.RGB := (aWert << Verschiebung) | (this.RGB & ~(0xff << Verschiebung)) - ; 'Return' muss verwendet werden, um zu kennzeichnen, dass kein neues Key-Value-Paar erstellt werden sollte. - ; Dies definiert auch, was in 'x' von 'x := clr[name] := val' gespeichert werden soll: + ; 'Return' ist notwendig, um die Erstellung eines neuen Key-Value-Paares zu verhindern. + ; Dies bestimmt auch, was in dem 'x' in 'x := clr[name] := val' gespeichert wird: return aWert } + ; HINWEIS: Ein 'return' hier würde this._RGB und this.RGB kaputtmachen. + } + + ; Meta-Funktionen können mit Eigenschaften vermischt werden: + RGB { + get { + ; Als Hex-Wert zurückgeben: + return format("0x{:06x}", this._RGB) + } + set { + return this._RGB := value + } } }
+

In diesem Fall hätte man stattdessen die Eigenschaftssyntax verwenden können, wo Code untereinander aufgeteilt werden kann, indem man jede Eigenschaft eine zentrale Methode aufrufen lässt. Meta-Funktionen sollte man wenn möglich vermeiden, da ein hohes Risiko besteht, dass sie falsch verwendet werden (siehe die roten Hinweise oben).

Objekte als Funktionen

-

Wenn ein Aufruf wie obj.func(param) erfolgt, könnte obj.func einen Funktionsnamen oder ein Objekt enthalten. Enthält obj.func ein Objekt, wird dieses Objekt mit obj aufgerufen, anstatt mit dem Methodennamen wie in (obj.func)[obj](). Da in den meisten Fällen obj.func[obj] nicht vorhanden ist, wird stattdessen die __Call-Meta-Funktion von obj.func aufgerufen. Damit könnte man das Verhalten der Funktionsaufrufe auf einer abstrakten Weise ändern, wie es im folgenden Beispiel gezeigt wird:

-
; Erstellt ein Prototyp für ein Array mit Funktionen.
-FuncArrayType := {__Call: "FuncType_Call"}
-; Erstellt ein Array mit Funktionen.
-funcArray := {1: "Eins", 2: "Zwei", base: FuncArrayType}
-; Erstellt ein Objekt, das das Array als Methode verwendet.
-obj := {func: funcArray}
-; Ruft die Methode auf.
-obj.func("foo", "bar")
-
-FuncType_Call(func, obj, params*)
-{
-    ; Ruft eine Liste mit Funktionen auf.
-    Loop % ObjMaxIndex(func)
-        func[A_Index](params*)
-}
-
-Eins(param1, param2) {
-    ListVars
-    Pause
-}
-Zwei(param1, param2) {
-    ListVars
-    Pause
-}
-

Mit dieser Technik kann ein Objekt erstellt werden, das als Meta-Funktion fungiert, um z. B. dynamische Eigenschaften zu definieren, ähnlich wie die im vorherigen Abschnitt. (Beachte allerdings, dass dieses Beispiel durch die Unterstützung von Eigenschaften ersetzt wurde.) Zum Beispiel:

+

Siehe Funktionsobjekte, wie Objekte erstellt werden können, die sich wie Funktionen verhalten.

+

Ein Funktionsobjekt kann sich auch wie eine Meta-Funktion verhalten, um z. B. dynamische Eigenschaften zu definieren, die denen im vorherigen Abschnitt ähneln. Obwohl man die Eigenschaftssyntax immer wenn möglich verwenden sollte, zeigt das Beispiel unten das Potenzial von Meta-Funktionen, um neue Konzepte oder Verhaltensmuster zu implementieren, oder um die Struktur des Skripts zu ändern.

blau := new Farbe(0x0000ff)
 MsgBox % blau.R "," blau.G "," blau.B
 
-class Eigenschaften
+class Eigenschaften extends Funktionsobjekt
 {
     __Call(aTarget, aName, aParams*)
     {
-        ; Falls dieses Eigenschaftsobjekt eine Definition für diese Halb-Eigenschaft enthält, ruft es auf.
-        ; Achtet darauf, nicht this.HasKey(aName) zu verwenden, da das sonst in  __Call rekursiv ausgeführt wird.
-        if IsObject(aZiel) && ObjHasKey(this, aName)
-            return this[aName].(aZiel, aParams*)
+        ; Falls dieses Eigenschaftsobjekt eine Definition für diese Halb-Eigenschaft enthält, wird es aufgerufen.
+        if ObjHasKey(this, aName)
+            return this[aName].Call(aZiel, aParams*)
     }
 }
 
@@ -600,15 +588,8 @@ 

Debuggen

Implementierung

Referenzzählung

-

AutoHotkey verwendet ein einfaches Referenzzählungsmechanismus, um Ressourcen eines Objekts freizugeben, das nicht länger im Skript gebraucht wird. Skript-Autoren sollten diesen Mechanismus nur aufrufen, wenn man direkt mit unverwalteten Pointer, die auf Objekte verweisen, arbeiten muss. Für weitere Informationen, siehe ObjAddRef.

-
; Erhöht die Referenzzählung des Objekts, um "es am Leben zu erhalten":
-ObjAddRef(Adresse)
-...
-; Verringert die Referenzzählung des Objekts, so dass es freigegeben werden kann:
-ObjRelease(Adresse)
-
-

ObjAddRef muss nicht verwendet werden, wenn eine Adresse zunächst per Object(obj) bezogen wird.

-

Generell sollte jede neue Kopie einer Objektadresse als Objektverweis behandelt werden, außer dass das Skript wie vorgesehen für den Aufruf von ObjAddRef und/oder ObjRelease verantwortlich ist. Würde man beispielsweise eine Adresse mit so etwas wie x := Adresse kopieren, sollte ObjAddRef aufgerufen werden, um die Referenzzählung zu erhöhen. Ebenso sollte ObjRelease aufgerufen werden, wenn eine bestimmte Kopie der Objektadresse durchgeführt wurde. Dadurch wird sichergestellt, dass das Objekt freigegeben wird, wenn der letzte Verweis auf dieses Objekt verloren geht - und nicht vorher.

+

AutoHotkey verwendet ein einfaches Referenzzählungsmechanismus, um Ressourcen eines Objekts freizugeben, das nicht länger im Skript gebraucht wird. Skript-Autoren sollten diesen Mechanismus nur aufrufen, wenn man direkt mit unverwalteten Pointer, die auf Objekte verweisen, arbeiten muss.

+

In AutoHotkey v1.1 werden temporäre Verweise, die innerhalb eines Ausdrucks erstellt (aber nirgendwo gespeichert) werden, direkt nach ihrer Verwendung freigegeben. Zum Beispiel würde Fn(&{}) eine ungültige Adresse an die Funktion übergeben, weil der temporäre Verweis, zurückgegeben von {}, direkt nach dem Auswerten des Adresse-von-Operators freigegeben wird.

Wenn Code beim Freigeben des letzten Verweises auf ein Objekt ausgeführt werden soll, muss man die __Delete-Meta-Funktion implementieren.

Bekannte Einschränkungen:

    @@ -618,12 +599,21 @@

    Implementierung

    Das Betriebssystem kann den benutzten Speicher vom Objekt wieder verwenden, sobald das Programm beendet wird. Allerdings wird __Delete erst aufgerufen, wenn alle Verweise auf das Objekt freigegeben worden sind. Das kann wichtig sein, wenn andere Ressourcen freigegeben werden, die nicht automatisch vom Betriebssystem wieder verwendet werden, wie zum Beispiel temporäre Dateien.

    Pointer auf Objekte

    -

    In einigen seltenen Fällen kann es erforderlich sein, ein Objekt per DllCall an einen externen Code zu übergeben oder ein Objekt in eine binäre Datenstruktur zu speichern, um es später abrufen zu können. Eine Objektadresse kann per x := &obj abgerufen werden; wenn die Variable obj allerdings geleert wird, könnte das Objekt vorzeitig freigegeben werden. Mit ObjAddRef, wie oben gezeigt, oder mit der Object()-Funktion, wie unten gezeigt, kann sichergestellt werden, dass so etwas nicht passiert:

    -
    Adresse := Object(Objekt)
    -

    Darüber hinaus kann man mit dieser Funktion die Adresse wieder in ein Verweis umwandeln:

    +

    In einigen seltenen Fällen kann es erforderlich sein, ein Objekt per DllCall an einen externen Code zu übergeben oder ein Objekt in eine binäre Datenstruktur zu speichern, um es später abrufen zu können. Die Adresse eines Objekts kann via Adresse := &Objekt abgerufen werden; dies würde allerdings effektiv zwei Verweise auf das Objekt erzeugen, aber das Programm kennt nur den einen in Objekt. Wenn der letzte bekannte Verweis auf das Objekt freigegeben wurde, wird das Objekt gelöscht. Demzufolge muss das Skript das Objekt darüber informieren, dass es einen Verweis erhalten hat. Es gibt zwei Wege, um das zu erreichen:

    +
    ; Methode #1: Referenzzählung explizit erhöhen.
    +Adresse := &Objekt
    +ObjAddRef(Adresse)
    +
    +; Methode #2: Object() benutzen, das die Referenzzählung erhöht und eine Adresse zurückgibt.
    +Adresse := Object(Objekt)
    +

    Mit dieser Funktion kann man auch eine Adresse wieder in ein Verweis umwandeln:

    Objekt := Object(Adresse)
    -

    In jedem Fall wird die Referenzzählung des Objekts automatisch erhöht, um ein vorzeitiges Freigeben des Objekts zu verhindern.

    -

    Beachte, dass diese Funktionen ebenso für Objekte gelten, die nicht mit Object() erstellt wurden, wie COM-Objekt-Wrapper oder File-Objekte.

    +

    In jedem Fall muss das Skript das Objekt außerdem darüber informieren, dass es mit diesem Verweis fertig ist:

    +
    ; Verringert die Referenzzählung des Objekts, damit es freigegeben werden kann:
    +ObjRelease(Adresse)
    +
    +

    Generell sollte jede neue Kopie einer Objektadresse als seperater Objektverweis behandelt werden, demzufolge sollte das Skript ObjAddRef aufrufen, wenn es eine Kopie erhält, und sofort ObjRelease aufrufen, bevor es eine verliert. Würde man beispielsweise eine Adresse mit so etwas wie x := Adresse kopieren, sollte ObjAddRef aufgerufen werden. Ebenso sollte das Skript ObjRelease aufrufen, wenn es mit x fertig ist (oder dabei ist den Wert von x zu überschreiben).

    +

    Beachte, dass die Object()-Funktion sogar auf Objekte angewendet werden kann, die sie selbst nicht erstellt hat, wie z. B. COM-Objekt-Wrapper oder File-Objekte.

    diff --git a/Scripts.htm b/Scripts.htm index 0aced15e..7a292399 100644 --- a/Scripts.htm +++ b/Scripts.htm @@ -163,7 +163,7 @@

    Befehlszeilenparameter an einem Skript übergeben

    OptionBedeutung /f oder /force - Skript bedingungslos starten und Warnmeldungen überspringen. + Skript bedingungslos starten und Warnmeldungen überspringen. Diese Option hat den gleichen Effekt wie #SingleInstance Off. /r oder /restart diff --git a/Variables.htm b/Variables.htm index c28e75b6..a51b1e5e 100644 --- a/Variables.htm +++ b/Variables.htm @@ -28,7 +28,7 @@

    Inhaltsverzeichnis

    Aufgrund von Gestaltungsrichtlinien sollten die Namen der Variablen nur Buchstaben, Zahlen und Unterstriche enthalten (zum Beispiel: PositionZeiger, Gesamt_Elemente und Eintrag_ist_gültig). Wenn du dich an solchen Richtlinien hältst, können andere Programmierer dein Skript besser verstehen. Außerdem erhöht das die Chance, dass du mit deinen eigenen Skripten besser zurechtkommst, wenn du sie erneut lesen musst.

    Variablennamen, die nur aus Ziffern bestehen, sind prinzipiell nur bei eingehenden Befehlszeilenparametern von Bedeutung. Innerhalb von Ausdrücken werden Ziffern nicht als Variablen interpretiert, weil sie zum Berechnen eines Wertes dienen.

    Innerhalb von Ausdrücken sind Variablennamen wie AND, OR und NOT ungeeignet, weil sie als Operatoren interpretiert werden. Das Verwenden solcher Namen innerhalb eines Ausdrucks würde eine angemessene Evaluierung verhindern.

    -

    Speichern von Variablenwerten: Es gibt zwei Methoden, wie eine Zeichenkette oder Zahl in eine Variable gespeichert werden kann: Traditions- und Ausdrucksmethode. Bei der Traditionsmethode werden Werte via Gleichheitszeichenoperator (=) gespeichert. Solche Werte können ohne Anführungszeichen versehene Zeichenketten und in Prozentzeichen gesetzte Variablen sein. Zum Beispiel:

    +

    Speichern von Variablenwerten: Es gibt zwei Methoden, wie eine Zeichenkette oder Zahl in eine Variable gespeichert werden kann: Traditions- und Ausdrucksmethode. Bei der Traditionsmethode werden Werte via Gleichheitszeichenoperator (=) gespeichert. Solche Werte können ohne Anführungszeichen versehene Zeichenketten und in Prozentzeichen gesetzte Variablen sein. Zum Beispiel:

    MeineZahl = 123
     MeineZeichenkette = Das ist eine literale Zeichenkette.
     KopieVonVar = %Var%  ; Bei dem Operator "=" sind Prozentzeichen notwendig, um den Inhalt einer Variable abzurufen.
    @@ -41,7 +41,7 @@

    Inhaltsverzeichnis

    MeineVar =
     MeineVar := ""

    Die obigen Anführungszeichen sollten nur bei dem Operator ":=" verwendet werden. Wären sie bei dem Operator "=" angegeben, würden zwei Anführungszeichen direkt in die Variable gespeichert werden.

    -

    Abrufen von Variablenwerten: Wie beim Speichern von Werten auch, gibt es zwei Methoden zum Abrufen von Werten: Traditions- und Ausdrucksmethode. Bei der Traditionsmethode müssen die Namen der Variablen mit Prozentzeichen umschlossen werden, um ihre Inhalte abrufen zu können. Zum Beispiel:

    +

    Abrufen von Variablenwerten: Wie beim Speichern von Werten auch, gibt es zwei Methoden zum Abrufen von Werten: Traditions- und Ausdrucksmethode. Bei der Traditionsmethode müssen die Namen der Variablen mit Prozentzeichen umschlossen werden, um ihre Inhalte abrufen zu können. Zum Beispiel:

    MsgBox Der Wert in der Variable namens Var ist %Var%.
     KopieVonVar = %Var%

    Bei der Ausdrucksmethode müssen die Prozentzeichen weggelassen und Zeichenketten in Anführungszeichen gesetzt werden. Funktionsgemäß sind die folgenden Beispiele mit den vorherigen Beispielen identisch:

    @@ -79,9 +79,12 @@

    Ausdrücke

    Loop % Iterationen + 1 WinSet, Transparent, % X + 100 Control, Choose, % AktuelleAuswahl - 1
+

Operatoren innerhalb von Ausdrücken

Operatoren mit gleichwertiger Priorität, wie z. B. Multiplizieren (*) und Dividieren, (/), werden von links nach rechts ausgewertet, sofern nicht anders unten angegeben. Ein Operator mit niedrigerer Priorität, wie z. B. Addieren (+), wird erst ausgewertet, wenn ein höherer Operator, wie z. B. Multiplizieren (*), ausgewertet wurde. Zum Beispiel würde 3 + 2 * 2 wie 3 + (2 * 2) ausgewertet werden. Mit runden Klammern können die Prioritäten wie folgt überschrieben werden: (3 + 2) * 2

-

In der Regel werden leere Werte (leere Zeichenketten) bei einer mathematischen Operation nicht als Null angesehen. Stattdessen werden sie als Fehler behandelt - der Fehler bewirkt, dass dieser Teil des Ausdrucks eine leere Zeichenkette zurückgibt. Wenn beispielsweise eine Variable namens X leer wäre, würde der Ausdruck X+1 einen leeren Wert statt eine 1 zurückgeben.

+

In der Regel werden leere Werte (leere Zeichenketten) oder nicht-numerische Werte bei einer mathematischen Operation nicht als Null angesehen. Stattdessen werden sie als Fehler behandelt - der Fehler bewirkt, dass dieser Teil des Ausdrucks eine leere Zeichenkette zurückgibt. Wenn beispielsweise eine Variable namens X leer wäre, würde der Ausdruck X+1 einen leeren Wert statt eine 1 zurückgeben.

+

Aus historischen Gründen werden in Anführungszeichen gesetzte numerische Zeichenketten wie "123" immer als nicht-numerisch angesehen, wenn sie direkt in einem Ausdruck verwendet werden (aber nicht, wenn sie in einer Variable gespeichert sind oder von einer Funktion zurückgegeben werden). Dieser nicht-numerische Attribut kann mit Verkettungen erzwungen werden, demzufolge werden Ausdrücke wie "0x" n einen nicht-numerischen Wert erzeugen (selbst wenn n gültige hexadezimale Ziffern enthält). Dieses Problem kann man umgehen, indem man den Wert in eine Variable speichert oder ihn via Funktion, wie z. B. Round(), übergibt. Skripte sollten keine in Anführungszeichen gesetzte literale Zahlen enthalten, weil dieses Verhalten eventuell in einer zukünftigen Version geändert wird.

+

Ausdrucksoperatoren (in absteigender Priorität)

@@ -133,7 +136,7 @@

Ausdrucksoperatoren (in absteigender Priorität)

@@ -232,7 +235,7 @@

Ausdrucksoperatoren (in absteigender Priorität)

<<= @@ -248,11 +251,16 @@

Ausdrucksoperatoren (in absteigender Priorität)

round()
abs()

- + + + + + - @@ -614,7 +622,7 @@

GUI-Fenster und Menüleisten

- + - + @@ -44,15 +44,15 @@

Alphabetischer Befehls- und Funktionsindex

- + - + - + @@ -68,7 +68,7 @@

Alphabetischer Befehls- und Funktionsindex

- + @@ -179,7 +179,7 @@

Alphabetischer Befehls- und Funktionsindex

- + @@ -255,7 +255,7 @@

Alphabetischer Befehls- und Funktionsindex

- + @@ -363,7 +363,7 @@

Alphabetischer Befehls- und Funktionsindex

- + @@ -455,7 +455,7 @@

Alphabetischer Befehls- und Funktionsindex

- @@ -548,11 +548,11 @@

Alphabetischer Befehls- und Funktionsindex

- + - + @@ -588,7 +588,7 @@

Alphabetischer Befehls- und Funktionsindex

- + @@ -692,7 +692,7 @@

Alphabetischer Befehls- und Funktionsindex

- + @@ -792,7 +792,7 @@

Alphabetischer Befehls- und Funktionsindex

- + @@ -844,7 +844,7 @@

Alphabetischer Befehls- und Funktionsindex

- + @@ -916,7 +916,7 @@

Alphabetischer Befehls- und Funktionsindex

- + diff --git a/misc/Clipboard.htm b/misc/Clipboard.htm index 30a43b20..6922c87c 100644 --- a/misc/Clipboard.htm +++ b/misc/Clipboard.htm @@ -32,7 +32,7 @@

Clipboard und ClipboardAll

Send ^c ClipWait; Wartet, bis die Zwischenablage Text enthält. MsgBox STRG+C hat folgenden Inhalt in die Zwischenablage kopiert:`n`n%clipboard% -

ClipboardAll (alles in der Zwischenablage speichern und wiederherstellen)

+

ClipboardAll (alles in der Zwischenablage speichern und wiederherstellen)

ClipboardAll enthält alles von der Zwischenablage (z. B. Bilder und Formatierung). Diese Variable wird häufig verwendet, um den aktuellen Inhalt der Zwischenablage zu sichern, damit die Zwischenablage vorübergehend für eine andere Operation verwendet werden kann. Sobald die Operation abgeschlossen wurde, kann der originale Inhalt der Zwischenablage wie folgt wiederhergestellt werden:

ClipSicherung := ClipboardAll   ; Speichert die gesamte Zwischenablage in eine beliebige Variable.
 ; ... hier kann vorübergehend die Zwischenablage anderweitig verwendet werden, z. B. das Einfügen von Unicode-Text mit Transform Unicode ...
diff --git a/misc/WinTitle.htm b/misc/WinTitle.htm
index 9b0a9a34..62fb3b00 100644
--- a/misc/WinTitle.htm
+++ b/misc/WinTitle.htm
@@ -44,6 +44,7 @@ 

Fenstertitel-Parameter & Zuletzt Gefundenes Fenster

Übereinstimmungsverhalten

SetTitleMatchMode kontrolliert, wie der angegebene Titel (teilweise oder vollständig) mit den Titeln anderer Fenster verglichen werden soll. Je nach Einstellung kann Fenstertitel ein exakter Titel sein, ein Präfix enthalten, eine im Titel vorkommende Zeichenkette sein oder ein RegEx-Muster sein. Diese Einstellung bestimmt auch, ob ahk_class als exakter Klassenname oder als RegEx-Muster interpretiert werden soll.

+

Fenstertitel unterscheiden zwischen Groß- und Kleinschreibung, es sei denn, man benutzt den i)-Modifikator in einem RegEx-Suchmuster.

Versteckte Fenster werden nur erkannt, wenn DetectHiddenWindows aktiviert ist; mit Ausnahme von WinShow, das versteckte Fenster immer erkennen kann.

Falls mehrere Fenster mit Fenstertitel und sonstigen Kriterien übereinstimmen, wird das oberste übereinstimmende Fenster verwendet. Wenn das aktive Fenster mit den Kriterien übereinstimmt, wird es üblicherweise bevorzugt, weil sich dieses Fenster für gewöhnlich über allen anderen Fenstern befindet. Gibt es neben dem aktiven Fenster auch eine Übereinstimmung mit einem Immer-im-Vordergrund-Fenster, wird dieses stattdessen verwendet.

diff --git a/objects/File.htm b/objects/File.htm index 0b58c8d9..aa763379 100644 --- a/objects/File.htm +++ b/objects/File.htm @@ -35,7 +35,8 @@

File-Objekt [AHK_L 42+]

Zeile := File.ReadLine()

Multiplizieren (*): Das Ergebnis ist ein Integer, wenn beide Eingabewerte Integer sind, ansonsten ist es eine Gleitkommazahl.

Echtes Dividieren (/): Im Gegensatz zu EnvDiv wird die echte Division immer eine Gleitkommazahl zurückgeben, auch dann, wenn beide Eingabewerte Integer sind. Zum Beispiel wäre 3/2 gleich 1.5 statt 1, und 4/2 gleich 2.0 statt 2.

-

Floor-Dividieren (//): Der Doppel-Schrägstrich-Operator verwendet die leistungsstarke Integer-Division, wenn beide Eingabewerte Integer sind. Zum Beispiel wäre 5//3 gleich 1 und 5//-3 gleich -1. Wenn einer der beiden Eingabewerte eine Gleitkommazahl ist, wird die Gleitkomma-Division erfolgen und das Ergebnis auf den nächstmöglichen linksbefindlichen Integer gekürzt. Zum Beispiel wäre 5//3.0 gleich 1.0 und 5.0//-3 gleich -2.0. Das Ergebnis wird im Gleitkommaformat gespeichert, selbst wenn das Ergebnis dieser Gleitkomma-Division ein Integer ist. Für Modulo, siehe Mod().

+

Floor-Dividieren (//): Der Doppel-Schrägstrich-Operator verwendet die leistungsstarke Integer-Division, wenn beide Eingabewerte Integer sind. Zum Beispiel wäre 5//3 gleich 1 und 5//-3 gleich -1. Wenn einer der beiden Eingabewerte eine Gleitkommazahl ist, wird die Gleitkomma-Division erfolgen und das Ergebnis auf den nächstmöglichen linksbefindlichen Integer gekürzt. Zum Beispiel wäre 5//3.0 gleich 1.0 und 5.0//-3 gleich -2.0. Das Ergebnis wird im Gleitkommaformat gespeichert, selbst wenn das Ergebnis dieser Gleitkomma-Division ein Integer ist. Für Modulo, siehe Mod().

Die Operatoren *= und /= sind eine Kurzschreibweise, um den Wert in einer Variable mit einem anderen Wert zu multiplizieren oder dividieren. Zum Beispiel würde Var *= 2 das gleiche Ergebnis wie Var := Var * 2 erzeugen (die erste Methode ist performanter).

Eine Division durch 0 erzeugt ein leeres Ergebnis (leere Zeichenkette).

Zuweisung. Führt eine Operation auf den Inhalt einer Variable aus und speichert das Ergebnis wieder in die gleiche Variable (bevor die Version 1.0.46 veröffentlicht wurde, konnten sie als Operator nur ganz links auf der Zeile stehen, zudem wurden nur die ersten fünf Operatoren unterstützt). Der einfachste Zuweisungsoperator ist das Doppelpunkt-Gleich (:=) - dieser Operator kann das Ergebnis eines Ausdrucks in eine Variable speichern. Da sie eine Kurzschreibweise eines Operators sind, findest du ihre Beschreibung jeweils beim dazugehörigen Operator in dieser Tabelle. Beispiel 1: Var //= 2 führt eine Floor-Division durch, um Var mit 2 zu teilen, und speichert dann das Ergebnis wieder in Var. Beispiel 2: Var .= "abc" ist die Kurzschreibweise für Var := Var . "abc".

-

Im Gegensatz zu den meisten anderen Operatoren werden Zuweisungen von rechts nach links ausgewertet. Demzufolge würde eine Zeile wie Var1 := Var2 := 0 eine 0 in Var2 speichern und dann Var2 in Var1 speichern.

+

Im Gegensatz zu den meisten anderen Operatoren werden Zuweisungen von rechts nach links ausgewertet. Demzufolge würde eine Zeile wie Var1 := Var2 := 0 eine 0 in Var2 speichern und dann Var2 in Var1 speichern.

Verwendet man eine Zuweisung als Eingabewert eines anderen Operators, wird ihr Wert die Variable selbst sein. Zum Beispiel wäre der Ausdruck (Var += 2) > 50 wahr, wenn der gerade eben erhöhte Wert in Var größer als 50 ist. Mit diesem Verfahren könnte man auch eine Zuweisung via ByRef übergeben oder ihre Adresse verwenden; zum Beispiel: &(x:="abc").

Die Priorität der Zuweisungsoperatoren erhöht sich automatisch, wenn dadurch ein Syntaxfehler verhindert oder ein besseres Verhalten bereitgestellt werden kann. Zum Beispiel: Die Auswertung von not x := y entspräche not (x := y), ++Var := X entspräche ++(Var := X); und Z > 0 ? X := 2 : Y := 2 entspräche Z > 0 ? (X := 2) : (Y := 2).

Bekannte Einschränkungen durch Abwärtskompatibilität (die in einer zukünftigen Version behoben werden): 1) Wenn /= als Operator ganz links in einem Ausdruck steht und nicht zu einer Mehrfachanweisung gehört, erfolgt die Floor-Division, sofern keiner der Eingabewerte eine Gleitkommazahl ist (ansonsten wird /= die echte Division durchführen); 2) Datum/Zeit-Berechnung wird von += und -= nur unterstützt, wenn dieser Operator ganz links auf der Zeile vorkommt; 3) Die Operatoren +=, -= und *= behandeln leere Variablen als 0, solange sie einzeln auf einer Zeile vorkommen; zum Beispiel würde sowohl y := 1, x += 1 als auch MsgBox % x -= 3 ein leeres Ergebnis erzeugen, falls x leer ist.

Diese und andere built-interne mathematischen Funktionen findest du hier.Diese und andere built-interne mathematischen Funktionen findest du hier.

%func%()

Siehe Dynamisches Aufrufen einer Funktion.
func.()

[AHK_L 48+]: Versucht, eine Methode mit leerem Namen des Objekts func aufzurufen. Üblicherweise ist das die Standardmethode des Objekts. Wenn func kein Objekt enthält, wird stattdessen das Standard-base-Objekt aufgerufen.

+

Veraltet: Diese Syntax wird nicht mehr empfohlen. Benutze stattdessen %func%() (für Funktionsnamen und Objekte) oder func.Call() (für Funktionsobjekte).

+

[AHK_L 48+]: Versucht, eine Methode mit leerem Namen des Objekts func aufzurufen. Üblicherweise ist das die Standardmethode des Objekts. Wenn func kein Objekt enthält, wird stattdessen das Standard-base-Objekt aufgerufen.

[v1.0.95+]: Enthält func einen Funktionsnamen, wird die benannte Funktion aufgerufen.

Diese Variablen enthalten die X- und Y-Koordinaten bei GuiContextMenu- und GuiDropFiles-Ereignissen. Die Koordinaten sind relativ zur linken oberen Ecke des Fensters. [v1.1.11+]: Diese Werte sind von der DPI-Skalierung abhängig.
A_GuiEvent
oder A_GuiControlEvent
A_GuiEvent
oder A_GuiControlEvent

Das Ereignis, welches den aktuellen Thread gestartet hat. Wenn dieser Thread von etwas gestartet wurde, das keine GUI-Aktion ist, dann ist diese Variable leer. Ansonsten enthält sie eine der folgenden Zeichenketten:

Normal: Das Ereignis wurde durch einen Linksklick oder durch Tastatureingaben ausgelöst (Pfeiltasten, Tabulatortaste, Leertaste, unterstrichene Tastenkürzel und so weiter). Dieser Wert wird auch bei Menüleistenelementen und Sonderereignissen wie GuiClose und GuiEscape verwendet.

DoubleClick: Das Ereignis wurde durch einen Doppelklick ausgelöst. Hinweis: Der erste Klick des Doppelklicks löst weiterhin ein Normal-Ereignis aus. Das heißt, dass die Subroutine zweimal gestartet wird: einmal beim ersten Klick und nochmals beim zweiten Klick.

diff --git a/commands/ControlSend.htm b/commands/ControlSend.htm index 6493ff38..be73bb29 100644 --- a/commands/ControlSend.htm +++ b/commands/ControlSend.htm @@ -45,7 +45,7 @@

ErrorLevel

[v1.1.04+] Dieser Befehl ist in der Lage, bei Misserfolg eine Ausnahme auszulösen. Für mehr Informationen, siehe Laufzeitfehler.

ErrorLevel wird bei Misserfolg auf 1 und bei Erfolg auf 0 gesetzt.

Bemerkungen

-

ControlSendRaw sendet die Tastatureingaben im Tasten-Parameter exakt so, wie sie angegeben worden sind, anstatt z. B. {Enter} als ENTER-Taste, ^c als STRG+C zu interpretieren.

+

ControlSendRaw sendet die Tastatureingaben im Tasten-Parameter, ohne z. B. {Enter} in ENTER, ^c in STRG+C usw. zu übersetzen. Um mehr darüber zu erfahren, siehe Raw-Modus. Es ist auch möglich, {Raw} bei ControlSend zu benutzen.

Sobald der Steuerelement-Parameter weggelassen wird, versucht dieser Befehl, die Tastatureingaben direkt ans Fenster zu senden. Dabei wird das oberste Steuerelement (welches oft das Richtige ist) genommen oder das Fenster selbst, falls keine Steuerelemente vorhanden sind. Das ist nützlich, wenn das Fenster scheinbar überhaupt keine Steuerelemente hat oder es dem Benutzer egal ist, welchem Steuerelement die Tastatureingaben gesendet werden sollen.

Standardmäßig werden Modifikatortasten (STRG, ALT, UMSCHALT und WIN) wie beim Send-Befehl normal gesendet. Auf diese Weise können Großbuchstaben, Steuerungszeichen usw. von der Eingabeaufforderung und von anderen Konsolenfenstern richtig erfasst werden. Möglicherweise wird dadurch die Zuverlässigkeit auch bei anderen Dingen verbessert.

In einigen Fällen kann es passieren, dass diese Modifikatortasten nicht richtig im aktiven Fenster funktionieren, besonders wenn der Benutzer die Tastatur beim Ausführen eines ControlSend-Befehls intensiv benutzt oder die ALT-Taste gesendet wurde (da ALT die Menüleiste im aktiven Fenster aktiviert). Das kann verhindert werden, indem die Modifikatortaste wie im folgenden Beispiel explizit gedrückt und danach wieder losgelassen wird:

diff --git a/commands/Gui.htm b/commands/Gui.htm index e0699ad1..19b58167 100644 --- a/commands/Gui.htm +++ b/commands/Gui.htm @@ -271,8 +271,8 @@

Speichern von und Reagieren auf Benutzereingaben

V: Variable. Verbindet eine Variable mit einem Steuerelement. Verwende dazu ein V und füge direkt danach den Namen einer globalen Variable an (oder eine lokale ByRef-Variable, die auf eine globale Variable verweist, oder seit v1.0.46.01 eine statische Variable). vMeinEdit würde beispielsweise den Inhalt des Steuerelements in die Variable MeinEdit speichern, sobald man Gui Submit verwendet. Das Zuweisen von Variablen ist auch bei Steuerelementen hilfreich, die nicht eingabefähig sind (z. B. das Text-Steuerelement oder GroupBox), weil der Name von so einer Variable zeitgleich als eindeutige Kennung dient, die man ganz leicht in Verbindung mit GuiControl, GuiControlGet und A_GuiControl benutzen kann. Hinweis: Gui Submit funktioniert nur bei Steuerelementen, mit denen der Benutzer interagieren kann (z. B. Edit und Slider), aber es gibt Ausnahmen (z. B. ListView und TreeView).

G: Gosub (g-label). Startet automatisch eine Subroutine oder Funktion, wenn der Benutzer ein Steuerelement anklickt oder ändert. Verwende dazu ein G und füge direkt danach den Namen eines Labels an, das ausgeführt werden soll. gCancel kann man benutzen, um standardmäßig ein indirektes Gui Cancel auszulösen (aber nur, wenn man noch nicht selbst ein Label namens "Cancel" definiert hat). Die Subroutine kann auf folgende Built-in-Variablen zurückgreifen: A_Gui, A_GuiControl, A_GuiEvent und A_EventInfo.

[v1.1.20+]: Wenn der Labelname ungültig ist, wird er stattdessen als Funktionsname angesehen. Alternativ kann man via GuiControl ein Funktionsobjekt mit einem Steuerelement verbinden. Die Funktion akzeptiert folgende Parameter (wenn man in diesem Fall gCtrlEvent in den Optionen verwendet):

-
CtrlEvent(CtrlHwnd, GuiEvent, EventInfo, ErrorLevel)
-

Die Bedeutung der Parameter ist vom Typ des Steuerelements abhängig.

+
CtrlEvent(CtrlHwnd, GuiEvent, EventInfo, ErrorLevel:="")
+

Die Bedeutung der Parameter ist vom Typ des Steuerelements abhängig. Hinweis: Wenn man den vierten Parameter ohne Standardwert deklariert, kann die Funktion nur von Ereignissen aufgerufen werden, die vier Parameter unterstützen.

Steuerelemente: Häufig verwendete Styles und Optionen

Hinweis: Vorzeichenlose Optionen werden standardmäßig hinzugefügt; zum Beispiel ist Wrap das gleiche wie +Wrap. -Wrap hingegen entfernt den Zeilenumbruch im Steuerelement.

diff --git a/commands/Hotkey.htm b/commands/Hotkey.htm index bd97aa4f..e1628d29 100644 --- a/commands/Hotkey.htm +++ b/commands/Hotkey.htm @@ -67,7 +67,8 @@

Parameter

If, Ausdruck
-

[AHK_L]: Gegenstück von #If Ausdruck. Der Ausdruck muss exakt mit dem Text eines bestehenden #If Ausdruck, außer #If oder #If,, übereinstimmen. Bei dem Hotkey-Befehl ist das Komma nach dem "If" notwendig. Zwar kann dieser Befehl keine neuen Ausdrücke erstellen, allerdings kann er neue Hotkeys unter Verwendung eines vorhandenen Ausdrucks erstellen. Siehe 4. Beispiel von #If.

+

[AHK_L]: Gegenstück von #If Ausdruck. Ausdruck muss ein Ausdruck sein, der irgendwo im Skript mit der #If-Direktive verwendet wurde. Zwar kann dieser Befehl keine neuen Ausdrücke erstellen, allerdings kann er neue Hotkeys unter Verwendung eines vorhandenen Ausdrucks erstellen. Siehe 4. Beispiel von #If.

+

Hinweis: Der Hotkey-Befehl benutzt die Zeichenkette, die du ihm gegeben hast, nicht den ursprünglichen Quellcode. Kommas und Dereferenzzeichen (Prozentzeichen) werden interpretiert, bevor der Befehl aufgerufen wird, und müssen daher mit Escapezeichen versehen werden, wenn sie zum ursprünglichen Ausdruck gehören. Escapesequenzen werden aufgelöst, während das Skript geladen wird, demzufolge werden nur die resultierenden Zeichen berücksichtigt; Zum Beispiel sind Hotkey, If, x = "`t" und Hotkey, If, % "x = """ A_Tab """" das gleiche wie #If x = "`t".

Bekannte Einschränkung: Enthält Ausdruck einen AND/OR-Operator, wird er nicht als vorhandener Ausdruck anerkannt. Als Übergangslösung kann man den gleichwertigen &&/||-Operator verwenden - sowohl im originalen #If-Ausdruck als auch in dem, der an den Hotkey-Befehl übergeben wurde.

diff --git a/commands/InStr.htm b/commands/InStr.htm index 950ecfa8..e55fc505 100644 --- a/commands/InStr.htm +++ b/commands/InStr.htm @@ -41,11 +41,12 @@

Parameter

Bemerkungen

-

Diese Funktion ist eine Kombination aus IfInString und StringGetPos, und eine vereinfachte Form von RegExMatch().

-

Diese Funktion ist in der Regel schneller als RegExMatch(), wenn es darum geht, eine Zeichenkette in einer größeren Zeichenkette zu suchen.

+

Diese Funktion ist eine Kombination aus IfInString und StringGetPos.

+

RegExMatch() ist flexibler als InStr(), wenn es darum geht, ein bestimmtes Muster (regulärer Ausdruck) innerhalb einer Zeichenkette zu suchen. Zum Suchen einer einfachen Zeichenkette ist InStr() besser geeignet.

Siehe auch

-

RegExMatch(), StringGetPos, IfInString, StringCaseSense, if Var in/contains Vergleichsliste, if Var between, if Var is Typ +

RegExMatch(), StringGetPos, IfInString, StringCaseSense, if Var in/contains Vergleichsliste, if Var between, if Var is Typ +

Beispiel

; Beispiel 1
 MsgBox % InStr("123abc789","abc") ; Gibt 4 zurück
diff --git a/commands/ListView.htm b/commands/ListView.htm
index 616c7684..bcfd47cf 100644
--- a/commands/ListView.htm
+++ b/commands/ListView.htm
@@ -204,7 +204,7 @@ 

g-Label-Meldungen (Sekundär)

M: Auswahlrechteck. Der Benutzer hat damit begonnen, ein Auswahlrechteck über mehrere Reihen oder Symbolen zu ziehen.

S: Der Benutzer hat damit begonnen, in der ListView zu scrollen.

s (kleingeschriebenes S): Der Benutzer ist damit fertig, in der ListView zu scrollen.

-

ImageList (Symbole in die ListView einfügen)

+

ImageList (Symbole in die ListView einfügen)

Eine ImageList (übersetzt Bildliste) ist eine Gruppe von gleich großen Symbolen, die im Speicher abgelegt sind. Zu Beginn ist jede ImageList leer. Das Skript ruft IL_Add() wiederholend auf, um Symbole mit fortlaufenden Nummern in die Liste einzufügen, beginnend bei 1. Auf so eine Nummer bezieht sich das Skript, wenn es ein bestimmtes Symbol auf einer Reihe oder Spaltenüberschrift anzeigen soll. Das folgende Beispiel zeigt, wie Symbole in den Reihen einer ListView eingefügt werden können:

Gui, Add, ListView, h200 w180, Symbol & Nummer|Beschreibung  ; Erstellt eine ListView.
 ImageListID := IL_Create(10)  ; Erstellt eine ImageList für 10 kleine Symbole.
diff --git a/commands/LoadPicture.htm b/commands/LoadPicture.htm
index f2c6b56b..6dacb948 100644
--- a/commands/LoadPicture.htm
+++ b/commands/LoadPicture.htm
@@ -19,7 +19,7 @@ 

Parameter

Dateiname
-

+

Der Name der Bilddatei, von der man annimmt, dass sie sich im A_WorkingDir-Verzeichnis befindet, solange kein absoluter Pfad angegeben ist. Wenn der Name einer DLL- oder EXE-Datei ohne Pfad angegeben ist, wird sie eventuell aus dem Verzeichnis der aktuellen Programmdatei (AutoHotkey.exe oder ein kompiliertes Skript) oder aus einem Systemverzeichnis geladen.

Optionen
diff --git a/commands/Math.htm b/commands/Math.htm new file mode 100644 index 00000000..4e8c6995 --- /dev/null +++ b/commands/Math.htm @@ -0,0 +1,176 @@ + + + +Mathematische Funktionen + + + + + + + + +

Mathematische Funktionen

+ +

Hinweis: Mathematische Funktionen geben generell einen leeren Wert (leere Zeichenkette) zurück, falls einer der eingehenden Parameter nicht numerisch ist.

+ +

Kurzübersicht:

+ + +

Allgemeine Mathematik

+ +
+

Abs Absolutwert

+
Wert := Abs(Zahl)
+

Gibt den absoluten Wert von Zahl zurück.

+

Der Rückgabewert hat den gleichen Typ wie Zahl (Integer oder Gleitkommazahl).

+
MsgBox, % Abs(-1.2) ; Gibt 1.2 zurück
+
+ +
+

Ceil Aufrunden

+
Wert := Ceil(Zahl)
+

Gibt Zahl zurück, welche auf den nächsten Integer aufgerundet ist (ohne .00-Suffix).

+
MsgBox, % Ceil(1.2)  ; Gibt 2 zurück
+MsgBox, % Ceil(-1.2) ; Gibt -1 zurück
+
+ +
+

Exp Exponential

+
Wert := Exp(N)
+

Gibt e zurück (ungefähr 2.71828182845905), potenziert mit N.

+

Der Parameter N kann negativ sein und einen Dezimalpunkt enthalten. Um neben e noch andere Zahlen zu potenzieren, verwende den **-Operator.

+
MsgBox, % Exp(1.2) ; Gibt 3.320117 zurück
+
+ +
+

Floor Abrunden

+
Wert := Floor(Zahl)
+

Gibt Zahl zurück, welche auf den nächsten Integer abgerundet ist (ohne .00-Suffix).

+
MsgBox, % Floor(1.2)  ; Gibt 1 zurück
+MsgBox, % Floor(-1.2) ; Gibt -2 zurück
+
+ +
+

Log Dezimaler Logarithmus

+
Wert := Log(Zahl)
+

Gibt den Logarithmus (Basis 10) von Zahl zurück.

+

Das Ergebnis ist eine Gleitkommazahl. Wenn Zahl negativ ist, wird eine leere Zeichenkette zurückgegeben.

+
MsgBox, % Log(1.2) ; Gibt 0.079181 zurück
+
+ +
+

Ln Natürlicher Logarithmus

+
Wert := Ln(Zahl)
+

Ermittelt den Logarithmus (Basis e) von Zahl.

+

Das Ergebnis ist eine Gleitkommazahl. Wenn Zahl negativ ist, wird eine leere Zeichenkette zurückgegeben.

+
MsgBox, % Ln(1.2) ; Gibt 0.182322 zurück
+
+ +
+

Mod Division mit Rest (Modulo)

+
Wert := Mod(Dividend, Divisor)
+

Gibt den Rest zurück, wenn Dividend durch Divisor geteilt wird.

+

Das Vorzeichen des Ergebnisses entspricht dem Vorzeichen des ersten Parameters. Wenn einer der beiden Parameter eine Gleitkommazahl ist, wird das Ergebnis ebenfalls eine Gleitkommazahl sein. Ist der zweite Parameter eine 0, gibt die Funktion ein leeres Ergebnis (leere Zeichenkette) zurück.

+
MsgBox, % Mod(7.5, 2) ; Gibt 1.5 zurück (2 x 3 + 1.5)
+
+ +
+

Round Runden

+
Wert := Round(Zahl [, N])
+

Gibt Zahl zurück, welche auf N Dezimalstellen gerundet ist.

+

Ist N nicht vorhanden oder eine 0, wird Zahl auf den nächsten Integer gerundet:

+
MsgBox, % Round(3.14)    ; Gibt 3 zurück
+

Ist N eine positive Zahl, wird Zahl auf N Dezimalstellen gerundet:

+
MsgBox, % Round(3.14, 1) ; Gibt 3.1 zurück
+

Ist N negativ, wird Zahl auf N Stellen nach links gerundet:

+
MsgBox, % Round(345, -1) ; Gibt 350 zurück
+MsgBox, % Round(345, -2) ; Gibt 300 zurück
+

Im Gegensatz zu Transform Round hat das Ergebnis keinen .000-Suffix, wenn N weggelassen wird oder kleiner als 1 ist. Seit v1.0.44.01 zeigt ein Wert in N, der größer als 0 ist, genau N Dezimalstellen an, anstatt SetFormat zu berücksichtigen. Man kann das verhindern, wenn man eine weitere mathematische Operation beim Rückgabewert von Round() durchführt; zum Beispiel: Round(3.333, 1)+0.

+
+ +
+

Sqrt Quadratwurzel

+
Wert := Sqrt(Zahl)
+

Gibt die Quadratwurzel von Zahl zurück.

+

Das Ergebnis ist eine Gleitkommazahl. Wenn Zahl negativ ist, gibt die Funktion ein leeres Ergebnis (leere Zeichenkette) zurück.

+
MsgBox, % Sqrt(16) ; Gibt 4 zurück
+
+ +

Trigonometrie

+ +

Hinweis: Um ein Bogenmaß in Grad umzuwandeln, kann es mit 180/pi (ungefähr 57.29578) multipliziert werden. Um ein Grad-Wert in Bogenmaß umzuwandeln, kann es mit pi/180 (ungefähr 0.01745329252) multipliziert werden. Der Wert von pi (ungefähr 3.141592653589793) ist viermal der Arkustangens von 1.

+ +
+

Sin Sinus

+
Wert := Sin(Zahl)
+

Gibt den trigonometrischen Sinus von Zahl zurück.

+

Zahl muss als Bogenmaß angegeben werden.

+
MsgBox, % Sin(1.2) ; Gibt 0.932039 zurück
+
+ +
+

Cos Kosinus

+
Wert := Cos(Zahl)
+

Gibt den trigonometrischen Kosinus von Zahl zurück.

+

Zahl muss als Bogenmaß angegeben werden.

+
MsgBox, % Cos(1.2) ; Gibt 0.362358 zurück
+
+ +
+

Tan Tangens

+
Wert := Tan(Zahl)
+

Gibt den trigonometrischen Tangens von Zahl zurück.

+

Zahl muss als Bogenmaß angegeben werden.

+
MsgBox, % Tan(1.2) ; Gibt 2.572152 zurück
+
+ +
+

ASin Arkussinus

+
Wert := ASin(Zahl)
+

Gibt den Arkussinus (die Zahl, deren Sinus Zahl ist) als Bogenmaß zurück.

+

Wenn Zahl kleiner als -1 oder größer als 1 ist, gibt die Funktion ein leeres Ergebnis (leere Zeichenkette) zurück.

+
MsgBox, % ASin(0.2) ; Gibt 0.201358 zurück
+
+ +
+

ACos Arkuskosinus

+
Wert := ACos(Zahl)
+

Gibt den Arkuskosinus (die Zahl, deren Kosinus Zahl ist) als Bogenmaß zurück.

+

Wenn Zahl kleiner als -1 oder größer als 1 ist, gibt die Funktion ein leeres Ergebnis (leere Zeichenkette) zurück.

+
MsgBox, % ACos(0.2) ; Gibt 1.369438 zurück
+
+ +
+

ATan Arkustangens

+
Wert := ATan(Zahl)
+

Gibt den Arkustangens (die Zahl, deren Tangens Zahl ist) als Bogenmaß zurück.

+
MsgBox, % ATan(1.2) ; Gibt 0.876058 zurück
+
+ + + diff --git a/commands/Menu.htm b/commands/Menu.htm index f8b5f149..828279ca 100644 --- a/commands/Menu.htm +++ b/commands/Menu.htm @@ -80,7 +80,7 @@

Bemerkungen

Ein Skript mit Hotkeys, Hotstrings, #Persistent, OnMessage() oder Gui ist standardmäßig eine Einzelinstanz (Dialogfenster & Anfrage). Andere Skripte erlauben standardmäßig mehrere Instanzen. Dieses Verhalten kann deaktiviert oder geändert werden, wie bereits oben erwähnt.

+

Diese Direktive wird ignoriert, wenn mindestens eine der folgenden Befehlszeilenoptionen benutzt wird: /force /f /restart /r

+

Siehe auch

Reload, #Persistent

Beispiel

diff --git a/commands/index.htm b/commands/index.htm index e183739a..4775c4ca 100644 --- a/commands/index.htm +++ b/commands/index.htm @@ -36,7 +36,7 @@

Alphabetischer Befehls- und Funktionsindex

Erstellt ein skriptfähiges assoziatives Array mit Integer-Keys.
Abs()Abs() Gibt den absoluten Wert von Zahl zurück.
Bei Anweisungen wie Var1 = %Var2% werden Leer- und Tabulatorzeichen am Beginn und am Ende von Var2 entfernt.
ASin()ASin() Gibt den Arkussinus (die Zahl, deren Sinus Zahl ist) als Bogenmaß zurück.
ACos()ACos() Gibt den Arkuskosinus (die Zahl, deren Kosinus Zahl ist) als Bogenmaß zurück.
ATan()ATan() Gibt den Arkustangens (die Zahl, deren Tangens Zahl ist) als Bogenmaß zurück.
Bestimmt den Code, der ausgeführt werden soll, wenn eine Ausnahme während einer Try-Anweisung ausgelöst wird.
Ceil()Ceil() Gibt Zahl zurück, welche auf den nächsten Integer aufgerundet ist (ohne .00-Suffix).
Bestimmt den Koordinaten-Modus für verschiedene Befehle bzgl. relativer oder absoluter Fenster-/Bildschirmposition.
Cos()Cos() Gibt den trigonometrischen Kosinus von Zahl zurück.
Beendet das Skript bedingungslos.
Exp()Exp() Gibt e zurück (ungefähr 2.71828182845905), potenziert mit N.
Stellt sicher, dass immer, wenn eine Try-Anweisung erfolgt, eine oder mehrere Anweisungen (Befehle oder Ausdrücke) ausgeführt werden.
Floor()Floor() Gibt Zahl zurück, welche auf den nächsten Integer abgerundet ist (ohne .00-Suffix).
Vergleicht eine Variable mit einem Wert. Gleichbedeutend mit: if Var = Wert | if Var <> Wert.
IfExist / + IfExist / FileExist() Überprüft, ob eine Datei oder ein Ordner vorhanden ist.
Zeigt die Variablen des Skripts an, genauer gesagt ihre Namen und aktuellen Inhalte.
Log()Log() Gibt den Logarithmus (Basis 10) von Zahl zurück.
Ln()Ln() Ermittelt den Logarithmus (Basis e) von Zahl.
Ermittelt den Namen eines Win32-Menüs mithilfe seines Handles.
Mod()Mod() Modulo. Gibt den Rest zurück, wenn Dividend durch Divisor geteilt wird.
Kehrt aus einer Subroutine zurück, die zuvor via Funktionsaufruf, Gosub, Hotkey-Aktivierung, GroupActivate oder Ähnlichem angesprungen wurde.
Round()Round() Ist N nicht vorhanden oder eine 0, wird Zahl auf den nächsten Integer gerundet. Ist N eine positive Zahl, wird Zahl auf N Dezimalstellen gerundet. Ist N negativ, wird Zahl auf N Stellen nach links gerundet.
Kann das System herunterfahren, neustarten oder abmelden.
Sin()Sin() Gibt den trigonometrischen Sinus von Zahl zurück.
Teilt ein Dateiname oder eine URL in Name, Verzeichnis, Erweiterung und Laufwerk auf.
Sqrt()Sqrt() Gibt die Quadratwurzel von Zahl zurück.
Ermittelt die Bildschirmauflösung, Multi-Anzeigegerät-Informationen, Dimensionen von Systemobjekten und andere Systemeigenschaften.
Tan()Tan() Gibt den trigonometrischen Tangens von Zahl zurück.
-
RückgabeEine Textzeile. Sie enthält `n, `r`n oder `r, abhängig von der Datei und den EOL-Flags, die zum Öffnen der Datei verwendet wurden.
+ +

Es können Zeilen gelesen werden, die bis zu 65.534 Zeichen lang sind. Wenn eine Zeile diese Länge überschreitet, wird der Rest der Zeile durch nachfolgende Aufrufe dieser Methode zurückgegeben.

WriteLine

Schreibt eine Zeichenfolge gefolgt von `n oder `r`n, abhängig von den EOL-Flags, die zum Öffnen der Datei verwendet wurden. Der Dateizeiger wird dabei vorgerückt.

@@ -49,7 +50,10 @@

File-Objekt [AHK_L 42+]

Liest eine Zahl aus der Datei und rückt dabei den Dateizeiger vor.

Zahl := File.ReadZahlentyp()
- + +
ZahlentypEinen der folgenden Typen direkt als Teil der Funktion angegeben:
UInt, Int, Int64, Short, UShort, Char, UChar, Double oder Float.
ZahlentypEinen der folgenden Typen direkt als Teil der Funktion angegeben:
+ UInt, Int, Int64, Short, UShort, Char, UChar, Double oder Float. +

Diese Typennamen haben die gleiche Bedeutung wie bei DllCall.

RückgabeEine Zahl bei Erfolg, ansonsten eine leere Zeichenkette.

Wenn eine Try-Anweisung aktiv ist und keine Bytes gelesen wurden, wird eine Ausnahme ausgelöst. Es wird keine Ausnahme ausgelöst, wenn mindestens ein Byte gelesen wurde, selbst wenn die Größe des angegebenen Zahlentyps größer ist als die Anzahl der gelesenen Bytes. Stattdessen werden die fehlenden Bytes als Null angesehen.

@@ -58,7 +62,10 @@

File-Objekt [AHK_L 42+]

Schreibt eine Zahl in die Datei und rückt dabei den Dateizeiger vor.

File.WriteZahlentyp(Zahl)
- + +
ZahlentypEinen der folgenden Typen direkt als Teil der Funktion angegeben:
UInt, Int, Int64, Short, UShort, Char, UChar, Double oder Float.
ZahlentypEinen der folgenden Typen direkt als Teil der Funktion angegeben:
+ UInt, Int, Int64, Short, UShort, Char, UChar, Double oder Float. +

Diese Typennamen haben die gleiche Bedeutung wie bei DllCall.

ZahlEine Zahl.
RückgabeDie Anzahl der Bytes, die geschrieben wurden. Zum Beispiel wird WriteUInt eine 4 bei Erfolg zurückgeben.
diff --git a/objects/Functor.htm b/objects/Functor.htm index cf7bee94..2fd4cd3c 100644 --- a/objects/Functor.htm +++ b/objects/Functor.htm @@ -52,6 +52,43 @@

Benutzerdefiniert