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

Beiträge von Bitnugger

  • [Nim] paramStr() / getFileInfo() zickt rum...

    • Bitnugger
    • 26. Mai 2020 um 22:41

    Hier die Lösung:

    Code
    include winim/[inc\shellapi]
    import os
    
    # The directory specified as a parameter is searched for MP3 files.
    # Example: "f:\Audio\MP3\Top\Top 40 Oldies Forever" - without backslash at the end of the path!
    
    var sPath:string
    
    echo "\nparamCount() = " & $paramCount()
    
    if paramCount() > 0:
      for p in 1..paramCount():
        sPath = paramStr(p)
        echo "sPath = " & sPath
        # With a backslash at the end, the string delimiter that follows is masked
        # so that it remains at the end of the parameter instead of the backslash.
        # "c:\temp\" ==>> c:\temp"
        echo "sPath[^1..^1]                              = " & sPath[^1..^1]
        echo "sPath[^1..^1] == $chr(34)                  = " & $(sPath[^1..^1]  == $chr(34))
        
        #if sPath[sPath.len-1..sPath.len-1] == $chr(34):
        if sPath[^1..^1] == $chr(34):
          echo "Bad path! Trim trailing quote"
          sPath = sPath[0..^2] # sPath[0..sPath.len-2]
          echo "sPath = " & sPath
        var fileSplit = splitFile(sPath)
        echo "dir  = " & fileSplit.dir
        echo "name = " & fileSplit.name
        echo "ext  = " & fileSplit.ext
        if PathIsDirectoryA(sPath) == FILE_ATTRIBUTE_DIRECTORY:
          echo "PathIsDirectoryA(sPath): sPath is a directory!"
        
        # It works that way too, but is more cumbersome.
    #[     try:
          var oFileInfo = getFileInfo(sPath)
          if $oFileInfo.kind == "pcDir":
            echo "getFileInfo(sPath): sPath is a directory!"
        except:
          echo "getFileInfo(sPath) failed!"
     ]#    
        
        # Iterate over all the files that match the pattern.
        for path in walkFiles($sPath & "\\*.mp3"):
          echo(path)
        
        # Iterate over all the directories that match the pattern.
        #for kind, path in walkDir(sPath):
        
        # Iterate over all the files and directories that match the pattern.
        #for path in walkPattern($sPath & "\\*.mp3"): # 
    Alles anzeigen
  • Dll erstellen

    • Bitnugger
    • 26. Mai 2020 um 22:24
    Zitat von BugFix

    Interessant ist natürlich, wie man Funktionen für AutoIt verfügbar machen kann.

    In der Tat... das ist es - sehr schön! Da kommen einem ja 1001 neue Ideen...

    Wieso wird denn "NimMain" exportiert? Mit Return type int bekomme ich 1816193777 bzw. 0x6C40EAF1.

  • [Nim] paramStr() / getFileInfo() zickt rum...

    • Bitnugger
    • 26. Mai 2020 um 13:31
    Zitat von BugFix

    Das ist ja auch nicht zulässig (auch in anderen Sprachen nicht). Mit dem Backslash am Ende maskierst du den Stringbegrenzer, sodass dieser statt Backslash am Ende des Parameters verbleibt.

    Verstehe... boar, wie tücke ist das denn... wird ein Pfad mit abschließenden Backslash in "" übergebe, muss ich prüfen, ob am Ende des Pfades ein " steht... das vordere wurde ja korrekt ausgefiltert... wird er ohne "" übergeben, sehe ich den Backslash in paramStr().

    Nicht zulässig... dann sag das mal AutoIt. ,-)

    Danke - du hast mir das Leben gerettet... wollte schon von der Brücke springen. 8o

  • [Nim] paramStr() / getFileInfo() zickt rum...

    • Bitnugger
    • 26. Mai 2020 um 13:18
    Zitat von Oscar

    Das geht auch einfacher:

    Ok, ich sag mal ja... wobei das aber nichts daran ändert, das es mit paramStr()/getFileInfo()/splitFile() nicht funktioniert und ich auch mit PathIsDirectoryA() nicht zum Ziel komme.

    Wenn ich PathIsDirectoryA() einen Pfad mit abschließenden Backslash übergebe, bekomme ich ein false und let sPath kann ich da eh nicht nehmen, weil ich den Pfad von paramStr() nehmen muss, da ich ja die Parameter auswerten will, mit denen die Exe aufgerufen wurde. Wie überprüfe ich also nun, ob der in paramStr() enthaltene Pfad einen abschließenden Backslash hat, wenn dieser doch von paramStr() unterschlagen wird?

    Was ich bräuchte, wäre eine alternative für paramStr()... grrr, das kann einem echt die Lust an Nim rauben!

  • [Nim] Multi-Monitor-Auswahl

    • Bitnugger
    • 26. Mai 2020 um 12:59
    Zitat von Oscar

    Ja, das geht, aber dann meckert wNim, weil dort bei pos und size die INTs 64-Bits haben.

    Das ist aber lustig... denn 64-Bits für pos und size bringen doch keinen Mehrwert, weil dafür 32-Bit völlig ausreichen, oder etwa nicht?

  • [Nim] Multi-Monitor-Auswahl

    • Bitnugger
    • 26. Mai 2020 um 12:39

    Habe es gerade getestet... es geht auch ohne Konvertierung nach int, wenn du bei type int32 nimmst:

    Code
    include winim/[inc\winuser]
    
    # Monitor-Objekt definieren (zum speichern der Werte)
    type oMonitor = object
      hMon: HMONITOR
      monitor: RECT
      work: RECT
      flags: DWORD
      pos: (int32, int32)
      size: (int32, int32)
    
    # Eine Sequenz (var. Array), um die Monitor-Objekte zu speichern
    var aDispInfo = newSeq[oMonitor]()
    
    # MONITORINFO-Struktur erstellen
    var tMonitorInfo: MONITORINFO
    tMonitorInfo.cbSize = DWORD(sizeof(MONITORINFO))
    
    # Callback-Funktion (wird einmal pro angeschlossenen Monitor aufgerufen)
    proc myEnumProc(hMonitor: HMONITOR,hDC: HDC,rect: LPRECT,lparam: LPARAM): WINBOOL {.stdcall.} =
      GetMonitorInfoA(hMonitor, tMonitorInfo.addr())
      aDispInfo.add(
        oMonitor(hMon: hMonitor,
                monitor: tMonitorInfo.rcMonitor,
                work: tMonitorInfo.rcWork,
                flags: tMonitorInfo.dwFlags,
                pos: (rect.left, rect.top),
                size: ((rect.right - rect.left), 
                       (rect.bottom - rect.top))
                ))
      return TRUE
    
    # Hiermit werden die Monitordaten geholt
    EnumDisplayMonitors(0, nil, myEnumProc, 0)
    
    # Debugausgabe von allen angeschlossenen Monitoren
    for i, oDisp in aDispInfo:
      echo "Display: " & $i
      echo oDisp
    Alles anzeigen
  • [Nim] Multi-Monitor-Auswahl

    • Bitnugger
    • 26. Mai 2020 um 12:26
    Zitat von Oscar

    Um mal auf Post#13 zurückzukommen. Das habe ich mittlerweile auch hinbekommen:

    Wow, das ging aber schnell... sag mal, schläfst du vor deinem PC? 8o

    Bin begeistert! :thumbup:

  • [Nim] paramStr() / getFileInfo() zickt rum...

    • Bitnugger
    • 26. Mai 2020 um 12:15

    Ich verzweifle hier gerade... entweder habe ich ein meterdickes Brett vor dem Kopf, oder paramStr()/getFileInfo()/splitFile() sind tatsächlich fehlerhaft.

    Eigentlich will ich nur wissen, ob der übergebene Parameter ein Verzeichnis oder ein File ist... dafür habe ich folgendes Script geschrieben:

    Code: Test.exe
    import os
    
    echo "\nparamCount() = " & $paramCount()
    if paramCount() > 0:
      for p in 0..paramCount():
        echo "paramStr(" & $p & ")  = " & $paramStr(p) # the final right backslash is cut off!
        var fileSplit = splitFile($paramStr(p))
        echo "dir  = " & fileSplit.dir
        echo "name = " & fileSplit.name
        echo "ext  = " & fileSplit.ext
        var oFileInfo = getFileInfo(paramStr(p))  # and here he still triggers an error!
        echo "oFileInfo.kind = " & $oFileInfo.kind & "\n"
    Alles anzeigen

    Das Problem dabei ist nun, dass ein Pfad keinen abschließenden Backslash haben darf, weil getFileInfo() sonst meckert und das Script abgebrochen wird. Hinzu kommt, das paramStr() den abschließenden Backslash nicht anzeigt, wobei getFileInfo() diesen aber dennoch bemeckert und deswegen das Script abbricht. Beim zweiten Parameter kommt der nächste Fehler bei splitFile()... da steht bei name = ... ein ", doch wenn das erste ausgefiltert wird, sollte das zweite auch nicht da sein. Und mit ' als Begrenzer geht es ja mal gar nicht...

    Hier der Aufruf des Scripts, einmal mit "" und einmal mit '' als Begrenzer, und die Ausgabe:

    Spoiler anzeigen

    M:\Temp>Test.exe "f:\Audio\MP3\Top\Top 40 Oldies Forever" "f:\Audio\MP3\Top\Top 40 Oldies Forever\"

    paramCount() = 2

    paramStr(0) = Test.exe

    dir =

    name = Test

    ext = .exe

    oFileInfo.kind = pcFile

    paramStr(1) = f:\Audio\MP3\Top\Top 40 Oldies Forever

    dir = f:\Audio\MP3\Top

    name = Top 40 Oldies Forever

    ext =

    oFileInfo.kind = pcDir

    paramStr(2) = f:\Audio\MP3\Top\Top 40 Oldies Forever"

    dir = f:\Audio\MP3\Top

    name = Top 40 Oldies Forever"

    ext =

    c:\Users\ghost\NIM\@Bitnugger\Test.nim(11) Test

    C:\Users\ghost\scoop\apps\nim\current\lib\pure\os.nim(3156) getFileInfo

    C:\Users\ghost\scoop\apps\nim\current\lib\pure\includes\oserr.nim(94) raiseOSError

    Error: unhandled exception: Die Syntax für den Dateinamen, Verzeichnisnamen oder die Datenträgerbezeichnung ist falsch.

    Additional info: "f:\\Audio\\MP3\\Top\\Top 40 Oldies Forever\"" [OSError]

    M:\Temp>Test.exe 'f:\Audio\MP3\Top\Top 40 Oldies Forever' 'f:\Audio\MP3\Top\Top 40 Oldies Forever\'

    paramCount() = 8

    paramStr(0) = Test.exe

    dir =

    name = Test

    ext = .exe

    oFileInfo.kind = pcFile

    paramStr(1) = 'f:\Audio\MP3\Top\Top

    dir = 'f:\Audio\MP3\Top

    name = Top

    ext =

    c:\Users\ghost\NIM\@Bitnugger\Test.nim(11) Test

    C:\Users\ghost\scoop\apps\nim\current\lib\pure\os.nim(3156) getFileInfo

    C:\Users\ghost\scoop\apps\nim\current\lib\pure\includes\oserr.nim(94) raiseOSError

    Error: unhandled exception: Die Syntax für den Dateinamen, Verzeichnisnamen oder die Datenträgerbezeichnung ist falsch.

    Additional info: "\'f:\\Audio\\MP3\\Top\\Top" [OSError]

    M:\Temp>

    Ganz so perfekt ist Nim dann wohl doch nicht...

    Und was mache ich jetzt?

  • [Nim] Multi-Monitor-Auswahl

    • Bitnugger
    • 26. Mai 2020 um 11:49
    Zitat von Oscar

    Manchmal komme ich da etwas durcheinander mit den Datentypen.

    Nicht nur du... und mit Nim wird es ja noch schlimmer... da kommen ja noch etliche hinzu, von denen ich noch nie gehört habe!

    Für AutoIt habe ich ein Script, das mir die Typen von MSDN nach AutoIt konvertiert: _MSDNDataType.au3

  • [Nim] Multi-Monitor-Auswahl

    • Bitnugger
    • 26. Mai 2020 um 11:12
    Zitat von Oscar

    EnumDisplayMonitor liefert da wohl ein "int32" zurück, "int" ist aber 64-Bit-Int.

    Hatte ich doch geschrieben...

    echo "rect.left = " & $rect.left.type.name

    ==>> rect.left = LONG

  • [Nim] Multi-Monitor-Auswahl

    • Bitnugger
    • 26. Mai 2020 um 09:02
    Zitat von Oscar

    Ich verstehe jetzt nicht so ganz, was Du mir damit sagen willst!?

    Nun, ich dachte erst, weil du ja hier pos und size als int deklariert hast...

    Code
    type oMonitor = object
      hMon: HMONITOR
      pos: (int, int)
      size: (int, int)

    dass es unnötig ist, hier auch noch mal nach int zu konvertieren...

    Code
      aDispInfo.add(
        oMonitor(hMon: hMonitor,
                pos: (int(rect.left), int(rect.top)),
                size: (int(rect.right - rect.left), 
                       int(rect.bottom - rect.top))
                ))

    bis ich es dann getestet habe...

    Code
    ...
    import typetraits
    ...
    echo "rect.left = " & $rect.left.type.name
    ==>> rect.left = LONG

    und da kam dann das "aha" bei mir... deshalb!

  • [Nim] Multi-Monitor-Auswahl

    • Bitnugger
    • 25. Mai 2020 um 15:37
    Zitat von Oscar

    pos: (int(rect.left), int(rect.top)),
    size: (int(rect.right - rect.left),
    int(rect.bottom - rect.top))

    Ganz schön tricky...

    Code
    import typetraits
    ...
    echo aDispInfo[0].size[0].type.name

    int

    Hier noch ein Link den ich gefunden habe: https://matthiashager.com/nim-object-oriented-programming

  • [Nim] und die BASS-Dll

    • Bitnugger
    • 24. Mai 2020 um 23:43
    Zitat von Oscar

    echo "Position: " & $int(iSecondsNow) & " / " & $int(iSeconds)

    sleep(1000)

    Wenn die Ausgabe immer in derselben Zeile bleiben soll:

    Code
    # "\r" puts the write cursor back at the beginning of the line
    
    #[
    stdout.write "\rPlay: " & $int(iSecondsNow) & " / " & $int(iSeconds)                     # Play: 118 / 204
    ]#
    
    stdout.write "\rPlay: " & fmt"{$int(iSecondsNow):>4}" & " / " & fmt"{$int(iSeconds):>4}" # Play:  118 /  204
    sleep(1000)
  • CommandLineParser

    • Bitnugger
    • 24. Mai 2020 um 13:03
    Zitat von BugFix

    Das sind alles Fälle, die bei der Verwendung niemals auftreten, sondern ausschließlich in der Testumgebung mit SciTE. Insofern kann es getrost ignoriert werden.

    Die Leerzeichen am Ende des letzten Parameters können doch auch vorkommen, wenn eine Exe mit Parametern gestartet wird.

    parse_exe.png

    Zitat von BugFix

    Fand ich sinnvoller, als das, was original in Nim damit passiert: "f", "i" und "l" würden dort als ShortNoVal erkannt werden, "e" wäre ShortVal mit val "test".

    Ja, so kenne ich das auch von Linux her... den Parameter zu ignorieren, halte ich für keine gute Idee.

    PS: Einige Programme verwenden als Trennzeichen statt des "=" ein " ", z.B. http.exe -d C:/xampp/apache, oder gar keins, z.B. rar.exe -M5 -s.

  • [Nim] Multi-Monitor-Auswahl

    • Bitnugger
    • 24. Mai 2020 um 10:37

    Jetzt noch GetMonitorInfo hinzufügen, um rcWork und dwFlags zu bekommen, dann wäre es perfekt... 8o

    rcMonitorwird benötigt , wenn ein Fenster maximiert ist, wenn nicht, dann rcWork.

  • [Nim] Multi-Monitor-Auswahl

    • Bitnugger
    • 24. Mai 2020 um 09:32
    Zitat von Oscar

    Den Desktop-DC braucht man schon, damit die Werte relativ zum primären Monitor sind.

    Ansonsten kannst Du evtl. benötigte Fenster nicht auf die anderen Monitore verschieben.

    Mit "hDC = 0" sind die Werte relativ zum virtuellen Desktop (immer positiv).

    Hm, die Werte sind bei mir identisch, egal ob mit oder ohne DC.

    Code
    EnumDisplayMonitors(0, nil, lpfnenum, data)
    ----------------------------------------------------------------
    Display 0: 0x0000000000010001,      0,      0,   1920,   1080
    Display 1: 0x0000000000010003,  -1920,      0,      0,   1080
    ----------------------------------------------------------------
    dcScreen = GetDC(0)
    EnumDisplayMonitors(dcScreen, nil, lpfnenum, data)
    Display 0: 0x0000000000010001,      0,      0,   1920,   1080
    Display 1: 0x0000000000010003,  -1920,      0,      0,   1080
    ----------------------------------------------------------------

    Hier finde ich zumindest nichts zu 'relativ': https://docs.microsoft.com/en-us/windows/…displaymonitors

    Wo kann ich das nachlesen?

  • CommandLineParser

    • Bitnugger
    • 24. Mai 2020 um 09:01
    Zitat von BugFix

    Übrigens, wenn ihr das aus SciTE heraus testet (mit Shift+F8 Parameter setzen) bekommt ihr 3 zusätzliche Parameter: /stdin /stdout "Programmaufrufzeile", die in kompilierten Skripten natürlich nicht enthalten sind.

    Ich bekomme nur 2 Parameter, /stdin fehlt bei mir.

    Wenn ich dein Bsp. in SciTE ohne zusätzliche Parameter starte, sollte die Ausgabe mit Index 1 enden, sie endet aber mit Index 4.

    Dies liegt daran, weil (bei mir) am Ende von $CmdLineRaw noch 4 Leerzeichen stehen, bzw. 3, wenn zusätzliche Parameter übergeben werden. Ist das bei dir nicht so?

    AutoIt
    ConsoleWrite("'" & $CmdLineRaw & "'" & @CRLF)
    ;==>> '/ErrorStdOut "F:\_Archive\_Programmieren\AutoIt3\User\BugFix\CmdLineParser\CmdLineParser_Example.au3"    '

    Deshalb habe ich die erste Zeile in der Funktion _CmdLineParser_Init so geändert, und alles ist wieder gut:

    AutoIt
    Local $cmdLine = StringStripWS($CmdLineRaw, 2)

    Fast alles...

    Zusätzliche Parameter: -file="test" --dir="m:\Temp" ; -file ist hier nicht korrekt, richtig wäre: --file

    Der Parameter -file wird einfach unterschlagen... hier sollte das Script mit einer Fehlermeldung (Usage) abbrechen.

    Zusätzliche Parameter: -file="test" --d="m:\Temp" ; --d ist hier nicht korrekt, richtig wäre: -d

    Hier sollte das Script auch mit einer Fehlermeldung abbrechen, da es sonst zu Konflikten mit -d kommen kann.

    key: /ErrorStdOut

    param: /ErrorStdOut

    Hm, in dem Fall hat key doch gar keinen Parameter?!

  • [Nim] Multi-Monitor-Auswahl

    • Bitnugger
    • 24. Mai 2020 um 06:26

    Ihr seid ja ein wirklich gutes Team... ;)

    Ich habe es etwas geändert, damit auch hMonitor übergeben und die Ausgabe formatiert wird.

    Code
    include winim/[inc\winuser]
    import strutils
    
    proc printf(formatstr: cstring) {.header: "<stdio.h>", varargs.}
    
    var
      aMonitors: array[0..5, array[0..4, int]] # 0..5 = max. 6 Monitore
      iCount: int = 0
      bHeader: bool = true
      sHeader: string = repeat("-", 64)
    
    printf("\naMonitors.len = %d # Rows\n", aMonitors.len)
    
    let sFO = "Display %d: 0x%s, %6d, %6d, %6d, %6d\n"
    proc prtout(): void =
      if bHeader == true:
        echo sHeader
        bHeader = false
      
      for i in 0..iCount - 1:
        printf(sFO, i, toHex(aMonitors[i][0]), 
        aMonitors[i][1], aMonitors[i][2], aMonitors[i][3], aMonitors[i][4])
      echo sHeader
    
    proc MyInfoEnumProc(hMonitor: HMONITOR,hDC: HDC,rect: LPRECT,lparam: LPARAM): WINBOOL {.stdcall.} =
      aMonitors[iCount][0] = hMonitor
      aMonitors[iCount][1] = rect.left
      aMonitors[iCount][2] = rect.top
      aMonitors[iCount][3] = rect.right
      aMonitors[iCount][4] = rect.bottom
      inc(iCount) # iCount += 1
      return TRUE
    
    var 
      lpfnenum = MyInfoEnumProc # callbackfunktion
      data: LPARAM
      dcScreen = 0
    #let dcScreen = GetDC(0)    # DC Desktop
    
    EnumDisplayMonitors(dcScreen, nil, lpfnenum, data)
    #ReleaseDC(0, dcScreen)
    prtout()
    
    #[
    iCount = 0
    EnumDisplayMonitors(0, nil, lpfnenum, data)
    prtout()
    ]#
    Alles anzeigen
  • VSCodium - Editor: Breite ändern

    • Bitnugger
    • 23. Mai 2020 um 01:41
    Zitat von BugFix

    Du wolltest, dass der AutoWrap in der Hälfte, die du zusammen schiebst, ebenfalls AutoWrap mitwandert.

    Ja, genau das meinte ich... "AutoWrap" habe ich nicht in den Einstellungen finden können, aber...

    Editor: Word Wrap Column

    Steuert die umschließende Spalte des Editors, wenn "#editor.wordWrap#" den Wert "wordWrapColumn" oder "bounded" aufweist.

    ...den Wert habe ich mal auf 106 gesetzt (Benutzer), und...

    "editor.rulers": [

    80,

    106],

    Wenn ich dann im normalen Modus das rechte Editor-Fenster so weit wie geht nach rechts verschiebe, vergrößert sich das aktive Fenster und das andere wird entsprechend verkleinert... wenn ich das rechte Editor-Fenster auch nur einen Pixel vergrößere, geht es nicht mehr. Dabei franzt der Text allerdings in den Bereich der Scrollbar, was leider nicht so gut aussieht.

    Warum ich das aber eigentlich möchte... damit im Zen Modus die Fenster den zur Verfügung stehenden Platz optimal ausnutzen. Die eierlegende Wollmilchsau wäre also, dass im normalen Modus die Breite auf 80 steht, im Zen Modus aber auf 106. 8o

    zenmode_80, zenmode_106, normalmode_106

    zenmode_80.png zenmode_106.png normalmode_106.png

    Dateien

    zenmode_80.png 267,86 kB – 0 Downloads zenmode_106.png 276,24 kB – 0 Downloads
  • Tomtom Navi prüfen ob Netzwerk aktiv ist

    • Bitnugger
    • 22. Mai 2020 um 21:42
    Zitat von Windi

    Soll ich ein neues Thema aufmachen?

    Das bleibt völlig dir überlassen... vielleicht änderst du aber auch nur den Titel... z.B. in: TomTom: Viele Fragen

    Google: "autoit formular ausfüllen" liefert direkt als erstes...

    [AutoIt] Webseiten Formulare ausfüllen - Teil 1 - whatsupMM

    [AutoIt] Webseiten Formulare ausfüllen - Teil 2 - whatsupMM

    Vielleicht findest du aber hier etwas: https://www.youtube.com/results?search…hinzuf%C3%BCgen

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™