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. fee

Beiträge von fee

  • Code Kata - Christmas Tree

    • fee
    • 19. Dezember 2024 um 13:05

    [alles offtopic]

    Hallo SOLVE-SMART ,

    bezüglich den fehlerhaften Links: Dieses Forum ist leider ziemlich voll davon, obwohl viele in dieses Forum verweisen. AutoIt.de hat seine Link-Struktur zumindest in der letzten Dekade öfters geändert, vermutlich wegen besserer Lesbarkeit, Vereinfachung und um am Puls der Zeit zu bleiben. Man kann sie händisch anpassen, ein Skript dazu schreiben ¹ oder Tampermonkey installieren und dort ein Skript dafür erstellen ².

    ¹ Hatte ich fertig, bis ich neue Sorten fehlerhafter Links entdeckte oder wieder etwas geändert wurde.
    ² Habe ich auch schon fast erledigt, funktioniert jedoch für eine Sorte Links nicht, bei der das Forum den Link zur Startseite zurückgibt. Zur Umgehung dieses Problems müsste ich für jede Themenseite alle AutoIt.de-Forum-Links durchgehen und anpassen, dann wäre alles sowieso wieder funktionsfähig. Übrigens: JavaScript verstehe ich sehr schlecht und kann eigentlich nicht damit programmieren! Habe mir von "künstlicher Intelligenz" helfen lassen.

    Warum die Admins hier keine korrekten Umleitungen/Weiterleitungen von fehlerhaften Forum-eigenen Links auf die richtigen einbauen können, frage ich mich allerdings schon.

    Besteht Interesse an meinen Skripten, wenn ich eines von beiden oder gar beide fertig habe? Wenn ja, darf ich diese dann in diesem Forum einstellen und in welcher Kategorie wären solche Skripte (auch JavaScript) gut platziert?

    Gruß, fee

  • Code Kata - Christmas Tree

    • fee
    • 19. Dezember 2024 um 02:49

    Na, super, jetzt bekommen digitale Weihnachtsbäume auch schon Junge! :D:rofl:

    Gut gelungen!:theke:

    Fühlt sich dein Gehirn jetzt dem Namen der Programmiersprache entsprechend an? ;)
    Nicht, dass wir dich für AutoIt verlieren … 8o

  • Fenster bewegen - olk.exe

    • fee
    • 17. Dezember 2024 um 16:45

    Hallo stefan10 .

    1. Ich habe kein Outlook, kann dein Skript also nicht wirklich testen.
    2. Hoffentlich hast du nur eine dieser beiden Example()-Funktionen in deinem Skript, welches diese aufruft.
    3. Lautet der Klassenname deines Outlookfensters wirklich "olk"? Hast du das mit dem Tool AutoIt v3 Window Info ausgelesen?
    4. Falls das dann mal klappen sollte, wird das Outlookfenster am Ende nach zwei Sekunden sowieso wieder geschlossen.
    5. Könnte es möglich sein, dass für das Outlookfenster eine Größe von 200×200 Pixel zu klein ist.

    Gruß, fee

  • Code Kata - Christmas Tree

    • fee
    • 17. Dezember 2024 um 02:58
    Zitat von SOLVE-SMART

    außerdem noch unflexibel was die Anpassung auf 15 Zeilen angeht

    Ich weiß, aber als ich den Code von AspirinJunkie "verbesserte" (naja, wohl eher verkrüppelte 8o), verstand ich die detaillierte Funktionsweise des Codes immer besser und konnte durch weiteres Nachdenken die kürzeren Varianten entwickeln. Bei "gestauchten" 111 Zeichen war halt Schluss.

    Die Anpassung von acht Christbaumzeilen:

    AutoIt
    $t='     *'&@LF
    For $i=1 To 6
    $t&=StringMid('     XXXXXXXXXXX',$i,$i+5)&@LF
    Next
    ConsoleWrite($t&'    | |'&@LF)

    auf 15 Zeilen (152/148 Zeichen):

    AutoIt
    $t='            *'&@LF
    For $i=1 To 13
    $t&=StringMid('            XXXXXXXXXXXXXXXXXXXXXXXXX',$i,$i+12)&@LF
    Next
    ConsoleWrite($t&'           | |'&@LF)

    ist doch gar nicht so schwer. 8o Naja, verständlicher und flexibler wäre es so: (231/223 Zeichen; leider erst ab $l=4 fehlerfrei)

    AutoIt
    $l=15
    $s=StringFormat('%'&$l-3&'s','')
    $p=StringReplace($s&$s&StringLeft($s,1),' ','X')
    $w=StringLen($s)
    $t=$s&'*'&@LF
    For $i=1 To $l-2
    $t&=StringMid($s&$p,$i,$i+$w)&@LF
    Next
    ConsoleWrite($t&StringTrimRight($s,1)&'| |'&@LF)


    Sehr schön Mars, gut gemacht! :thumbup:
    Ich dachte erst wegen deines Bildschirmfotos entgegen deiner Einleitung, es wird ein Weihnachtswald statt eines einzelnen Baumes ausgegeben. Naja, bleibt noch eine Aufgabe fürs nächste Jahr. ^^

    Im übernächsten Jahr wird erst der Weihnachtsbaum und im Jahr darauf ein Weihnachtswald funkelnd animiert, gell? :part:8):D Die beiden Jahre danach bilden mit farbig funkelndem Weihnachtsbaum und Weihnachtswald den krönenden Abschluss, wenn die Konsole Junge bekommen hat, hehe! :rofl:

    Nur so am Rande:

    • Mindestens diese Überbleibsel sind noch in deinem Code: , $o = False, - 0 und zwei Step 1.
    • Die lange Zeile in der Schleife mit $s &= (…) wäre mit verschachtelten If-Anweisungen deutlich lesbarer, sähe aber nicht so interessant aus.

    Der Weihnachtsbaum ist dir auf alle Fälle sehr gut gelungen, Respekt!

    Gruß, fee

  • Code Kata - Christmas Tree

    • fee
    • 5. Dezember 2024 um 12:49

    Das Thema ist zwar schon alt, aber ich habe es erst gestern gefunden und außerdem steht wieder Weihnachten vor der Tür und ich möchte euch an meinen Ergenissen teilhaben lassen.


    Zitat von AspirinJunkie

    Wer bietet weniger?

    Du mit 152 Zeichen, wenn du die Wagenrückläufe weglässt. ;)


    Ich bekomme morgen vom Nikolausi noch weniger Zeichen bereitgestellt, deshalb muss ich noch schnell ein paar mehr vergeuden! ^^

    Die etwas abgewandelte Variante von AspirinJunkie (143 Zeichen bei CRLF; 139 Zeichen bei LF):

    AutoIt
    $t='     *'&@LF
    For $i=1 To 6
    $t&=StringFormat('%'&6-$i&'s%0'&$i*2-1&'s\n','',0)
    Next
    ConsoleWrite(StringReplace($t,'0','X')&'    | |'&@LF)

    Schaut halt etwas kryptisch aus. Hiermit wird es klarer (135 bzw. 131 Zeichen):

    AutoIt
    $t='     *'&@LF
    For $i=1 To 6
    $t&=StringLeft('     ',6-$i)&StringLeft('XXXXXXXXXXX',$i*2-1)&@LF
    Next
    ConsoleWrite($t&'    | |'&@LF)

    Damit etwas kürzer (132/128 Zeichen):

    AutoIt
    $t='     *'&@LF
    For $i=1 To 6
    $t&=StringMid('     ',$i)&StringMid('XXXXXXXXXXX',13-$i*2)&@LF
    Next
    ConsoleWrite($t&'    | |'&@LF)

    Und hiermit ganz kurz und klar (115/111 Zeichen):

    AutoIt
    $t='     *'&@LF
    For $i=1 To 6
    $t&=StringMid('     XXXXXXXXXXX',$i,$i+5)&@LF
    Next
    ConsoleWrite($t&'    | |'&@LF)

    Leider erfüllen alle obigen Codes in diesem Thema bis auf jene von SOLVE-SMART, Moombas und Mars streng genommen nicht die Anforderungen von SOLVE-SMART (jedenfalls seinen Bildern nach zu urteilen), weil keine Leerzeichen rechts am Weihnachtsbaum angehängt werden.


    Die mit zwei zusätzlich vorangestellten sowie auffüllend angehängten Leerzeichen und in der Zeilenanzahl anpassbare, jedoch nicht mehr so klare letzte Variante von AspirinJunkie ohne sparsame Syntax wäre (582 Zeichen bei CRLF):

    AutoIt
    _ChristmasTree(8)
    
    Func _ChristmasTree($n)
      Local Const $c = $n * 2 - 1
      Local $t = ''
      If $n > 0 Then
        $t &= StringFormat('%' & $c & 's%' & $c - 1 & 's\r\n', '*', '')
        For $i = 1 To $c - 4 Step 2
          $t &= StringFormat('%' & $c - $i + 1 & 's%0' & $i - 1 & 's' & _
                             '%' & $c - $i & 's\r\n', '0', '', '')
        Next
        If $n > 1 Then $t &= StringFormat('%' & $c & 's%' & $c - 3 & 's\r\n', '| |', '')
        $t = StringReplace(StringReplace($t, '  ', ' '), '0', 'X')
      EndIf
      ConsoleWrite(@CRLF & $t & @CRLF)
    EndFunc   ;==>_ChristmasTree
    Alles anzeigen

    Meine kürzeste Variante habe ich auch noch entsprechend angepasst (519 Zeichen bei CRLF):

    AutoIt
    _ChristmasTree(8)
    
    Func _ChristmasTree($n)
      Local Const $c = StringReplace(StringFormat('%' & $n * 2 - 5 & 's', ''), ' ', 'X')
      Local $s = StringFormat('%' & $n - 1 & 's', '')
      Local $t = ''
      If $n > 0 Then
        $t = $s & '*' & $s & @CRLF
        For $i = 1 To $n - 2
          $t &= StringMid($s & $c, $i, $i + $n - 1) & StringMid($s, $i) & @CRLF
        Next
        $s = StringTrimRight($s, 1)
        If $n > 1 Then $t &= $s & '| |' & $s & @CRLF
      EndIf
      ConsoleWrite(@CRLF & $t & @CRLF)
    EndFunc   ;==>_ChristmasTree
    Alles anzeigen


    Gruß, fee

  • HTML-/CSS-Optimierer

    • fee
    • 1. Dezember 2024 um 13:03

    oh-ha : Dankeschön für deine Antwort.

    Vielleicht hätte ich noch erwähnen sollen, dass ich nicht erst Zig Programme installieren und lernen mag, nur um diese eine Funktion herauszufinden. Hier ein Bild aus Microsoft Expression Web 4, damit vielleicht klarer wird, was ich meine:

    Dieses Fenster wurde über den Kontextmenü-Eintrag "HTML optimieren..." im Quelltext der Webseite (Code-Tab) aufgerufen. Drücke ich auf "OK" und habe das rot markierte Feld aktiviert, werden unter anderem alle CSS-Styles entfernt, die nicht (mehr) im HTML-Code vorkommen. Leider ist diese Funktion vermutlich nur auf CSS2 ausgelegt und Pseudo-Selektoren sowie andere speziellere CSS-Ausdrücke bringen sie aus dem Tritt.

    Wenn keiner von euch selbst so ein Programm oder schon mal so eines zusammen mit so einer Funktionalität benutzt hat, muss ich mir wohl selbst eines mit AutoIt zusammenschustern. Ich sehe mich schon alt und ergraut, bis ich sowas fehlerfrei lauffähig bekommen habe. Oder hat/kennt jemand einen möglichst fehlerfreien Parser für alle HTML- und CSS-Versionen?

    Gruß, fee

  • HTML-/CSS-Optimierer

    • fee
    • 1. Dezember 2024 um 04:21

    Hallo Leute,

    kennt jemand ein Programm oder Online-Tool, das ähnlich wie Microsoft Office FrontPage 2003 oder Microsoft Expression Web 4 auf der aktuell geladenen Webseite alle nicht verwendeten CSS-Styles entfernt, jedoch mit den Neuerungen in CSS und HTML klarkommt und nicht zuviel entfernt, wie es die beiden genannten Programme tun? Das Programm sollte auf Windows 7 Pro SP1 oder das Online-Tool mit Firefox 115 lauffähig sein. Kann mein Anliegen vielleicht auch Visual Studio Code oder ein anderes kostenloses Programm leisten?

    Gruß, fee

  • Keine Leerzeichen im ungültigen Verknüpfungszielpfad

    • fee
    • 4. November 2024 um 23:20

    Hallo gmmg,

    nein, ich besitze nach WinXP nur Win7. Welche Version hast du und konntest du dieses Problem nachstellen?

    Gruß, fee

  • Keine Leerzeichen im ungültigen Verknüpfungszielpfad

    • fee
    • 2. November 2024 um 21:43

    Erst mal vielen Dank für eure Antworten und vor allem an AspirinJunkie für deine Recherchen und die gute Erklärung. :thumbup:


    Moombas

    Das weiß ich ja auch, hehe, deshalb das Skript. ;) Man könnte zumindest die deutsche Hilfe vielleicht so ergänzen:

    Zitat

    FileCreateShortcut() benötigt im Gegensatz zum Windows-Explorer kein gültiges Ziel …, um die .lnk-Datei "erfolgreich" anzulegen. Das Laufwerk zum Ziel sollte jedoch erreichbar sein, um eine mögliche Verfälschung der Zeichenfolge zum Verknüpfungsziel zu vermeiden.


    AspirinJunkie

    Der Grund für dieses Verhalten seitens Windows ist bis auf dessen Änderung bei derzeit unterstützten Versionen nun auch für mich nachvollziehbar.

    Was auch immer dahinter stecken mag, ich habe deine Links gelesen, übersetzt, selbst weitergesucht, getestet und probiert, wobei im Wesentlichen das Nachfolgende herauskam.


    @Alle:
    Ich führte die nachfolgenden Skripte auf Windows 7 SP1 x64 (Win7) mit AutoIt 3.3.16.1 und auf Windows XP SP3 x86 (WinXP) mit AutoIt 3.3.14.5 aus, wobei auf beiden Betriebssystemen weder der Pfad vorhanden noch das Laufwerk eingebunden war. Auf einigen der nachfolgenden Bilder habe ich das Feld zur Anzeige des Verknüpfungszieles verbreitert, damit der vollständige Pfad sichtbar ist.


    Das erweiterte Skript zum Testen auf Beschneidung der Zielzeichenfolge:

    AutoIt
    AutoItSetOption('MustDeclareVars', 1)
    
    ; Letzten freien Laufwerksbuchstaben ermitteln
    Global $sDrive = ''
    For $i = Asc('Z') To Asc('A') Step -1
      $sDrive = Chr($i) & ':'
      If FileExists($sDrive) = 0 Then ExitLoop
      $sDrive = ''
    Next
    
    ; Bei Fehlschlag Meldung anzeigen und abbrechen
    If $sDrive = '' Then
      MsgBox(16, 'Fehler', 'Kein Laufwerksbuchstabe frei!')
      Exit 1
    EndIf
    
    ; Aktuelles Skriptverzeichnis ermitteln
    Global Const $sScript = @ScriptDir
    
    ; Zielverzeichnispfad festlegen
    Global Const $sPath = '\Ungültiger Pfad mit Leerzeichen'
    
    ; Zieldateiname mit Erweiterung festlegen
    Global Const $sName = '\Sehr langer Dateiname.erweitert'
    
    ; Verknüpfung erstellen
    If FileCreateShortcut($sDrive & $sPath & $sName, $sScript & '\Test.lnk', $sDrive & $sPath) = 0 Then
      ; Bei Fehlschlag Meldung anzeigen und abbrechen
      MsgBox(16, 'Fehler', 'Verknüpfung nicht erstellt!')
      Exit 2
    EndIf
    
    ; Skriptende
    Exit 0
    Alles anzeigen

    … erzeugte diese Verknüpfungen in Win7 und WinXP:

    Wie in den rot umrandeten Bereichen zu sehen ist, wäre es für Windows wohl zu altmodisch, einfach ganz auf MS-DOS-Beschränkung zu setzen. Deshalb erlaubt Win7 als Ziel ziemlich lange Pfade und Dateinamen, jedoch wird die Erweiterung auf die ersten drei Buchstaben abgeschnitten und die Leerzeichen durch Unterstriche ersetzt. WinXP beschneidet zusätzlich sowohl den Pfad als auch den Dateinamen auf acht Zeichen. Beide Betriebssysteme erlauben sogar Umlaute und benutzen wegen der beschränkten Pfade keine doppelten Anführungszeichen fürs Ziel.


    Dann habe ich nach langem Probieren dieses Skript erarbeitet:

    AutoIt
    AutoItSetOption('MustDeclareVars', 1)
    
    ; Letzten freien Laufwerksbuchstaben ermitteln
    Global $sDrive = ''
    For $i = Asc('Z') To Asc('A') Step -1
      $sDrive = Chr($i) & ':'
      If FileExists($sDrive) = 0 Then ExitLoop
      $sDrive = ''
    Next
    
    ; Bei Fehlschlag Meldung anzeigen und abbrechen
    If $sDrive = '' Then
      MsgBox(16, 'Fehler', 'Kein Laufwerksbuchstabe frei!')
      Exit 1
    EndIf
    
    ; Aktuelles Skriptverzeichnis ermitteln
    Global Const $sScript = @ScriptDir
    
    ; Zielverzeichnispfad festlegen
    Global Const $sPath = '\Ungültiger Pfad mit Leerzeichen'
    
    ; Zieldateiname mit Erweiterung festlegen
    Global Const $sName = '\Sehr langer Dateiname.erweitert'
    
    ; Verzeichnisstruktur abfragen
    If FileExists($sScript & $sPath & $sName) = 1 Then
      ; Bei Erfolg Meldung anzeigen und abbrechen
      MsgBox(16, 'Fehler', 'Verzeichnisstruktur bereits vorhanden!')
      Exit 2
    EndIf
    
    ; Verzeichnisstruktur anlegen
    Global Const $hFile = FileOpen($sScript & $sPath & $sName, 9)
    If $hFile = -1 Then
      ; Bei Fehlschlag Meldung anzeigen und abbrechen
      MsgBox(16, 'Fehler', 'Verzeichnisstrukturerstellung fehlgeschlagen!')
      Exit 3
    EndIf
    ; Geöffnete Datei schließen
    FileClose($hFile)
    
    ; Freien Laufwerksbuchstaben mit Verzeichnis verbinden
    If _Substitute($sDrive, $sScript & $sPath) <> 0 Then
      ; Bei Fehlschlag Meldung anzeigen und abbrechen
      MsgBox(16, 'Fehler', 'Laufwerk nicht mit Verzeichnis verbunden!')
      Exit 4
    EndIf
    
    ; Verknüpfung erstellen
    If FileCreateShortcut($sDrive & $sPath & $sName, $sScript & '\Test.lnk', $sDrive & $sPath) = 0 Then
      ; Bei Fehlschlag Meldung anzeigen und abbrechen
      MsgBox(16, 'Fehler', 'Verknüpfung nicht erstellt!')
      Exit 5
    EndIf
    
    ; Verzeichnisverbindung trennen
    If _Substitute($sDrive, '/d') <> 0 Then
      ; Bei Fehlschlag Meldung anzeigen und abbrechen
      MsgBox(16, 'Fehler', 'Laufwerkstrennung fehlgeschlagen!')
      Exit 6
    EndIf
    
    ; Verzeichnisstruktur löschen
    If DirRemove($sScript & $sPath, 1) = 0 Then
      ; Bei Fehlschlag Meldung anzeigen und abbrechen
      MsgBox(16, 'Fehler', 'Verzeichnisstrukturlöschung fehlgeschlagen!')
      Exit 7
    EndIf
    
    ; Skriptende
    Exit 0
    
    
    Func _Substitute($sDrive, $sArgs = '')
      ; Übergebene Argumente verarbeiten
      If $sArgs <> '' Then
        ; Mögliche Gegenschrägstriche am Pfadende entfernen
        $sArgs = StringRegExpReplace($sArgs, '\\+$', '')
        ; Pfad mit Sonderzeichen zwischen zwei doppelte Anführungszeichen setzen
        StringRegExpReplace($sArgs, "[][{}()!`'^=~+;, ]+", '')
        If @Extended > 0 Then $sArgs = '"' & $sArgs & '"'
        ; Leerzeichentrenner vors Argument setzen
        $sArgs = ' ' & $sArgs
      EndIf
    
      ; Konsolenbefehl 'subst' mit Parametern ausführen
      Local Const $iSubst = Run('subst ' & $sDrive & $sArgs, $sScript, @SW_Show, 6)
    
      ; Zeitgeber einrichten und Variablen festlegen
      Local $hTimer = TimerInit()
      Local $sInfo  = ''
      Local $sError = ''
    
      ; Standard-Ausgabe- und Fehler-Datenströme der Konsole auslesen
      While 1
        $sInfo &= StdOutRead($iSubst)
        If @Error <> 0 Then ExitLoop                ; Bei Fehler Schleife verlassen
        If TimerDiff($hTimer) >= 3800 Then ExitLoop ; Bei Zeitüberschreitung Schleife verlassen
      WEnd
      $hTimer = TimerInit()
      While 1
        $sError &= StdErrRead($iSubst)
        If @Error <> 0 Then ExitLoop                ; Bei Fehler Schleife verlassen
        If TimerDiff($hTimer) >= 3800 Then ExitLoop ; Bei Zeitüberschreitung Schleife verlassen
      WEnd
    
      ; Möglichen noch vorhandenen Konsolenprozess schließen
      If ProcessExists($iSubst) <> 0 Then ProcessClose($iSubst)
    
      ; Fehler oder Erfolg zurückgeben
      If $sInfo <> '' Or $sError <> '' Then Return 1
      Return 0
    EndFunc   ;==>_Substitute
    Alles anzeigen

    … und endlich das gewünschte Verknüpfungsziel sowohl auf Win7 als auch auf WinXP hinbekommen:

    Diese Variante sollte zuverlässig in allen Windows-Versionen funktionieren, die den Konsolenbefehl subst installiert haben, sofern sich deren Art und Weise, Meldungen auszugeben, nicht zu stark voneinander unterscheiden.


    Trotz dieses Erfolges verfolgte ich noch meine frühere Idee, das Verknüpfungsziel als passend kodierte file-URL anzugeben. Nachdem ich über die entsprechende WinAPI-Funktion stolperte und mein Skript aus dem ersten Block dieses Beitrags in dieses abwandelte:

    AutoIt
    #Include <WinAPIShPath.au3>
    
    AutoItSetOption('MustDeclareVars', 1)
    
    ; Letzten freien Laufwerksbuchstaben ermitteln
    Global $sDrive = ''
    For $i = Asc('Z') To Asc('A') Step -1
      $sDrive = Chr($i) & ':'
      If FileExists($sDrive) = 0 Then ExitLoop
      $sDrive = ''
    Next
    
    ; Bei Fehlschlag Meldung anzeigen und abbrechen
    If $sDrive = '' Then
      MsgBox(16, 'Fehler', 'Kein Laufwerksbuchstabe frei!')
      Exit 1
    EndIf
    
    ; Aktuelles Skriptverzeichnis ermitteln
    Global Const $sScript = @ScriptDir
    
    ; Zielverzeichnispfad festlegen
    Global Const $sPath = '\Ungültiger Pfad mit Leerzeichen'
    
    ; Zieldateiname mit Erweiterung festlegen
    Global Const $sName = '\Sehr langer Dateiname.erweitert'
    
    ; Verknüpfungsziel in vorschriftsmäßige URL umwandeln
    Global Const $sScheme = _WinAPI_URLCreateFromPath($sDrive & $sPath & $sName)
    
    ; Verknüpfung erstellen
    If FileCreateShortcut($sScheme, $sScript & '\Test.lnk', $sDrive & $sPath) = 0 Then
      ; Bei Fehlschlag Meldung anzeigen und abbrechen
      MsgBox(16, 'Fehler', 'Verknüpfung nicht erstellt!')
      Exit 2
    EndIf
    
    ; Skriptende
    Exit 0
    Alles anzeigen

    … gelangte ich in Win7 ebenso ans gewünschte Verknüpfungsziel, in WinXP jedoch nicht:

    Kann das jemand neugierdehalber auch für andere (neuere) Versionen von Windows bestätigen?


    Weil ich sah, dass AutoIt die WideChar-Variante der Funktion _WinAPI_URLCreateFromPath() verwendet, wollte ich wissen, ob WinXP mit der ANSI-Variante arbeiten kann:

    AutoIt
    AutoItSetOption('MustDeclareVars', 1)
    
    ; Letzten freien Laufwerksbuchstaben ermitteln
    Global $sDrive = ''
    For $i = Asc('Z') To Asc('A') Step -1
      $sDrive = Chr($i) & ':'
      If FileExists($sDrive) = 0 Then ExitLoop
      $sDrive = ''
    Next
    
    ; Bei Fehlschlag Meldung anzeigen und abbrechen
    If $sDrive = '' Then
      MsgBox(16, 'Fehler', 'Kein Laufwerksbuchstabe frei!')
      Exit 1
    EndIf
    
    ; Aktuelles Skriptverzeichnis ermitteln
    Global Const $sScript = @ScriptDir
    
    ; Zielverzeichnispfad festlegen
    Global Const $sPath = '\Ungültiger Pfad mit Leerzeichen'
    
    ; Zieldateiname mit Erweiterung festlegen
    Global Const $sName = '\Sehr langer Dateiname.erweitert'
    
    ; Verknüpfungsziel in vorschriftsmäßige URL umwandeln
    Global Const $sScheme = _WinAPI_URLCreateFromPath($sDrive & $sPath & $sName)
    
    ; Verknüpfung erstellen
    If FileCreateShortcut($sScheme, $sScript & '\Test.lnk', $sDrive & $sPath) = 0 Then
      ; Bei Fehlschlag Meldung anzeigen und abbrechen
      MsgBox(16, 'Fehler', 'Verknüpfung nicht erstellt!')
      Exit 2
    EndIf
    
    ; Skriptende
    Exit 0
    
    
    ; #FUNCTION# =======================================================================================
    ; Author ..: Yashied
    ; Modified : jpm
    ; ==================================================================================================
    Func _WinAPI_UrlCreateFromPath($sFilePath)
      Local $aRet = DLLCall('shlwapi.dll', _
                            'long'  , 'UrlCreateFromPathA', _
                            'wstr'  , $sFilePath          , _
                            'wstr'  , ''                  , _
                            'dword*', 4096                , _
                            'dword' , 0)
      If @Error Then Return SetError(@Error, @Extended, '')
      If $aRet[0] < 0 Or $aRet[0] > 1 Then ; S_OK, S_FALSE
        Return SetError(10, $aRet[0], '')
      EndIf
      Return $aRet[2]
    EndFunc   ;==>_WinAPI_UrlCreateFromPath
    Alles anzeigen

    Und siehe da, in Win7 wird die Zielzeichenfolge teilweise sogar chinesisch während in WinXP das Ziel auch damit leer bleibt:

    Falls es jemanden interessiert: den chinesischen Teil 楦敬娺 übersetzt Google mit Letzter Jing’a (Jing-A Brewing Co. ist eine Mikrobrauerei in Peking) und DeepL mit Letzter Königstag. Jetzt weiß ich, woher Windows insgeheim wirklich kommt oder zumindest, warum es sich so seltsam verhält. 8o


    Bei meiner Recherche ist mir noch WScript.Shell über den Weg gelaufen. Obwohl an anderer Stelle stand, dass auch damit die von AspirinJunkie bereits erwähnte WinAPI-Funktion IShellLink genutzt wird, musste ich das ausprobieren und ersetzte die Funktion FileCreateShortcut() durch:

    AutoIt
    Func _CreateShortcut($sLocation, $sTarget, $iWindowStyle = 1, $sHotkey = '', $iIcon = 0, _
                         $sDescription = '', $sWorkingDirectory = '')
      ; Source: https://www.autoitscript.com/forum/topic/32252-creating-a-shortcut/
      Local Const $oShell = ObjCreate('WScript.Shell')
      If @Error = 0 Then
        Local $oLink = $oShell.CreateShortcut($sLocation)
        If IsObj($oLink) = 1 Then
          $oLink.TargetPath       = $sTarget
          $oLink.WindowStyle      = $iWindowStyle
          $oLink.Hotkey           = $sHotkey
          $oLink.IconLocation     = $iIcon
          $oLink.Description      = $sDescription
          $oLink.WorkingDirectory = $sWorkingDirectory
          $oLink.Save
          If FileExists($sLocation) = 1 Then
            Return True
          EndIf
        EndIf
      EndIf
      Return False
    EndFunc   ;==>_CreateShortcut
    Alles anzeigen

    Das Ergebnis war genauso ernüchternd wie mit FileCreateShortcut() und _WinAPI_URLCreateFromPath() in den obigen Skripten, jedenfalls auf Win7. Meine WinXP-Kiste wollte ich für diesen letzten Test nicht nochmal extra anschmeißen.


    Gruß, fee

  • Keine Leerzeichen im ungültigen Verknüpfungszielpfad

    • fee
    • 31. Oktober 2024 um 05:12

    Hallo liebe Leute,

    entweder hat Windows 7 SP1 x64 oder FileCreateShortcut() in AutoIt 3.3.16.1 einen Bug, denn in der englischen sowie deutschen Hilfe steht:

    Zitat

    FileCreateShortcut() benötigt kein gültiges Ziel …, um die .lnk-Datei "erfolgreich" anzulegen.

    Erstelle ich eine Verknüpfung mit einem gültigen Zielpfad, der Leerzeichen enthält, wird der gesamte Pfad in doppelte Anführungszeichen gesetzt, ebenso beim Arbeitsverzeichnis. So weit so gut.

    Erstelle ich eine Verknüpfung mit einem ungültigen Zielpfad, der Leerzeichen enthält, jedoch auf ein eingebundenes Laufwerk verweist, wird der gesamte Pfad ebenfalls in doppelte Anführungszeichen gesetzt. Auch das ist in Ordnung.

    Erstelle ich eine Verknüpfung mit einem ungültigen Zielpfad, der Leerzeichen enthält, jedoch auf ein nicht eingebundenes Laufwerk verweist, wird der Pfad nicht mehr in doppelte Anführungszeichen gesetzt und alle Leerzeichen durch Unterstriche ersetzt. Das ist ein Fehler, den ich nicht beheben kann, weder mit im Zielpfad übergebenen doppelten Leerzeichen noch mit angehängtem \nul.ext, weil ich eigentlich nur ein Zielverzeichnis verknüpfen will.

    Hier ein Beispielskript fürs Verständnis und einfacherem Nachvollziehen:

    AutoIt
    AutoItSetOption('MustDeclareVars', 1)
    
    Global $s = ''
    
    ; Letzten freien Laufwerksbuchstaben ermitteln
    For $i = Asc('Z') To Asc('A') Step -1
      $s = Chr($i) & ':\'
      If FileExists($s) = 0 Then ExitLoop
      $s = ''
    Next
    
    ; Bei Fehlschlag Meldung anzeigen und abbrechen
    If $s = '' Then
      MsgBox(16, 'Fehler', 'Kein Laufwerksbuchstabe frei!')
      Exit 1
    EndIf
    
    ; Pfade festlegen und Verknüpfung erstellen
    $s &= 'Ungültiger Pfad mit Leerzeichen'
    FileCreateShortcut($s & '\nul.ext', @ScriptDir & '\Test.lnk', $s)
    
    ; Skriptende
    Exit 0
    Alles anzeigen

    Kann jemand dieses Verhalten bestätigen und mir vielleicht sogar eine Lösung präsentieren oder falls es ein Bug von AutoIt ist, diesen bitte den Entwicklern mitteilen?

    Wenn sich jemand fragt, wozu ich dieses Szenario brauche:
    Ich wechsele hin und wieder meine Laufwerke, wovon jedes einen anderen Laufwerksbuchstaben zugewiesen bekommt, jedoch die betreffende Pfadstruktur auf all diesen Laufwerken dieselbe ist. Durch eine der Verknüpfungen kann ich schnell in den gewünschten Pfad springen und muss nur noch die nach dem Laufwerk benannte passende Verknüpfung anklicken. Ist das Laufwerk nicht eingebunden, so ist die Verknüpfung vorübergehend ungültig. Weil ich aber dieselbe Verknüpfung für alle Laufwerksbuchstaben haben möchte, schrieb ich mir ein AutoIt-Skript, mit dem ich nicht erst alle Laufwerksbuchstaben belegen muss.
    Ich könnte auch mit dem Programm Visual Subst alle Laufwerksbuchstaben nacheinander einem bestehenden Verzeichnis virtuell zuweisen und so alle gewünschten Verknüpfungen erstellen, aber dann könnte ich auch das Ausfüllen der Eingabefelder im Eigenschaftendialog von Windows händisch erledigen und bräuchte kein Skript mehr. Außerdem wäre mir dann dieser Fehler nicht aufgefallen. ;)

    Gruß, fee

  • Leerzeichen vor dem GUI-Titel

    • fee
    • 30. März 2024 um 09:55

    Hallo BigRox,

    ich habe zwar kein Win11, aber vielleicht hilft dir ein Backspace (Alt+08) ganz am Anfang, also vor den Leerzeichen. Bei Win7 lassen sich ähnliche Probleme in Batchdateien jedenfalls so lösen, wenn man Text ohne Zeilenumbruch ausgeben will: set /p "#=[BS]  Text"<nul ([BS] = Alt+08).

    Ansonsten würde ich noch Unicode-Leerzeichen durchprobieren, vor allem die geschützten Leerzeichen, also diejenigen ohne Umbruch.

    Wenn all das auch nicht funktioniert, dann würde ich wie Moombas einen Punkt (.) oder einen Mittenpunkt (· Alt+0183) davor setzen.

    Gruß, fee

  • run mit start und Anfführungszeichen

    • fee
    • 14. Februar 2024 um 02:03

    Hallo Racer ,

    Zitat von Racer

    Ich bilde mir ein das war bis vor kurzen nicht so.

    der start-Befehl verhält sich wie von AspirinJunkie beschrieben schon mindestens seit Windows XP SP3 so.

    Zitat von Racer

    start.exe "Titel" "c:\program files\notepad++\notepad++.exe"

    "Titel" darf auch eine leere Zeichenfolge sein, also "".

    Zitat von Racer

    Das Eigenartige ist nur: gebe ich den Pfad ohne Anführungszeichen an (bei Pfaden ohne Leerschritt) funktioniert das ohne Probleme.

    Das ist nicht eigenartig, sondern eine für die meisten Befehle geltende Eigenart ;) der Eingabeaufforderung von Windows.

    Zitat von Racer

    Ich werde künftig auf Nummer sicher gehen und immer einen Titel angeben!

    Damit fährst du sicherlich gut. Ich mache das schon lange so, auch wenn ich kaum mehr Batchele.


    Gruß, fee

  • php2au3 neuer Ausweis

    • fee
    • 25. Juli 2023 um 04:35
    Zitat von mumpel

    Für mich ist das eine nette Übung.

    Dito. Leider deutlich länger, als gedacht/gewollt.

  • php2au3 neuer Ausweis

    • fee
    • 25. Juli 2023 um 01:52

    Genau das wollte ich nicht machen, weil aus dem Zahlen-WirrWarr auf dem Ausweis die einzelnen Bedeutungen nur aus der Syntax-Reihenfolge ersichtlich sind, weshalb man sie auch einfach nacheinander schreiben kann.

    Trotz der besseren Übersicht büßt du die Les-/Korrigierbarkeit der Ausweis-Nummer ein, weil du keine Festbreitenschrift für die Felder verwendest.

    Letztlich dient das Skript ja nur zur Gegenprüfung der Prüfziffern und kann sonst nicht weiterverwendet werden. Die Spitzklammern wollte ich auch erst weglassen.

    Eigentlich würde ein einziges Eingabefeld ausreichen, aber ich wollte die einzelnen Felder wie im ursprünglichen PHP-Skript aus Beitrag #1 in ihrer Eingabelänge beschränken können, was jedoch auch mit Restrict Control RegExp möglich wäre.

    Man könnte auch sagen: Ein mickriger Anwendungsfall verdient nur eine mickrige GUI.

    Aber das kann ja jeder machen/handhaben/ändern wie er lustig ist. :)

  • php2au3 neuer Ausweis

    • fee
    • 25. Juli 2023 um 00:14

    Learning by doing … 8o

    Den Rechenfehler findest du bestimmt noch, oder rechnet das PHP-Script (Link aus Beitrag #5) auch falsch?

  • php2au3 neuer Ausweis

    • fee
    • 24. Juli 2023 um 23:42

    Na, die Ausweis-Nummer. Ein ungültiges Beispiel findest du im PHP-Code von Beitrag #1:

    Zitat von Alina
    Code
    1234567891D 2345678 9012345 6

    Der Nummer-Aufbau neuerer Ausweise funktioniert mit meinem Code nicht, dafür ist der ursprüngliche PHP-Code wohl zu alt. Stattdessen müsste der Code von Beitrag #5 eingebaut werden, der vermutlich auf neuerem PHP-Code beruht.

  • php2au3 neuer Ausweis

    • fee
    • 24. Juli 2023 um 22:44

    Tja, keine Ahnung, bei mir läuft er optimal, auch der von hier kopierte.

    Welches Nummern-Format testet du? Das von Kanashius geht nicht und könnte vielleicht diesen Fehler verursachen.

    Ist deine AutoIt-Version die 3.3.16.1 (wie sie im Dateikopf steht)?

    Ansonsten weiß ich nicht, woran das liegen könnte, außer vielleicht am Betriebssystem. Ich nutze Windows 7 Pro (64 Bit).

  • php2au3 neuer Ausweis

    • fee
    • 24. Juli 2023 um 20:56

    Hallo Alina , ich sehe, Kanashius hat schon eine Variante geliefert.

    Ich schrieb heute neugierdehalber auch eine, orientierte mich dabei in den Hauptfunktionen jedoch sehr nah an deiner Vorgabe.

    Code: AusweisNummerPruefer.au3
    #NoTrayIcon
    ;===================================================================================================
    ; AutoIt-Version .: 3.3.16.1
    ; VorausSetzungen : Siehe #Include
    ; Dateiname ......: AusweisNummerPruefer.au3
    ; Autoren ........: Unbekannt, fee
    ; Begonnen am ....: 2023-07-22
    ; Geändert am ....: 2023-07-24
    ; Dateiversion ...: 1.0.0.0
    ; Webseiten ......: Unbekannt
    ; Beschreibung ...: AusweisNummer auf Gültigkeit prüfen.
    ; Anmerkungen ....: Keine
    ;===================================================================================================
    
    ; Skriptanfang.
    #Include <APIGDIConstants.au3>
    #Include <ButtonConstants.au3>
    #Include <Date.au3>
    #Include <GUIConstantsEx.au3>
    #Include <MsgBoxConstants.au3>
    #Include <SendMessage.au3>
    #Include <StringConstants.au3>
    #Include <WinAPIGDI.au3>
    #Include <WinAPIGDIDC.au3>
    #Include <WinAPIGDIInternals.au3>
    #Include <WinAPIHObj.au3>
    #Include <WinAPISysInternals.au3>
    #Include <WindowsConstants.au3>
    
    Opt('MustDeclareVars', 1)
    
    Global Enum _
        $Geburtstag  , _
        $Geburtsmonat, _
        $Geburtsjahr , _
        $Alter       , _
        $Volljaehrig , _
        $Ablauftag   , _
        $Ablaufmonat , _
        $Ablaufjahr  , _
        $Herkunft    , _
        $Deutscher   , _
        $Erstwohnsitz, _
        $Ende
    
    ;--- Anwendungsbeispiel ---
    
    Global Const $Window = GUICreate('AusweisNummerPrüfer', 200, 100)
    Local $Sizes = WinGetPos($Window)
    $Sizes[2] -= 200
    $Sizes[3] -= 100
    
    GUICtrlCreateLabel('Personalnummer:', 10, 8, -1, 17)
    
    GUISetFont(9, 400, 0, 'Consolas')
    Opt('GUICoordMode', 0)
    Local Const $InputA = GUICtrlCreateInput('', 0, 17, _TextWidth('00000000000') + 1, 21)
    
    Opt('GUICoordMode', 2)
    GUICtrlCreateLabel('<<', 0, -18, _TextWidth('<<') - 2, 17)
    Local Const $InputB = GUICtrlCreateInput('', 0, -20, _TextWidth('0000000') + 5, 21)
    
    GUICtrlCreateLabel('<', 0, -18, _TextWidth('<') - 1, 17)
    Local Const $InputC = GUICtrlCreateInput('', 0, -20, _TextWidth('0000000') + 5, 21)
    
    GUICtrlCreateLabel('<<<<<', 0, -18, _TextWidth('<<<<<') - 5, 17)
    Local Const $InputD = GUICtrlCreateInput('', 0, -20, _TextWidth('0') + 5, 21)
    
    Local $Width = ControlGetPos($Window, '', $InputD)
    $Width = $Width[0] + $Width[2]
    
    GUISetFont(8.5)
    Opt('GUICoordMode', 1)
    Local Const $Button = GUICtrlCreateButton('Ü&berprüfen', $Width - 79, 50, 80, 23, $BS_DEFPUSHBUTTON)
    
    Local $Hight = $Sizes[3] + 50 + 23 + 9
    $Width += $Sizes[2] + 10
    _CenterWindow($Width, $Hight)
    
    GUICtrlSetLimit($InputA, 11)
    GUICtrlSetLimit($InputB, 7)
    GUICtrlSetLimit($InputC, 7)
    GUICtrlSetLimit($InputD, 1)
    
    GUISetState(@SW_Show, $Window)
    
    Local $Perso_ID
    Local $Data[]
    While 1
      Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
          ExitLoop
        Case $Button
          $Perso_ID = GUICtrlRead($InputA) & ' ' & _
                      GUICtrlRead($InputB) & ' ' & _
                      GUICtrlRead($InputC) & ' ' & _
                      GUICtrlRead($InputD)
          If _Perso_Check($Perso_ID) Then
            $Data = _Perso_Info($Perso_ID)
            MsgBox($MB_ICONINFORMATION, 'Information', _
                   'Personalnummer korrekt.' & @CRLF & @CRLF & _
                   'Daten der AusweisNummer:' & @CRLF & _
                   'Geburtstag:'   & @Tab        & $Data[$Geburtstag  ] & @CRLF & _
                   'GeburtsMonat:' & @Tab        & $Data[$Geburtsmonat] & @CRLF & _
                   'Geburtsjahr:'  & @Tab        & $Data[$Geburtsjahr ] & @CRLF & _
                   'Alter:'        & @Tab & @Tab & $Data[$Alter       ] & @CRLF & _
                   'Volljährig:'   & @Tab & @Tab & $Data[$Volljaehrig ] & @CRLF & _
                   'Ablauftag:'    & @Tab & @Tab & $Data[$Ablauftag   ] & @CRLF & _
                   'Ablaufmonat:'  & @Tab        & $Data[$Ablaufmonat ] & @CRLF & _
                   'Ablaufjahr:'   & @Tab        & $Data[$Ablaufjahr  ] & @CRLF & _
                   'Herkunft:'     & @Tab & @Tab & $Data[$Herkunft    ] & @CRLF & _
                   'Deutscher:'    & @Tab        & $Data[$Deutscher   ] & @CRLF & _
                   'ErstwohnSitz:' & @Tab        & $Data[$Erstwohnsitz], 0, $Window)
          Else
            MsgBox($MB_ICONERROR, 'Fehler', 'Personalnummer falsch!', 0, $Window)
          EndIf
      EndSwitch
    WEnd
    
    ; Skriptende:
    Exit 0
    
    
    #Region ==============================::[ Hauptfunktionen ]::=======================================
      ; Prüfnummer überprüfen
      Func _Check_Number($Number = 0)
        Local $p = 7
        Local $Return = 0
        For $i = 1 To StringLen($Number)
          $Return += StringRight(StringMid($Number, $i, 1) * $p, 1)
          Switch $p
            Case 1
              $p = 7
            Case 3
              $p = 1
            Case 7
              $p = 3
          EndSwitch
        Next
        Return StringRight($Return, 1)
      EndFunc   ;==>_Check_Number
    
      ; Zweistellige JahresZahl verlängern
      Func _JahresZahl($Year)
        If StringLen($Year) = 2 Then
          If $Year < 70 Then
            $Year = '20' & $Year
          Else
            $Year = '19' & $Year
          EndIf
        EndIf
        Return $Year
      EndFunc   ;==>_JahresZahl
    
      ; Ist der Personalausweis gültig?
      Func _Perso_Check($ID)
        Local Const $Array = StringSplit($ID, ' ', $STR_ENTIRESPLIT + $STR_NOCOUNT)
    
        ; Erste Checknummer: Zählnummer und Erstwohnsitz
        If _Check_Number(StringLeft($Array[0], 9)) <> StringMid($Array[0], 10, 1) Then _
            Return False
    
        ; Zweite Checknummer: Geburtstag
        If _Check_Number(StringLeft($Array[1], 6)) <> StringMid($Array[1], 7, 1) Then _
            Return False
    
        ; Dritte Checknummer: Gültig bis
        If _Check_Number(StringLeft($Array[2], 6)) <> StringMid($Array[2], 7, 1) Then _
            Return False
    
        ; Ausweis abgelaufen? Wenn gewünscht, deaktivieren
        If _DateDiff('s', _JahresZahl(StringLeft($Array[2], 2   )) & '/' & _
                                      StringMid ($Array[2], 2, 2)  & '/' & _
                                      StringMid ($Array[2], 4, 2)  & ' ' & _
                                      '00:00:00', _NowCalc()) > 0 Then _
            Return False
    
        ; Vierte Checknummer: Die gesamte Personalausweis-ID
        If _Check_Number(StringLeft($Array[0], 10) & _
                         StringLeft($Array[1],  7) & _
                         StringLeft($Array[2],  7)) <> $Array[3] Then _
            Return False
    
        Return True
      EndFunc   ;==>_Perso_Check
    
      ; Informationen aus dem Personalausweis beziehen
      Func _Perso_Info($ID)
        Local Const $Array = StringSplit($ID, ' ', $STR_ENTIRESPLIT + $STR_NOCOUNT)
    
        Local $Return[$Ende] ; Array mit Daten aus AusweisNummer
    
        $Return[$Geburtstag  ] =             StringMid ($Array[1], 5, 2)  ; Geburtstag
        $Return[$Geburtsmonat] =             StringMid ($Array[1], 3, 2)  ; Geburtsmonat
        $Return[$Geburtsjahr ] = _JahresZahl(StringLeft($Array[1], 2   )) ; Geburtsjahr
    
        $Return[$Alter] = @Year - $Return[$Geburtsjahr]
    
        ; Hatte er schon Geburtstag?
        If (Number(@Mon )  < $Return[$Geburtsmonat]) Or _
           (Number(@Mon ) == $Return[$Geburtsmonat]  And _
            Number(@MDay)  < $Return[$Geburtstag  ]) Then _
            $Return[$Alter] -= 1
    
        If $Return[$Alter] < 18 Then
          $Return[$Volljaehrig] = False
        Else
          $Return[$Volljaehrig] = True
        EndIf
    
        $Return[$Ablauftag  ] =             StringMid ($Array[2], 5, 2)  ; Ausweis-Ablauftag
        $Return[$Ablaufmonat] =             StringMid ($Array[2], 3, 2)  ; Ausweis-Ablaufmonat
        $Return[$Ablaufjahr ] = _JahresZahl(StringLeft($Array[2], 2   )) ; Ausweis-Ablaufjahr
    
        $Return[$Herkunft] = StringRight($Array[0], 1)
    
        ; Ein Deutscher?
        If StringUpper($Return[$Herkunft]) == 'D' Then
          $Return[$Deutscher] = True
        Else
          $Return[$Deutscher] = False
        EndIf
    
        ; ErstwohnSitz als Nummer
        $Return[$Erstwohnsitz] = StringLeft($Array[0], 4)
    
        Return $Return
      EndFunc   ;==>_Perso_Info
    #EndRegion ===========================::[ Hauptfunktionen ]::=======================================
    
    
    #Region ==============================::[ Nebenfunktionen ]::=======================================
      Func _TextWidth($String)
        Local Const $Device = _WinAPI_GetDC($Window)
        Local Const $Script = _SendMessage($Window, $WM_GETFONT)
        Local Const $Object = _WinAPI_SelectObject($Device, $Script)
        Local Const $Dimens = _WinAPI_GetTextExtentPoint32($Device, $String)
        _WinAPI_SelectObject($Device, $Object)
        _WinAPI_ReleaseDC($Window, $Device)
        Return DllStructGetData($Dimens, 1)
      EndFunc   ;==>_TextWidth
    
      Func _CenterWindow($Width = -1, $Hight = -1)
        Local Const $Monitor = _WinAPI_MonitorFromWindow($Window, $MONITOR_DEFAULTTONEAREST)
        If $Width = -1 Or $Hight = -1 Then
          Local Const $Size = WinGetPos($Window)
          If $Width = -1 Then $Width = $Size[2]
          If $Hight = -1 Then $Hight = $Size[3]
        EndIf
        Local Const $Desktop = _WinAPI_GetMonitorInfo($Monitor)
        If @Error Then Return False
        Return _WinAPI_MoveWindow($Window, _
                                  (DllStructGetData($Desktop[1], 3) + _
                                   DllStructGetData($Desktop[1], 1) - $Width) / 2, _
                                  (DllStructGetData($Desktop[1], 4) + _
                                   DllStructGetData($Desktop[1], 2) - $Hight) / 2, _
                                  $Width, $Hight, True)
      EndFunc   ;==>_CenterWindow
    #EndRegion ===========================::[ Nebenfunktionen ]::=======================================
    Alles anzeigen

    Es scheint zu funktionieren, aber ich schrieb noch nie eine Zeile in PHP und habe deshalb kaum Ahnung. Die Hauptfunktionen sind intuitiv und mit dem PHP-Handbuch sowie dem Online-PHP-Code-Tester zustande gekommen.

    Wer mag, kann es ja mit der Variante von Kanashius ergänzen/erweitern.

    Wozu soll man das denn eigentlich gebrauchen können?

    Gruß, fee

  • Funktionsübergreifende FehlerCodeRückgabe

    • fee
    • 24. Juli 2023 um 07:54

    Ich nutze die Hilfe zwar sehr oft, aber für SetError() kam mir der Gedanke seltsamerweise nicht, denn ich vermutete den Fehler woanders und sah wohl den Code vor lauter Bytes nicht mehr. :rtfm:

    Vielen Dank für deine Erklärung AspirinJunkie !

  • Funktionsübergreifende FehlerCodeRückgabe

    • fee
    • 23. Juli 2023 um 22:37

    Hallo liebe Leute,

    ich verwende derzeit AutoIt 3.3.16.1 mit SciTE4AutoIt 4.4.6 (32 Bit) auf Windows 7 Pro SP1 (64 Bit).

    Warum "verschluckt" hier Funktion _Eins() den FehlerCode aus Funktion _Drei() im Gegensatz zur Funktion _Zwei(), die ihn erneut setzt?

    AutoIt: FehlerRückgabeTest
    #NoTrayIcon
    
    Opt('MustDeclareVars', 1)
    
    ConsoleWrite(@CRLF & '       Zurück Fehler')
    ConsoleWrite(@CRLF & '_Eins:   ' & _Eins() & '     ' & @Error)
    ConsoleWrite(@CRLF & '_Zwei:   ' & _Zwei() & '     ' & @Error)
    ConsoleWrite(@CRLF & @CRLF)
    
    Exit
    
    
    Func _Eins()
      Return _Drei()
    EndFunc
    
    Func _Zwei()
      Local $Return = _Drei()
      If @Error Then SetError(@Error)
      Return $Return
    EndFunc
    
    Func _Drei()
      Return SetError(1, 0, -1)
    EndFunc
    Alles anzeigen
    Code: SciTE-Ausgabe Eins
           Zurück Fehler
    _Eins:   -1     0
    _Zwei:   -1     1

    Soll das so sein, ist das ein Fehler oder mache ich etwas falsch?

    Übrigens, wenn ich statt obigem ConsoleWrite()-Block

    AutoIt: Alternativer ConsoleWrite-Block
    ConsoleWrite(@CRLF & '_Eins:')
    ConsoleWrite(@CRLF & 'Zurück: ' & _Eins())
    ConsoleWrite(@CRLF & 'Fehler: ' & @Error)
    ConsoleWrite(@CRLF & '_Zwei:')
    ConsoleWrite(@CRLF & 'Zurück: ' & _Zwei())
    ConsoleWrite(@CRLF & 'Fehler: ' & @Error)
    ConsoleWrite(@CRLF & 'Ende' & @CRLF)

    schreibe, dann wird der FehlerCode auch aus Funktion _Zwei() "verschluckt":

    Code: SciTE-Ausgabe Zwei
    _Eins:
    Zurück: -1
    Fehler: 0
    _Zwei:
    Zurück: -1
    Fehler: 0
    Ende

    obwohl in der Hilfe steht:

    Zitat von ConsoleWrite

    @error und @extended werden beim Return nicht gesetzt und bleiben so, wie sie vor dem Aufruf waren.

    Gruß, fee

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™