1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. BugFix

Beiträge von BugFix

  • Rueckgabewert ermitteln @error?

    • BugFix
    • 10. Oktober 2007 um 13:42

    Wenn kein Fehler auftritt ist @error i.A. 0
    Üblich ist den Rückgabewert einer Funktion bei Erfolg mit -1 zu setzen und bei Fehler mit 0

    Um individuelle Fehlerwerte zu vergeben arbeitest du mit SetError().
    z.B. übergebene Variable ist kein Array, obwohl Funktion das verlangt
    bzw.
    Array ist 2-dimensional, aber 1-dimensional wird verlangt.

    [autoit]

    Func FunctionXY($array)
    If Not IsArray($array) Then
    SetError(1)
    Return 0
    EndIf
    Dim $Dimension = UBound($array,2)
    If Not @error Then
    SetError(2)
    Return 0
    EndIf
    ;.....
    EndFunc

    [/autoit]


    Um eine Fehlerbehandlung einzuleiten setzt du einfach nach einem Befehlsaufruf:

    [autoit]

    If @error Then
    ; hier kannst du z.B. Fehlerwerte abfragen und entsprechend auswerten
    Switch @error
    Case 1
    MsgBox(0,'','Variable ist kein Array')
    Case 2
    MsgBox(0,'','Array ist 2-dimensional')
    EndSwitch
    EndIf

    [/autoit]
  • Gui für ein Tool

    • BugFix
    • 10. Oktober 2007 um 12:22

    Die Syntax von IniWriteSection lautet:
    IniWriteSection ( "filename", "section", "data", [Array Index] )

    Filename setzt du richtig, aber die Sektion läßt du per Input festlegen ??
    Ich glaube nicht, dass das gewollt ist. Einen Wert trägst du auch nicht ein. Zum anderen liest du $Input gar nicht aus.
    Falls die Sektion per Input gesetzt werden soll, müßte dies so aussehen:

    [autoit]

    IniWriteSection (@ScriptDir & "\sys\Data.ini",GUICtrlRead($Input), "data")

    [/autoit]


    Bedenke für die Form bei "data":
    Wenn du es als String eingibst:

    [autoit]

    $data = "key1=val1" & @LF & "key2=val2" & @LF & "key3=val3" ; usw.

    [/autoit]


    Verwendest du ein Array, ist als "data" der Arrayname anzugeben und dann noch der Index des StartEintrags.

  • Login_bewerkstelligen

    • BugFix
    • 10. Oktober 2007 um 11:22

    Hi,
    ich kann bei mir nichts testen, aber einen Fehler sehe ich.
    Du arbeitest mit _IEFormElementGetCollection() ohne auf eine Form Bezug zu nehmen.

    Das sollte so aussehen (Bsp. aus der Hilfe)

    [autoit]

    $oIE = _IECreate ("http://www.google.com")
    $oForm = _IEFormGetCollection ($oIE, 0)
    $oQuery = _IEFormElementGetCollection ($oForm, 1)

    [/autoit]
  • Menü-Punkt überprüfen

    • BugFix
    • 10. Oktober 2007 um 10:29

    Windows ist in vielen Anwendungen nicht bereit einen Zugriff auf seine Controls zuzulassen. Die Menüleiste des Taskmanagers scheint auch dazu zu gehören.
    Wenn du kein Handle für ein Control hast, kannst du es weder Auslesen noch manipulieren.

    Die Tatsache, dass dir niemand antwortete, ist also einzig dem Umstand geschuldet, dass hier niemand einen Lösungsweg weiß.
    Auch das kommt vor. ;)

  • COM Funktion

    • BugFix
    • 10. Oktober 2007 um 10:03

    Hi und :willkommen:

    Zitat

    Wie kann ich in Autoit Variablentypen deklarieren? Was macht Autoit bei einer Deklaration mit DIM eigentlich? Wird die Variable automatisch den Anforderungen angepasst?

    Grundsätzlich definierst du die Variablen für ihren Space (also Global, Local, Dim).
    Der Variablentyp wird dabei der momentanen Verwendung angepaßt.
    Bsp.:

    [autoit]

    Dim $Zahl1 = 1
    Dim $String1 = "5"
    MsgBox(0, '', $Zahl1 + $String1) ; liefert 6

    [/autoit]

    Du kannst eine bestimmte Verwendung erzwingen mit Number($var) oder String($var).
    Eine Ausnahme bildet der Variablentyp Array. Arrayvariablen müssen auch als solche deklariert werden.
    z.B. Dim $array[10][2]
    Einige Funktionen liefern ein Array zurück (z.B. _FileReadToArray). Hier ist die Variable nur namentlich ohne Dimensionen zu deklarieren.
    Dim $arFile
    _FileReadToArray($FilePath, $arFile)

    Zu deiner Problemstellung kann ich momentan nicht viel sagen. Vielleicht hilft es GetStagePositionD als Array zu definieren:

    [autoit]

    Dim $GetStagePositionD[6] = [ $x, $y, $z, $t, $r, $m ]

    [/autoit]

    Aber ich habe keine Möglichkeit das zu testen.

  • Gui für ein Tool

    • BugFix
    • 10. Oktober 2007 um 09:34
    Zitat

    1. Wie kann ich Menuitems als Defaults speichern?
    2. Wie kann ich die angeklickten Dinge am besten abspeichern?
    3. Edit1: Wie kann ich das Programm in 2 Sprachen machen?
    4. Edit2: Wie kann ich @SWHIDE einsetzen?

    zu 1.
    Erkläre bitte genauer was du meinst. Wenn du MenuItems erstellst erscheinen alle Einträge in diesem Menü. Beim Öffnen des Menüs bekommt das erste Item automatisch den Focus. Du kannst zwar mit "GUICtrlSetState(-1,$GUI_FOCUS)" jedem Item den Focus geben, das führt aber zu einem Konflikt mit dem Standardfocus und durch <Enter> wird keine Aktion beim fokussierten Item ausgelöst. (zumindest ist das mein Testergebnis)

    zu 2.
    Dauerhaft speichern oder nur während der Sitzung?
    Dauerhaft: INI oder Textdatei
    Sitzung: Variable

    zu 3.
    INI erstellen mit verfübaren Sprachen:

    Code
    [DE]
    txt1=Menü
    txt2=Datei
    txt3=Öffnen
    ......
    [EN]
    txt1=Menu
    txt2=File
    txt3=Open
    ......


    Beim Programmstart Sprache abfragen und entsprechende Textvariablen einlesen.

    [autoit]

    If @OSLang = "0407" Then
    $arTXT = IniReadSection($INIPath, "DE")
    ElseIf @OSLang = "0409" Or @OSLang = "0809" Then
    $arTXT = IniReadSection($INIPath, "EN")
    EndIf

    [/autoit]

    zu4.
    Schau dir GUISetState() an.

  • 2 Guis in 1x

    • BugFix
    • 9. Oktober 2007 um 22:41

    Machs so:

    Spoiler anzeigen
    [autoit]

    While 1
    $msg = GUIGetMsg(1)
    Switch $msg[1]
    Case $gui1 ; Programm beenden
    Switch $msg[0]
    Case $GUI_EVENT_CLOSE
    Exit
    Case $btnOpenGUI2
    GUISetState(@SW_SHOW, $gui2)
    GUISetState(@SW_HIDE, $gui1) ; GUI 1 ausblenden
    ; Case andere Controls

    EndSwitch
    Case $gui2
    Switch $msg[0]
    Case $GUI_EVENT_CLOSE
    GUISetState(@SW_HIDE, $gui2) ; GUI 2 schließen
    GUISetState(@SW_SHOW, $gui1) ; GUI 1 einblenden
    ; Case andere Controls

    [/autoit] [autoit][/autoit] [autoit]

    EndSwitch
    EndSwitch
    WEnd

    [/autoit]
  • 2 Guis in 1x

    • BugFix
    • 9. Oktober 2007 um 22:29

    Ich weiß ja nicht, wann du möchtest, dass sie geöffnet wird.

    Und achte darauf, dass du verschiedene Namen für die Controls und GUI wählst. Sonst gibt es Kollisionen.
    In deinem obigen Bsp. ist ja alles doppelt.

  • 2 Guis in 1x

    • BugFix
    • 9. Oktober 2007 um 22:06

    Mal ein Bsp. für 2 GUImit den ID's $gui1 und $gui2

    [autoit]

    While 1
    $msg = GUIGetMsg(1)
    If $msg[0] = $GUI_EVENT_CLOSE Then
    Switch $msg[1]
    Case $gui1 ; Programm beenden
    Exit
    Case $gui2
    GUISetState(@SW_HIDE, $gui2) ; GUI 2 schließen
    EndSwitch
    EndIf
    WEnd

    [/autoit]
  • 2 Guis in 1x

    • BugFix
    • 9. Oktober 2007 um 21:54

    Schau mal GUIGetMsg(1)
    Damit bekommst du ein Array zurück, das auch die ID der GUI enthält, von der das Ereignis kommt.
    Wenn $GUI_EVENT_CLOSE dann fragen von welcher ID und entsprechend Fenster schließen oder Exit.

  • Werte aus csv in Programm eintragen

    • BugFix
    • 9. Oktober 2007 um 21:24

    Du kannst zeilenweise oder spaltenweise vorgehen. Die Entscheidung können wir dir nicht abnehmen.;-)
    Auch ob du jeden Wert sofort nach dem Lesen in die Combo einfügst oder erst alles in ein Array liest hängt davon ab, ob du evtl. wiederholt auf diese Daten zugreifen mußt. Dann wäre die Arrayvariante zu bevorzugen.

    Befehle? - Steht sehr schön in der Hilfe ;)
    Aber ich bin mal nicht so.

    csv-Datei einlesen: _FileReadToArray()
    aufsplitten: StringSplit()
    Combo befüllen: _GUICtrlComboAddString()

  • Millisekunden ermitteln und ausdrücken...

    • BugFix
    • 9. Oktober 2007 um 18:10

    Hi,
    also jede Milisekunde kannst du nicht erwischen. Weil ja schon Zeit verstreicht zur Befehlsausführung. Außerdem müßtest du dann eine Schleife ohne Sleep laufen lassen und hättest 100% CPU-Last. ;)

    Ich habe hier eine Variante mit einem Sleep von 10. Wenn du die Werte in die Konsole ausgibst, siehst du dass die kürzeste Zeitdifferenz bei etwa 2-3 /10 Sekunden liegt.
    Ich hoffe diese Genauigkeit ist ausreichend.

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    Opt("GUIOnEventMode", 1)
    $Form1 = GUICreate("Form1", 427, 223, -1, -1)
    GUISetOnEvent($GUI_EVENT_CLOSE, "Form1Close")
    $Label1 = GUICtrlCreateLabel("Zeit: ", 60, 58, 295, 17)
    GUISetState(@SW_SHOW)
    $hundertstel_Sec = 0
    $diff = 0
    $start = TimerInit()

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    Sleep(10)
    $diff = TimerDiff($start)
    $hundertstel_Sec = StringRight('00' & $diff, 3)
    If $diff >= 1000 Then $start = TimerInit()
    GUICtrlSetData($Label1, "Zeit: " & @HOUR & ':' & @MIN & ':' & @SEC & ',' & $hundertstel_Sec & @CRLF)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func Form1Close()
    Exit
    EndFunc

    [/autoit]
  • Rückgabewert auswerten / Progessbar

    • BugFix
    • 9. Oktober 2007 um 12:31

    Hi,
    verwende doch einfach eine Log-Datei und leite die Auswertung der einzelnen Programmschritte sofort dahin um.
    Hier mal ein Bsp.:

    Spoiler anzeigen
    [autoit]

    #include <File.au3>
    Global $LogFile = 'LOG-DATEI'

    [/autoit] [autoit][/autoit] [autoit]

    If _MyFunc() = -1 Then ; Funktionsaufruf mit gleichzeitiger Log-Funktion
    _FileWriteLog($LogTxt, '_MyFunc() Fehler: ' & @error)
    Else
    _FileWriteLog($LogTxt, '_MyFunc() OK')
    EndIf

    Func _MyFunc()
    ; Code
    ; Fehlerroutine (Eingaben abfragen etc.)
    ; wenn Fehler. SetError() evtl. je nach Fehler ErrorNummer setzen
    If @error Then
    Return -1 ; oder ErrorNummer mit @error
    Else
    Return 0 ; oder Funktionsergebnis
    EndIf
    EndFunc

    [/autoit]

    Die Progressbar setzt du ja sofort in einer Schleife. Klar, dass dann nichts anderes passiert.

    Du mußt die Anzahl der einzelnen Programmschritte/Funktionsaufrufe ermitteln.
    Nach jedem dieser Schritte setzt du dann die Progressbar.

  • Splash - GUI Generator

    • BugFix
    • 7. Oktober 2007 um 22:36

    Hi,
    im Zuge der Erstellung dieses Programms sind zwei Tools entstanden, die ich euch ja schon vorgestellt habe:
    - FormatControls und
    - GetFontPixelSize

    Mit diesem Programm könnt ihr auf einer GUI alle erforderlichen Parameter für eure Splash-GUI zusammenstellen.
    Features:
    - Splash-GUI als Stand-Alone oder Child
    - Position mit absoluten Koordinaten oder relativ per Schemawahl (links oben, mitte oben usw.)
    - Formatierung Text für alle Zeilen gleich (dabei sind Leerzeilen nicht möglich!) oder jede Zeile einzeln (Formatoptionen festlegen, Cursor in entsprechende Zeile stellen und übernehmen)
    - Labelhöhe wird an die Pixelhöhe der Schrift automatisch angepaßt (1,5-fache Pixelhöhe)
    Hierzu wird eine Test-GUI aufgerufen, die Zeichenfolge 'qÄ' dort gesetzt in der definierten Schrift und Schriftgrad. Per Pixelsearch wird dann die vertikale Platzbelegung in Pixeln ermittelt. Wahrzunehmen ist dies nur durch ein kurzes Flackern.
    - Abstand zum nächsten Label 0,5-fache Höhe des letzten Labels
    - automatische Anpassung der GUI-Höhe, falls durch die Label die gesetzte Größe überschritten wird
    - Vorschaufunktion Inhalt, (gewählte Position wird dabei nicht berücksichtigt)
    - Löschfunktion, falls Aussehen nicht wie gewünscht
    - Beim Beenden des Programms wird der dann komplette Code generiert und in die Zwischenablage kopiert.
    Ein GUISetState() und While-Schleife sind nicht enthalten, da es ja keine eigenständigen Programmoberflächen werden, sondern halt "bessere Messageboxen".

    Also dann testet mal schön.
    Solltet ihr Bugs entdecken - nur her damit.
    Ich erwarte euer Feedback ;)

    Der Code kann nicht gezeigt werden, jetzt sind nur noch 10.000 Zeichen max. zulässig.

    Hier mal zum Anschauen:

    Spoiler anzeigen

    [Blockierte Grafik: http://home.arcor.de/bugfix/splashgenerator.PNG]

    Edit: Neue, angepaßte Version hochgeladen.

    Dateien

    SplashGUI_Builder.au3 26,03 kB – 790 Downloads
  • Sleep-Zeit und Fehler in Schleife

    • BugFix
    • 7. Oktober 2007 um 13:41
    Zitat

    Original von inscape

    Da Checkt er das mit der Farbe irgendwie überhaupt nicht :(

    Das hat aber definitiv nichts mit der Wahl der Schleife zu tun.
    Debugge doch mal dein Programm.
    Laß dir jede Variable, die sich ändern kann/soll in die Konsole ausgeben. Dann siehst du am ehesten, wo es hakt.

  • Sleep-Zeit und Fehler in Schleife

    • BugFix
    • 7. Oktober 2007 um 10:41

    Was genau soll das eigentlich werden?

  • Frage bezüglich Send()

    • BugFix
    • 7. Oktober 2007 um 00:04

    Aha,mit Send(), hast du vorher nicht erwähnt.

    Send("ß")
    Send("´")

    Was willst du überhaupt wegen Alt ?

  • Frage bezüglich Send()

    • BugFix
    • 6. Oktober 2007 um 23:46

    Wohin willst du was senden? Bitte etwas genauer.

  • Datei erschaffen und Inhalt anzeigen lassen

    • BugFix
    • 6. Oktober 2007 um 21:56

    Da schau dir mal ShellExecute() an. Das dürfte dein Problem lösen.

    Ich habe den zweiten Code mal etwas korrigiert. Aber ungetestet. Wie gesagt: Schmeiß RunDOS raus.

    Spoiler anzeigen
    [autoit]

    $otext = InputBox("Überschreiben vorbereiten", "Geben sie bitte die neuen Daten ein")
    $ofile = FileOpen("FileTest.txt", 2)

    If $ofile = -1 Then
    MsgBox(0, "Error", "This Baby Got A Temper!!!")
    Sleep(250)
    Exit
    EndIf

    ;~ FileWrite("FileTest.txt", 1) Bereits zum Überschreiben geöffnet in Zeile 2
    For $o = 1 to 10 step 1
    FileWrite($ofile, $otext & @CRLF)
    Sleep(100)
    Next

    [/autoit] [autoit][/autoit] [autoit]

    ; FileHandle schließen!!
    FileClose($ofile)

    [/autoit] [autoit][/autoit] [autoit]

    Sleep(1000)
    _RunDOS("start notepad.exe " & @WorkingDir & "\FileTest.txt")
    Sleep(1000)
    WinWaitActive("FileTest.txt - Editor")
    Sleep(1000)
    WinKill("FileTest.txt - Editor")
    MsgBox(0, "End", "That's All Folks")

    [/autoit]


    Achja:

    [ SPOILER ][ AUTOIT ]
    Code
    [ /AUTOIT ][ /SPOILER ]

    ohne Leerzeichen in den Tags.

  • warteschleife

    • BugFix
    • 6. Oktober 2007 um 21:47
    Zitat

    aber wo bekomm ich diese data.au3 her?

    Das ist Bestandteil von AutoIt und liegt im Ordner "...AutoIt3\Include\".

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™