Skip to content

Commit

Permalink
v1.1.15.03
Browse files Browse the repository at this point in the history
  • Loading branch information
Ragnar-F committed Aug 2, 2014
1 parent 4f01cb1 commit 333c41e
Show file tree
Hide file tree
Showing 5 changed files with 85 additions and 37 deletions.
4 changes: 4 additions & 0 deletions AHKL_ChangeLog.htm
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,10 @@ <h1>Änderungen und neue Features</h1>
<p>Ältere Änderungen können in <a href="ChangeLogHelp.htm">Archivierte Änderungen</a> gefunden werden.</p><!--new revisions go here-->


<h2 id="v1.1.15.03">1.1.15.03 - 2. August 2014</h2>
<p>Behoben: Meta-Funktionen verlassen den Thread nun korrekt, wenn Exit oder Throw verwendet wird.</p>
<p>Behoben: FileInstall verwendet nun A_WorkingDir, wenn Ziel in einem nicht-kompilierten Script relativ ist.</p>

<h2 id="v1.1.15.02">1.1.15.02 - 7. Juli 2014</h2>
<p>Behoben: Debuggen von negativen Integer-Keys in Objekten.</p>

Expand Down
2 changes: 1 addition & 1 deletion AutoHotkey.htm
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
<body>

<a id="ahklogo" href="./"><img src="static/ahk_logo.png" border="0" alt="AutoHotkey"></a>
<h1>Version <a href="AHKL_ChangeLog.htm">v<!--ver-->1.1.15.02<!--/ver--></a></h1>
<h1>Version <a href="AHKL_ChangeLog.htm">v<!--ver-->1.1.15.03<!--/ver--></a></h1>
<p>Eine deutsche &Uuml;bersetzung von <a href="http://ahkscript.org/docs/">http://ahkscript.org/docs/</a> (siehe <a href="http://ahkscript.org/boards/viewtopic.php?f=9&amp;t=43">hier</a> f&uuml;r mehr Details).</p>
<p>©2003-2014 Chris Mallett, und zum Teil ©<a href="http://www.autoitscript.com/">AutoIt-Team</a> und die AHK-Community</p>
<p style="font-size:85%">Software-Lizenz: <a href="license.htm">GNU General Public License</a></p>
Expand Down
57 changes: 38 additions & 19 deletions Objects.htm
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,16 @@
<script src="static/tree.jquery.js" type="text/javascript"></script>
<script src="static/ga.js" type="text/javascript"></script>
<script src="static/content.js" type="text/javascript"></script>
<style>
ul.list_of_p p { margin: 0.5em 0; }
ul.list_of_p li { margin: 1em 0; }
</style>
</head>
<body>

<h1>Objekte</h1>

<p>Ein <i>Objekt</i> ist in AutoHotkey eine abstrakte Datenstruktur, das drei Grundfunktionen bereitstellt:</p>
<p>Ein <i>Objekt</i> ist in AutoHotkey ein abstrakter Datentyp, das drei Grundfunktionen bereitstellt:</p>
<ul>
<li>GET - Abrufen eines Wertes.</li>
<li>SET - Setzen eines Wertes.</li>
Expand Down Expand Up @@ -58,7 +62,7 @@ <h3 id="Usage_Simple_Arrays">Einfache Arrays</h3>
<pre>Array.<a href="objects/Object.htm#Insert">Insert</a>(Index, Wert, Wert2, ...)</pre>
<p>Entfernen eines Elements:</p>
<pre>EntfernterWert := Array.<a href="objects/Object.htm#Remove">Remove</a>(Index)</pre>
<p>Sofern Array nicht leer ist, können <a href="objects/Object.htm#MinMaxIndex">MinIndex</a> und <a href="objects/Object.htm#MinMaxIndex">MaxIndex</a> den niedrigsten und höchsten Index vom Array zurückgeben. Während der niedrigste Index fast immer 1 ist, wird MaxIndex üblicherweise die Anzahl der Elemente zurückgeben. Um die Inhalte des Arrays zu durchlaufen, benutzt man enweder den Index oder eine For-Schleife. Zum Beispiel:</p>
<p>Sofern Array nicht leer ist, können <a href="objects/Object.htm#MinMaxIndex">MinIndex</a> und <a href="objects/Object.htm#MinMaxIndex">MaxIndex</a> den niedrigsten und höchsten Index vom Array zurückgeben. Während der niedrigste Index fast immer 1 ist, wird MaxIndex üblicherweise die Anzahl der Elemente zurückgeben. Um die Inhalte des Arrays zu durchlaufen, benutzt man entweder den Index oder eine For-Schleife. Zum Beispiel:</p>
<pre>array := ["eins", "zwei", "drei"]

