Frage zu @error

  • Hallo liebe AutoIt leute,

    wie schon in der Überschrift steht habe ich eine frage zu @error.
    Ich habe schon im Forum gesucht und leider auch nichts gefunden das mir irgendwie weiter hilft.

    Ich möchte wie hier in diesem Beispiel wenn das normale Speichern nicht funktioniert, das er das Speichern Dialog öffnet, aber nur dann.

    Hier der Beispiel Code:

    Spoiler anzeigen
    [autoit]


    ; Das normal Speichern
    $fileopen = FileOpen($open, 2)
    FileWrite($fileopen, GUICtrlRead($edit))
    FileClose($fileopen)

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

    ; Falls nicht klappt dann des Speichern Dialog
    $save = FileSaveDialog("Speichern unter...", @DesktopDir, "Textdokument (*.txt)|Alle Dateien (*.*)")
    If $save Then $save &=".txt"
    FileWrite($save, (GUICtrlRead($edit)))

    [/autoit]

    Ich bedanke mich schon mal im vorraus.

    MfG

    M3HM3T

  • also normalerweise fragste ihn was in etwa so

    Spoiler anzeigen
    [autoit]

    If @error Then
    $save = FileSaveDialog("Speichern unter...", @DesktopDir, "Textdokument (*.txt)|Alle Dateien (*.*)")
    If $save Then $save &=".txt"
    FileWrite($save, (GUICtrlRead($edit)))
    else
    $fileopen = FileOpen($open, 2)
    FileWrite($fileopen, GUICtrlRead($edit))
    FileClose($fileopen)

    [/autoit]

    allerdings nicht getestet

  • Hi,
    also mit dem Script kann man das nicht wirklich ausprobieren, da es nicht vollständifg ist.

    Aber normalerweise macht man das einfach mit einer If-then abfrage.

    [autoit]

    If @error then
    ...
    ...
    endif

    [/autoit]
  • Danke für eure schnelle antworten, ich werde es mal so ausprobieren. :)
    Ich weiß zwar schon das es mit If abgefragt wird aber ich wusste nicht genau wie es aufgebaut werden muss.

  • Sorry aber das funktioniert nicht.
    Das Problem ist ja wenn ich einen neuen aktuellen Text speichern möchte mit FileWrite dann erscheint ein Error fenster im (Komplimierten zustand), und das möchte ich vehrindern in dem er das FileSaveDialog aufruft.
    Wenn ich eine vorhandene Datei geöffnet habe und ich IHN speichere dann geht es, nur wenn ich ein neuen Text speichere und ich ihn speichern möchte dann kommt eine Fehler meldung.

    Bitte kann mir dabei einer helfen.

    • Offizieller Beitrag

    Die @error-Abfrage muß direkt in der Folgezeile des (möglichen) Errors gesetzt werden. Da jede weitere erfolgreiche Funktion automatisch @error = 0 zurückgibt.

    [autoit]

    $fileopen = FileOpen($open, 2)
    FileWrite($fileopen, GUICtrlRead($edit))
    ; jetzt Fehlerabfrage
    If @error Then
    $save = FileSaveDialog("Speichern unter...", @DesktopDir, "Textdokument (*.txt)|Alle Dateien (*.*)")
    If $save Then $save &=".txt"
    FileWrite($save, (GUICtrlRead($edit)))
    EndIf
    FileClose($fileopen)

    [/autoit]
  • Das klappt immer noch nicht, hmm.

    Hier habe ich mal ein Beispiel Code geschrieben, müsst es nur noch Komplimieren, dann seht ihr es , wenn ihr einen neuen text schreiben wollt dann erschein ein Fehler, nur wenn ich eine vorhandene Datei öffne und es speichere dann geht es.

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <WindowsConstants.au3>
    #NoTrayIcon

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

    GUICreate("Error Test", 600, 400)
    $edit = GUICtrlCreateEdit("", 0, 0, 500, 300)
    $button = GUICtrlCreateButton("Öffnen...", 200, 320, 100, 25)
    $button2 = GUICtrlCreateButton("Speichern", 350, 320, 100, 25)

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

    GUISetState()

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

    While 1
    $msg = GUIGetMsg()

    Switch $msg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $button
    $open = FileOpenDialog("Öffnen", @DesktopDir, "Textdokument (*.txt)")
    $read = FileRead($open)
    GUICtrlSetData($edit, $read)
    Case $button2
    $fileopen = FileOpen($open, 2)
    FileWrite($fileopen, GUICtrlRead($edit))
    ; jetzt Fehlerabfrage
    If @error Then
    $save = FileSaveDialog("Speichern unter...", @DesktopDir, "Textdokument (*.txt)|Alle Dateien (*.*)")
    If $save Then $save &=".txt"
    FileWrite($save, (GUICtrlRead($edit)))
    EndIf
    FileClose($fileopen)
    EndSwitch
    WEnd

    [/autoit]
  • Jetzt kommt zwar nicht mehr die Fehlermeldung, aber er speichert auch nicht den aktuellen text.
    Wieso muss das eigentlich mit Global dekaliert werden und wieso gerade $open, wenn ich fragen darf.

    MfG

    M3HM3T

  • DANKE also ich habe es jetzt so verstanden.
    Wenn ich eine Variable "$" in einer Schleife zuweise und ich die Variable in einem anderen Abteil verwendete, muss es vorher mit Global dekalieren.

    3 Mal editiert, zuletzt von m3hm3t (15. Juni 2008 um 13:31)

  • mal so es kann sein das ich jetzt scheisse laber weil ich nie schleifen verwende wüsste nicht mal wie das geht, aber ja so in etwa stimmt das
    du weist in der einen schleife eine funktion zu

    willst die gleiche in der nächsten schleife wieder verwenden dann musste in der nächsten schleife die Variable nochmals deklarieren odereben du benutzt die sache mit dem Global dann reicht es sie einmal zuzuweisen

    alles ok ?


    P.S. bei deinem bild funktioniert es jetzt weil oben global ist

    wenn du global wegnimmst hatt die variable in der unteren schleife nichts mehr zugewiesen

  • Jetzt verstehe ich, ok Danke Eistee.
    Nur noch ein Problem, und zwar speichert er das text nicht in einer text Datei ab, es passiert halt eben nichts.

    PS: Ja ich weiß das es in meinem Bild funktioniert, bloß noch das eine Problem, wie oben beschrieben.

    Wäre euch sehr dankbar.

    MfG

    M3HM3T

  • Das ist ja wie beim Windows eigener Editor (Notepad).
    Wenn ich eine Textdatei öffne und ich was ändere und es dann abspeichere, dann speichert es per "Speichern" ab.
    Aber wenn ich einen neuen Text schreibe ohne eine Textdatei vorher geöffnet zu haben, und ich ihn auch per "Speichern" (nicht Speichern unter...) drücke dann erscheint ja ein Seichern Dialog.

    Ich hoffe ihr wisst jetzt was ich meine.

    • Offizieller Beitrag

    @m3hm3t:
    Bitte immer gleich das kpl. Skript posten, wenn man weiß, was es werden soll, kann man das ganz anders lösen.
    Das Problem war nicht die Fehlerabfrage an sich, sondern die Tatsache, dass ohne vorher eine Datei zu öffnen auch die Variable $open nicht existierte. Man muß sie also deklarieren und mit einem Vergleichswert vorbelegen um zu sehen ob eine Datei geöffnet wurde oder nicht.
    Das Deklarieren der Variablen hat nichts mit der Verwendung in der Schleife zu tun. In deinem jetzigen Skript existierte $open ja gar nicht, wenn nur Speichern gedrückt wurde.
    Ich hab dir dein Skript mal angepaßt:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <WindowsConstants.au3>
    #NoTrayIcon
    Global $open = -1

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

    GUICreate("Error Test", 600, 400)
    $edit = GUICtrlCreateEdit("", 0, 0, 500, 300)
    $button = GUICtrlCreateButton("Öffnen...", 200, 320, 100, 25)
    $button2 = GUICtrlCreateButton("Speichern", 350, 320, 100, 25)

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

    GUISetState()

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

    While 1
    $msg = GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $button
    $open = FileOpenDialog("Öffnen", @DesktopDir, "Textdokument (*.txt)")
    $read = FileRead($open)
    GUICtrlSetData($edit, $read)
    Case $button2
    If $open <> -1 Then
    $fileopen = FileOpen($open, 2)
    FileWrite($fileopen, GUICtrlRead($edit))
    FileClose($fileopen)
    Else
    If GUICtrlRead($edit) <> '' Then ; nur wenn was im Editfeld steht
    $save = FileSaveDialog("Speichern unter...", @DesktopDir, "Textdokument (*.txt)|Alle Dateien (*.*)")
    If $save And StringRight($save, 4) <> '.txt' Then $save &= ".txt"
    FileWrite($save, (GUICtrlRead($edit)))
    EndIf
    EndIf
    EndSwitch
    WEnd

    [/autoit]