Danke für den Link, water. Ich werd's dort posten.
Beiträge von ThPfund
-
-
Habe mich zufällig heute mittag auch mit dem Thema beschäftigt.
In der Hilfe steht, dass ReDim ein Array neu dimensioniert und die darin enthaltenen Werte erhalten bleiben wenn dies von der Größe her möglich ist. Bei Dim werden die Werte hingegen gelöscht. Genau dies brauche ich für meine Anwendung. Hab's getestet und es funktioniert.
Aufgrund des hier geschriebenen habe ich jetzt Dim durch Local ersetzt und das funktioniert auch.
Insofern sollte die Hilfe entsprechend ergänzt werden. -
Herzlichen Glückwunsch und alles Gute zu Deinem Geburtstag!
Praktisch, dass er auf einen Samstag fällt. Feier schön.
Thomas -
Zu #17
Gut, dann sind wir uns doch irgendwie über Dimensionen, Indexe, Zeilen und Spalten einig und dass die Werte $array[0][0 bis 5] des Beispiels gebraucht werden.Zu #18
Ja. Gefragt war zunächst nur, ob der Wert im Array enthalten ist. Den Charme Deiner Lösung habe ich aber auch erkannt und sie bereits in meine Snippet-Sammlung übernommen.So ich klinke mich jetzt aus diesem Thread aus, bedanke mich für die engagierte Diskussion und wünsche allen noch ein schönes Wochende.
-
Die erste Dimension ist die erste Spalte also 76 und 0.
Nein, der Eintrag in der zweiten Dimension bestimmt die Spaltenzahl. Und ihr Index benennt dann die konkrete Spalte.
Schau mal an, wie sich der Aufbau in _ArrayDisplay() verändert , wenn Du nacheinander folgende Arrays betrachtest:Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
#include <Array.au3>Local $array[2][1] ; [ersteDim][zweiteDim]
[/autoit]
_ArrayDisplay($array)
ReDim $array[2][2]
_ArrayDisplay($array)
ReDim $array[2][3]
_ArrayDisplay($array)
ReDim $array[2][4]
_ArrayDisplay($array)
ReDim $array[2][5]
_ArrayDisplay($array)
ReDim $array[2][6]
_ArrayDisplay($array) -
Das ist jetzt wohl richtig so. Und: Ja, klar meine Funktion ist ein Vorschlag, den man bedarfsgerecht anpassen kann.
Ich habe aber noch Zweifel an der Gesamtkonstruktion. Bloß noch mal zum gemeinsamen Verständnis mit den Dimensionen:
$array[1.Dim.][2.Dim.]
$array[Zeilen][Spalten]
$array[2][6] = [[76, 67, 58, 57, 56, 55],[0, 0, 0, 0, 0, 0]]
Ergebnis ArrayDisplay:
[0] | 76 | 67 | 58 | 57 | 56 | 55
[1] | 0 | 0 | 0 | 0 | 0 | 0
Dies ist bestimmt ein vereinfachtes Beispiel.
Ist es in der Original-Anwendung wirklich beabsichtigt, nur die erste Zeile zu durchsuchen? -
Hier der Vollständigkeit halber noch meine korrigierte Funktion. Ursache war falsche Parameterangabe im Ubound (und späte Uhrzeit)
Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
#include <Array.au3>
Global $array[2][6] = [[76, 67, 58, 57, 56, 55],[0, 0, 0, 0, 0, 0]]MsgBox(0, "76", _MySearch(76)) ; => True
[/autoit] [autoit][/autoit] [autoit]
MsgBox(0, "60", _MySearch(60)) ; => False
MsgBox(0, "55", _MySearch(55)) ; => True
MsgBox(0, " 0", _MySearch(0)) ; => TrueFunc _MySearch($Wert)
[/autoit]
Local $i, $k
For $i = 0 To UBound($array, 1) - 1
For $k = 0 To UBound($array, 2) - 1
If $array[$i][$k] = $Wert Then Return (True)
Next
Next
Return (False)
EndFunc ;==>_MySearch -
@ m-obi
Wird der 8.Parameter ($iSubItem) nicht angegeben, steht er standardmäßig auf -1.
Und dann wird das ganze 2-dim. Array durchsucht, mit allen Spalten, s. Zeile 7.Spoiler anzeigen
[autoit]
[/autoit]
Func _ArraySearch( ..., $iSubItem = -1)
...
Case 2 ; 2D array search
Local $iUBoundSub = UBound($avArray, 2) - 1
If $iSubItem > $iUBoundSub Then $iSubItem = $iUBoundSub
If $iSubItem < 0 Then
; will search for all Col
$iSubItem = 0
Else
$iUBoundSub = $iSubItem
EndIf
...
Ich glaube, die Dokumentation sollte da noch etwas deutlicher werden. Werde gelegentlich mal was dazu schreiben. -
Hab mir die Funktion _ArraySearch() jetzt mal genauer angeschaut.
So wie ich das sehe, liefert sie - keine anderen Fehler vorausgesetzt - die Position in der 1. Dimension zurück.
Beim 1-dim.Array entspricht dies dem tatsächlichen Index, wo sich der Wert befindet.
Beim 2.dim. Array macht sie es auch so, auch wenn sich der Wert in der 2. Dimension befindet, da sie ja nur 1 Rückgabewert hat.D.h., in Deinem Beispiel mit [2][6] beginnt der Index mit 0, der Wert 58 z.B. befindet sich an [0][2], also ist der Rückgabewert 0. Falls nicht gefunden @error=6.
Im zweiten Hilfebeispiel kann der Autor Zeile und Spalte schön ausgeben, da er ja die Spalte beim Suchen schon vorgibt...
-
Was ich noch zu _ArraySearch() sagen wollte:
Der ReturnCode ist laut Hilfebeschreibung so zu interpretieren
$test >= 0 Position, an der Suchwert gefunden wurde
$test -1 Fehler, siehe @error
@error = 6 Wert nicht gefundenDu hast zum Debuggen mit dem ConsoleWrite() den richtigen Ansatz, allerdings wird von _ArraySearch() bei dieser und verschiedenen anderen Parameter-Konstellationen @error nicht gesetzt, insofern kommen wir da nicht weiter. Dazu müsste man einen Blick auf die Funktion _ArraySearch() im Include Array.au3 werfen, wie dort mit den Parametern umgegangen wird...
-
Mit _ArraySearch() kriege ich das nach einigem probieren auch nicht hin.
Hab ne andere Lösung (nicht ganz ausgetestet, ist ja aber auch schon spät...)Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
#include <Array.au3>
Global $array[2][6] = [[76, 67, 58, 57, 56, 55],[0, 0, 0, 0, 0, 0]]MsgBox(0, "", _Search(60))
[/autoit] [autoit][/autoit] [autoit]
MsgBox(0, "", _Search(67))Func _Search($Wert)
[/autoit] [autoit][/autoit] [autoit][/autoit]
Local $i, $k, $found = False
For $i = 0 To UBound($array, 0) - 1
For $k = 0 To UBound($array, 1) - 1
If $array[$i][$k] = $Wert Then Return (True)
Next
Next
Return (False)
EndFunc ;==>_Search -
Hatte leider keine Zeit, mich länger damit zu beschäftigen, aber das hilft Dir vielleicht weiter:
Ob ein bestimmter Button den Fokus hat, kannst Du mit "_GUICtrlButton_GetFocus($hdl) = True" ermitteln
(braucht #include <GuiButton.au3>).Ich hab's mal quick and dirty beim Verlassen der Hauptschleife eingefügt:
Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GuiButton.au3> ; Zusätzlich eingefügt
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <WinAPI.au3>$Form1 = GUICreate("Form1", 607, 206, 252, 144)
[/autoit] [autoit][/autoit] [autoit]
$Input1 = GUICtrlCreateInput("Input1", 24, 40, 121, 21)
$Button1 = GUICtrlCreateButton("Button1", 24, 96, 163, 73, $WS_GROUP)
$Button2 = GUICtrlCreateButton("Button2", 200, 96, 163, 73, $WS_GROUP)
$Button3 = GUICtrlCreateButton("Button3", 376, 96, 171, 73, $WS_GROUP)ControlFocus($Form1, "", 3)
[/autoit] [autoit][/autoit] [autoit]GUISetState(@SW_SHOW)
[/autoit] [autoit][/autoit] [autoit]
#endregion ### END Koda GUI section ###Local $control = ControlGetFocus($Form1)
[/autoit] [autoit][/autoit] [autoit]
Local $hHandle = ControlGetHandle($Form1, "", $control); Handle des selektierten Controls holen
Local $ICtrlId = _WinAPI_GetDlgCtrlID($hHandle); CtrlId aus dem Handle erstellen
MsgBox(0, "", $control)While 1
[/autoit] [autoit][/autoit] [autoit]
$nMsg = GUIGetMsg()Switch $nMsg
[/autoit] [autoit][/autoit] [autoit]
Case $GUI_EVENT_CLOSE
If _GUICtrlButton_GetFocus($Button1) = True Then ; provisorisch eingefügt
MsgBox(0, "", "Button1 hat den Fokus")
ElseIf _GUICtrlButton_GetFocus($Button2) = True Then
MsgBox(0, "", "Button2 hat den Fokus")
ElseIf _GUICtrlButton_GetFocus($Button3) = True Then
MsgBox(0, "", "Button3 hat den Fokus")
Else
MsgBox(0, "", "Kein Button hat den Fokus")
EndIfExit
[/autoit] [autoit][/autoit] [autoit]
EndSwitch
WEndFunc _Focus()
[/autoit] [autoit][/autoit] [autoit]EndFunc ;==>_Focus
[/autoit] [autoit][/autoit] [autoit][/autoit]Weitere Vorgehensweise wäre für mich dann:
1. Abfrage ob Tab-Taste gedrückt, in der Haupschleife
2. Ermitteln welcher Button den Fokus hat
3. Entweder einen größeren Button oder ggf. Child-Fenster darüber legen
4. Bei Fokus-Verlust diesen wieder löschen und die neue Konstellation abfragen
...
-
Hallo Crys,
so müsste es gehen:
Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
#include <GuiRichEdit.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>Local $gui, $iMsg, $hRichEdit, $text, $farbe = 0x99B4D1
[/autoit] [autoit][/autoit] [autoit]$text = "{\rtf1"
[/autoit] [autoit][/autoit] [autoit]
$text &= "Das ist {\b der} erste Absatz."
$text &= "\par Und das {\b ist der} zweite Absatz."
$text &= "}"$gui = GUICreate("Beispiel", 320, 350, -1, -1)
[/autoit] [autoit][/autoit] [autoit]
GUISetBkColor($farbe)$hRichEdit = _GUICtrlRichEdit_Create($gui, $text, 10, 10, 300, 220, _
[/autoit] [autoit][/autoit] [autoit]
BitOR($ES_MULTILINE, $ES_READONLY), $WS_EX_TRANSPARENT)
_GUICtrlRichEdit_HideSelection($hRichEdit)
GUISetState()While True
[/autoit] [autoit][/autoit] [autoit][/autoit]
$iMsg = GUIGetMsg()
Select
Case $iMsg = $GUI_EVENT_CLOSE
GUIDelete()
Exit
EndSelect
WEnd -
autoBert: Ich hatte in einem der Vorposts als Beispiel Sleep(500) genannt. Nach dem das für die Anwendung wohl zu lang ist habe ich darauf hingewiesen, dass es durch Veränderung des Parameters auch kürzer geht und das neue Beispiel ohne in der Hilfe nachzuschauen in einem Anflug von Ironie mit (1) extrem gewählt. Auch wenn der Mindestwert 10 beträgt, bin ich zuversichtlich, dass sich zwischen 10 und 500 Millisekunden ein passender Wert finden läßt. Der wäre dann für die Anwendung vom Threadersteller durch ausprobieren zu ermitteln. Ich weiss ja nicht, wie er es genau haben möchte, falls er überhaupt diese Alternative wählt.
-
Hallo Le solutionneur,
herzlich willkommen im deutschen AutoIt-Forum!
Du wirst sehen, dass es hier viele aktive Mitglieder gibt, die Fragen schnell beantworten und viele interessante Themen diskutieren.
Ich schaue manchmal auch bei "autoitscript.fr" vorbei.
Bienvenue et bonne chance -
Naja, durch Verkleinern des Parameters geht es ja auch mit weniger Millisekunden, z.B. Sleep(1)...
Aber ich habe noch was zu den Umlauten für Dich:
Spoiler anzeigen
[autoit]
[/autoit]
Case _IsPressed(Hex(222))
MsgBox(0, "Umlaut", "ä")
Case _IsPressed(Hex(192))
MsgBox(0, "Umlaut", "ö")
Case _IsPressed(Hex(186))
MsgBox(0, "Umlaut", "ü")
Case _IsPressed(Hex(219))
MsgBox(0, "Eszett", "ß")
Für die Großbuchstaben sehe ich nur eine Möglichkeit in Zusammenhang mit der Umschalttaste:Spoiler anzeigen
[autoit]
[/autoit]
Case _IsPressed("A0") ; linke Umschalttaste
Select
Case _IsPressed(Hex(222))
MsgBox(0, "Umlaut", "Ä")
Case _IsPressed(Hex(192))
MsgBox(0, "Umlaut", "Ö")
Case _IsPressed(Hex(186))
MsgBox(0, "Umlaut", "Ü")
EndSelect
Case _IsPressed("A1") ; rechte Umschalttaste
Select
Case _IsPressed(Hex(222))
MsgBox(0, "Umlaut", "Ä")
Case _IsPressed(Hex(192))
MsgBox(0, "Umlaut", "Ö")
Case _IsPressed(Hex(186))
MsgBox(0, "Umlaut", "Ü")
EndSelect
Achtung, dieser zweite Block muss vor dem ersten stehen, ich wollte nur erst mit dem einfacheren Teil beginnen.
Hoffe, das hilft Dir weiter. Wenn jemand eine einfachere Möglichkeit weiss, wäre das für mich auch interessant. -
Ich machs so:
Spoiler anzeigen
[autoit]
[/autoit]
While 1
if _isPressed(42) then
blub()
Sleep(500)
endif
wend -
So müsste es gehen:
Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
Local $FileName = "Bild.jpg"
Local $Handle = FileOpen($FileName, 16) ;Read(0) + Binary(16) = 16
Local $BinaryString = FileRead($Handle)
FileClose($Handle)$Handle = FileOpen("Neu" & $FileName, 18) ;Write(2) + Binary(16) = 18
[/autoit]
FileWrite($Handle, $BinaryString)
FileClose($Handle) -
So, nun habe ich das Beispiel von http://www.thorsten-willert.de/
ganz zum laufen gebracht:Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
#include <FF.au3>_FFConnect() ; eine Verbindung zu FireFox (FF) aufbauen
[/autoit] [autoit][/autoit] [autoit]If _FFIsConnected() Then ; überprüfen ob die Verbindung besteht
[/autoit] [autoit][/autoit] [autoit]
_FFOpenURL("http://ff-au3-example.thorsten-willert.de/") ; eine Seite öffnen; herunterscrollen, damit man sieht was gemacht wird
[/autoit] [autoit][/autoit] [autoit]
; das ist für die Anwendung nicht notwendig
_FFAction("ScrollXY", 0, 300); und ein Formular ausfüllen
[/autoit] [autoit][/autoit] [autoit]
_FFSetValue("Max", "fname", "name")
_FFSetValue("Mustermann", "lname", "name"); Achtung: Falsche Parameterreihenfolge im Musterbeispiel
[/autoit]
;_FFSetValue("fname", "Max", "name")
;_FFSetValue("lname", "Mustermann", "name")
; ...
Else
MsgBox(64, "Fehler:", "Es konnte keine Verbindung zu FF hergestellt werden.")
EndIf
Aus der dort stehenden Referenzbeschreibung der Funktionen war zu sehen, dass die Reihenfolge der Parameter im Muster vertauscht war.
Ergebnis der Formulareingabe siehe angefügtes Bild.
Ich hoffe, das hilft schon mal weiter. -
Ich hab jetzt mal folgendes gemacht:
Von http://www.thorsten-willert.de/ die FF.au3 heruntergeladen.
Er gibt unter "Software; Windows - FF.au3 - Info" den Hinweis, dass in Verbindung mit der UDF das FireFox Addon MozRepl, nötig ist, um FireFox fernzusteuern.Nach Installation des Addons und FF-Neustart habe ich es in FF (7.0.1) mit
Extras - MozRepl - Start
gestartet.Mit dem Beispielcode von Thorsten Willert (dort auch unter Info), konnte ich eine Beispielseite aufrufen. Die Aktivitäten werden in der Scite-Konsole protokolliert.
Die im Muster vorgesehen Formulareingabe habe ich allerdings noch nicht hinbekommen.