<em>; Iteriert von 1 bis Anzahl der Elemente:</em>
Expand Down Expand Up @@ -201,13 +205,19 @@ <h3 id="Usage_Arrays_of_Functions"><a name="FuncArrays"></a>Arrays mit Funktione
<p>Für die Abwärtskompatibilität wird die zweite Form <i>array</i> nicht als Parameter übergeben, wenn <code>array[A_Index]</code> einen Funktionsnamen statt einen Funktionsverweis enthält. Wenn aber <code>array[A_Index]</code> von <code>array.base[A_Index]</code> <a href="#Custom_Objects">geerbt</a> wurde, wird <i>array</i> als Parameter übergeben.</p>

<h2 id="Custom_Objects">Benutzerdefinierte Objekte</h2>
<p>Objekte in AutoHotkey basieren nicht auf Klassen, sondern auf Prototypen. Das heißt, dass ein Objekt die Eigenschaften und Methoden von seinem Prototyp oder <code>base</code>-Objekt erben kann, aber keine vordefinierte Struktur haben muss. Es ist jederzeit möglich, bei einem Objekt oder bei jedem Objekt, das davon abgeleitet wurde, Eigenschaften und Methoden hinzuzufügen oder zu entfernen. Allerdings wird AutoHotkey Klassen nachbilden, indem es <a href="#Custom_Classes">Klassendefinitionen</a> in gewöhnliche Objekte umwandelt. Bei komplexeren oder spezielleren Situationen kann das base-Objekt das Standardverhalten überschreiben, indem es <a href="#Meta_Functions"><i>Meta-Funktionen</i></a> definiert.</p>
<p>Um ein abgeleitetes Objekt von einem anderen Objekt zu erstellen, können Scripts ein <code>base</code> zuweisen oder das <code>new</code>-Schlüsselwort verwenden:</p>
<pre>baseObjekt := {foo: "bar"}
obj1 := Object(), obj1.base := baseObjekt
<p>Objekte, die vom Script erstellt wurden, müssen nicht zwingend eine vordefinierte Struktur haben. Stattdessen kann jedes Objekt Eigenschaften und Methoden von seinem <code>base</code>-Objekt (auch bekannt als "Prototyp" oder "Klasse") erben. Bei einem Objekt kann man jederzeit Eigenschaften und Methoden hinzufügen oder entfernen. Solche Änderungen haben auch Auswirkung auf alle abgeleiteten Objekte. Bei komplexeren oder spezielleren Situationen kann das base-Objekt das Standardverhalten überschreiben, indem es <a href="#Meta_Functions"><i>Meta-Funktionen</i></a> definiert.</p>
<p><em>Base</em>-Objekte sind ganz normale Objekte, die mit den folgenden zwei Möglichkeiten erstellt werden können:</p>
<pre>class baseObject {
static foo := "bar"
}
<em>; OR</em>
baseObject := {foo: "bar"}</pre>
<p>Um ein Objekt zu erstellen, das von einem anderen Objekt abgeleitet wurde, können Scripts die <code>base</code>-Eigenschaft zuweisen oder das <a href="#Custom_NewDelete"><code>new</code>-Schlüsselwort</a> verwenden:</p>
<pre>obj1 := Object(), obj1.base := baseObject
obj2 := {base: baseObjekt}
obj3 := new baseObjekt
MsgBox % obj1.foo " " obj2.foo " " obj3.foo</pre>
<p>Es ist jederzeit möglich, einem Objekt ein neues <code>base</code> zuzuweisen, das alle Eigenschaften und Methoden ersetzen würde, die das Objekt geerbt hat.</p>

<h3 id="Custom_Prototypes">Prototypen</h3>
<p>Prototypen oder <code>base</code>-Objekte können konstruiert und manipuliert werden, wie jedes andere Objekt auch. Zum Beispiel könnte ein gewöhnliches Objekt mit einer Eigenschaft und einer Methode wie folgt konstruiert werden:</p>
Expand Down Expand Up @@ -321,23 +331,32 @@ <h3 id="Meta_Functions">Meta-Funktionen</h3>

<i>Klassenname</i> := { __Get: Func("<i>MeinGet</i>"), __Set: Func("<i>MeinSet</i>"), __Call: Func("<i>MeinCall</i>") }
</pre>
<p>Meta-Funktionen sind Methoden, definiert über das base eines Objekts, die genau definieren können, wie das Objekt agieren soll, wenn ein unbekannter Key angefordert wird. Wenn <code>obj.key</code> beispielsweise leer wäre, würde es die <i>__Get</i>-Meta-Funktion aufrufen. Außerdem würde <code>obj.key := value</code> die Meta-Funktion <i>__Set</i> aufrufen und <code>obj.key()</code> die Meta-Funktion <i>__Call</i>.</p>
<p>In solchen Fällen wird das base-Objekt wie folgt aufgerufen:</p>
<p>Meta-Funktionen definieren, was passieren soll, wenn ein Key angefordert, aber nicht im Zielobjekt gefunden wird. Wenn <code>obj.key</code> beispielsweise leer wäre, würde es die <i>__Get</i>-Meta-Funktion aufrufen. Außerdem würde <code>obj.key := value</code> die Meta-Funktion <i>__Set</i> aufrufen und <code>obj.key()</code> die Meta-Funktion <i>__Call</i>. Diese Meta-Funktionen (oder Methoden) müssten in <code>obj.base</code>, <code>obj.base.base</code> oder ähnliches definiert werden.</p>
<p>Wenn das Script einen nicht vorhandenen Key im Zielobjekt abruft (get), setzt (set) oder aufruft (call), wird das base-Objekt wie folgt aufgerufen:</p>
<ul class="list_of_p">
<li>Definiert dieses base-Objekt die geeignete Meta-Funktion, rufe es auf. Wenn die Meta-Funktion explizit per <code>return</code> zurückgegeben wird, verwende den Rückgabewert als Ergebnis der Operation (was auch immer den Aufruf der Meta-Funktion verursacht hat) und übergebe die Kontrolle wieder an das Script. Ansonsten mache weiter wie unten beschrieben.
<p><i>Set</i>: Wenn die Meta-Funktion eine Zuweisung behandelt, sollte sie den zugewiesenen Wert zurückgeben. Auf diese Weise können Zuweisungen verkettet werden, wie in <code>a.x := b.y := z</code>. Der Rückgabewert könnte vom ursprünglichen Wert <code>z</code> abweichen (wenn beispielsweise Beschränkungen auferlegt werden, welche Werte zugewiesen werden können).</p></li>
<li>Ist dies eine <i>Get</i>- oder <i>Call</i>-Operation, suche einen passenden Key im eigenen Feld des base-Objekts.</li>
<li>Wenn kein einziger Key gefunden wurde, rufe das eigene base von diesem base-Objekt auf (wende dabei jeden dieser Schritte darauf an, beginnend vom Anfang der Liste). Sind wir noch nicht fertig, durchsuche dieses base-Objekt nochmals nach einen passendem Key, falls ein Key von einer Meta-Funktion hinzugefügt wurde.</li>
<li>Wenn mehrere Parameter bei <i>get</i> oder <i>set</i> angegeben wurden und ein Key gefunden wurde, überprüfe seinen Wert. Ist dieser Wert ein Objekt, rufe es auf, um die restlichen Parameter zu behandeln, und tue nichts weiter.</li>
<li>Wenn ein Key gefunden wurde,<br>
<i>Get</i>: Gebe den Wert zurück.<br>
<i>Call</i>: Wenn der Wert ein Funktionsname oder <a href="#Function_References">Verweis</a> ist, rufe es auf und übergebe dabei das Zielobjekt als ersten Parameter (<code>this</code>).</p></li>
</ul>
<p>Wenn eine Meta-Funktion einen passenden Key im Objekt beinhaltet, aber keinen <code>return</code> 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 <a href="#Subclassing_aoa">Mehrdimensionale Arrays bei Unterklassen</a>.</p>
<p>Wenn die Operation immer noch nicht behandelt wurde, überprüfe, ob es eine integrierte Methode oder Eigenschaft ist:</p>
<ul>
<li>Definiert dieses base-Objekt die geeignete Meta-Funktion, rufe es auf. Wird die Meta-Funktion explizit per <code>return</code> zurückgegeben, dient der Rückgabewert als Ergebnis der Operation und beendet die Verarbeitung.
<p><i>Set</i>: Wenn die Operation erfolgreich war, sollte <i>__Set</i> den neuen Wert des Feldes zurückgeben, der vom originalen Rückgabewert abweichen könnte. Auf diese Weise können Zuweisungen verkettet werden, wie in <code>a.x := b.y := z</code>. Ein leerer String sollte zurückgegeben werden, wenn die Zuweisung fehlschlägt, so dass das Script den Fehler erkennen kann.</p></li>
<li>Ist dies eine <i>Get</i>- oder <i>Call</i>-Operation, suche einen passenden Key im eigenen Feld des base-Objekts.
<p><i>Get</i>: Wurde er gefunden, wird der Wert von diesem Feld zurückgegeben.<br>
<i>Call</i>: Wurde er gefunden, wird die gespeicherte Funktion im Feld aufgerufen (per Name oder <a href="#Function_References">Verweis</a>) und das originale Zielobjekt als <i>this</i>-Parameter übergeben.</p></li>
<li>Rufe rekursiv sein eigenes base-Objekt auf. Auf diese Weise können die Eigenschaften eines Objekts von seinem base, base's base und so weiter "geerbt" werden.</li>
<li><i>Get</i>: Wenn der Key "base" ist, gebe das base des Objekts zurück.</li>
<li><i>Set</i>: Wenn der Key "base" ist, setze das base des Objekts (oder entferne es, wenn der Wert kein Objekt ist).</li>
<li><i>Call</i>: Rufe eine <a href="objects/Object.htm">integrierte Methode</a> auf, falls zutreffend.</li>
</ul>
<p>Wenn (und nur wenn) die Operation von keinem base-Objekt behandelt wird, wird die Verarbeitung wie gewohnt fortgesetzt:</p>
<p>Wenn die Operation immer noch nicht behandelt wurde,</p>
<ul>
<li><i>Get</i>: Wenn der Key "base" ist, wird das base des Objekts abgerufen.</li>
<li><i>Set</i>: Wenn der Key "base" ist, wird das base des Objekts gesetzt; Nicht-Objekt-Werte bewirken, dass das vorhandene base entfernt wird.
<p style="margin-left:2.6em;margin-top:0.25em;">Ansonsten wird ein neues Key-Value-Paar erstellt und in das Objekt gespeichert.</p></li>
<li><i>Call</i>: Eine <a href="objects/Object.htm">integrierte Methode</a> kann aufgerufen werden.</li>
<li><i>Get</i> und <i>Call</i>: Gebe einen leeren String zurück.</li>
<li><i>Set</i>: Wenn nur ein Key-Parameter angegeben wurde, speichere den Key und Wert in das Zielobjekt und gebe den zugewiesenen Wert zurück. Wenn mehrere Parameter angegeben wurden, erstelle ein neues Objekt und speichere es, und verwende dabei den ersten Parameter als Key; rufe dann das neue Objekt auf, um die restlichen Parameter zu behandeln. (Siehe <a href="#Usage_Arrays_of_Arrays">Mehrdimensionale Arrays</a>.)</li>

</ul>

<p><b>Bekannte Einschränkungen:</b></p>
<ul><li>Das Verwenden von <code>return</code> ohne Wert ist dasselbe wie <code>return ""</code>. Dies könnte in einer zukünftigen Version geändert werden, so dass man mit <code>return</code> aus einer Meta-Funktion "flüchten" kann, ohne dabei das Standardverhalten überschreiben zu müssen.</li>
<li>Siehe <a href="#ExitLimitation">Exit-Einschränkung</a>.</li></ul>
Expand Down
34 changes: 24 additions & 10 deletions commands/Gui.htm
Original file line number Diff line number Diff line change
Expand Up @@ -43,17 +43,31 @@ <h2>Inhaltsverzeichnis</h2>
<li><a href="#Examples">Beispiele</a>: Enthält funktionierende Scripts, die GUI-Fenster und Steuerelemente zeigen.</li>
</ul>

<h2 id="New">Gui, New [, Optionen, Titel] <span class="ver">[v1.1.04]</span></h2>
<p>Erstellt ein neues Fenster.</p>
<pre>Gui, New <em>; Erstellt ein neues unbenanntes GUI.</em>
Gui, Name:New <em>; Erstellt ein neues GUI und zerstört jedes vorhandene GUI mit diesem Namen.</em>
<h2 id="New">Gui, New [, Optionen, Titel] <span class="ver">[v1.1.04]+</span></h2>
<p>Erstellt ein neues Fenster und macht es zum <a href="#Default">Standard</a> für den aktuellen Thread.</p>
<pre>Gui, New <em>; Erstellt ein neues unbenanntes und nicht nummeriertes GUI.</em>
Gui, Name: New <em>; Erstellt ein neues GUI, und zerstört dabei jedes vorhandene GUI mit diesem Namen.</em>
</pre>
<p>Zur Vereinfachung wird das neue Fenster als <a href="#Default">Standard</a> für den aktuellen Thread definiert.</p>
<p>Wenn kein Name angegeben ist, haben spezielle <a href="#Labels">Label</a> wie <a href="#GuiClose"><em>GuiClose</em></a> standardmäßig das Präfix "Gui", sofern das nicht in den Optionen mit <a href="#PlusLabel">+Label<em>Präfix</em></a> überschrieben wird. Wenn das GUI, das den aktuellen Thread gestartet hat, auf diese Weise erstellt worden ist, enthält <a href="../Variables.htm#Gui">A_Gui</a> ein HWND, anstatt einen Namen. Desweiteren kann, wenn <a href="#GuiHwndOutputVar">+Hwnd<em>AusgabeVar</em></a> verwendet wird, das HWND des neuen Fensters in <em>AusgabeVar</em> gespeichert werden.</p>
<p>Falls ein Name angegeben ist, wird jedes vorhandene GUI mit diesem Namen <strong>zerstört</strong>.</p>
<p>Der <em>Optionen</em>-Parameter kann <a href="#Options">Optionen</a> enthalten, die vom Haupt-GUI-Befehl unterstützt werden.</p>
<p>Falls der <em>Titel</em>-Parameter nicht vorhanden ist, wird der Dateiname des Scripts verwendet.</p>
<p>Dieser Befehl wird empfohlen, weil er verständlicher ist - er ist nicht zwingend erforderlich. Wenn einer der anderen Gui-Unterbefehle (z. B. <a href="#Add">Gui, Add</a>) verwendet wird und das GUI nicht vorhanden ist, wird es automatisch erstellt.</p>
<p>Der <strong><em>Optionen</em></strong>-Parameter kann <a href="#Options">Optionen</a> enthalten, die vom Haupt-GUI-Befehl unterstützt werden.</p>
<p>Falls der <strong><em>Titel</em></strong>-Parameter nicht vorhanden ist, wird der Dateiname des Scripts verwendet.</p>
<p>Dieser Befehl kommt mit den folgenden Einschränkungen:</p>
<ul>
<li>In den meisten Fällen wird das Fenster bei Bedarf automatisch erstellt, daher muss <em>Gui New</em> üblicherweise nicht aufgerufen werden.</li>
<li>Auch wenn das neue Fenster zum <a href="#Default">Standard</a> für den <em>aktuellen</em> Thread gemacht wird, verwenden Nicht-GUI-Threads weiterhin eine <a href="#DefaultWin">GUI-Nummer von 1</a>.</li>
<li>Wenn das GUI keinen Namen hat und nicht das <a href="#Default">Standard-GUI</a> ist, muss es per HWND identifiziert werden. Mit der Option <code><a href="#GuiHwndOutputVar">+Hwnd<i>GuiHwnd</i></a></code> kann das HWND des neuen Fensters in die <em>GuiHwnd</em>-Variable gespeichert werden. Mit <code>Gui, %<i>GuiHwnd</i>%:Default</code> können andere Gui-Befehle dazu gebracht werden, sich auf dieses GUI-Fenster zu beziehen.</li>
</ul>
<p>Auf der positiven Seite:</p>
<ul>
<li>Das Aufrufen von <em>Gui New</em> stellt sicher, dass das Script ein neues GUI erstellt und nicht ein bereits Existierendes modifiziert. Es könnte auch den Zweck des Scripts für andere Leute (oder für dein zukünftiges Ich) deutlicher machen, die dein Code lesen.</li>
<li><em>Gui New</em> verhindert, dass ein eindeutiger Name oder Nummer für jedes GUI vergeben werden muss. Dies kann besonders nützlich sein, wenn das Script mehr als einen GUI erstellen muss, oder es in anderen Scripts enthalten sein soll.</li>
<li>Manchmal ist es intuitiver, den Fenstertitel nicht beim <a href="#Show">Anzeigen</a>, sondern beim Erstellen des GUIs zu setzen.</li>
</ul>

<p>Wenn kein Name angegeben wurde, gilt folgendes:</p>
<ul>
<li>Spezielle <a href="#Labels">Label</a> wie <a href="#GuiClose"><em>GuiClose</em></a> haben standardmäßig das Präfix "Gui", sofern das nicht in den Optionen mit <a href="#PlusLabel">+Label<em>Präfix</em></a> überschrieben wurde.</li>
<li>Wann immer das GUI einen neuen Thread startet, enthält <a href="../Variables.htm#Gui">A_Gui</a> einen HWND, anstatt einen Namen.</li>
</ul>
<p><strong>Hinweis</strong>: Vor v1.1.08 war dieser Befehl nicht in der Lage, das Standard-Gui zu setzen, falls ein Name angegeben war.</p>

<h2 id="Add">Gui, Add, Steuerelementart [, Optionen, Text]</h2>
Expand Down
Loading

0 comments on commit 333c41e

Please sign in to comment.