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

  • Mit Autoit Chipkarten auslesen

    • BugFix
    • 14. Juli 2020 um 14:18
    Zitat von hipfzwirgel

    Die dort unterstützten Kartenleser schlagen dann mit mehreren hundert Euro zu buche.

    Ich hatte 1996 mein Internetbanking auf HBCI umgestellt. Somit verwendete ich eine Chipkarte zur Identifikation. Der Chipkartenleser war ein Wald- und Wiesenprodukt. Neugierig, wie ich bin, wollte ich dann sehen, ob ich meine Krankenkassenkarte (damals frisch eingeführt) auch lesen kann. Mit etwas Suche im Netz fand ich dann auch eine Software (Free), die das tat und die frei zugänglichen Daten auch abspeichern ließ - wenn ich mich recht erinnere als *.csv.

    Falls ich noch ein Image dieses alten Rechners habe, schaue ich mal nach, welche Software das war. Es könnte Chipcardmaster gewesen sein.

    Hier findest du eine Lösung für Python. Vielleicht kannst du das umsetzen.

  • Opt ("SendKeyDelay", 150)

    • BugFix
    • 13. Juli 2020 um 19:43

    Die übliche Vorgehensweise dabei ist, dass man den alten Optionswert speichert und wieder darauf zurücksetzt:

    AutoIt
    $opt_old = Opt("SendKeyDelay", 150)
    ; some Code
    ; zurücksetzen:
    Opt("SendKeyDelay", $opt_old)
  • NSI Nim-SciTE-Interface - Projekt

    • BugFix
    • 13. Juli 2020 um 19:38

    Ich habe jetzt die Websuche (Suche nach markiertem Begriff aus SciTE) mit Nim umgesetzt.

    Die Suchbegriffabfrage erfolgt mit dem SciTEInterface (SearchSelection). MIt dem gefundenen Begriff wird das Suchfenster aufgerufen. Das ist ein eigenständiges Programm (WebSearch) und kann mit oder ohne Suchbegriff aufgerufen werden. Für die Nutzung mit SciTE muss sich die websearch.exe im selben Ordner, wie die SearchSelection.exe befinden.

    Neben den beiden Projektordnern habe ich für Interessierte auch die kompilierten Versionen angehängt.

    Die Anbindung in SciTE könnte dann so aussehen:

    Code: SciTEUser.properties
    # 35 Search Selected text
    command.name.35.*=Suche markierten Begriff
    command.35.*="C:\CODE\nim\SciTETools\SearchSelection.exe"
    command.mode.35.*=0
    command.shortcut.35.*=Ctrl+Shift+S
    Python: SearchSelection.nim
    from functions import CurrentDir
    import os, osproc, times, nsiface, strformat, strutils
    
    ClearOutput()
    let websearch = CurrentDir().joinPath("websearch.exe")
    if not websearch.fileExists():
      OutputConsole(fmt("!> ERROR: Can't find file \"{websearch}\"!"))
      quit(QuitFailure)
    
    let 
      app = getAppFilename().replace("\\", "\\\\")
      time = now().format("[HH:mm:ss]")
    OutputConsole(fmt(">> Nim-SciTE-Interface [v{verNSI}] by @BugFix\\n-> {time} Running: {app}"))
    
    # get selected text from SciTE
    let sel = LuaFuncGet(LuaGetSelection, ParseLuaSelection, EditorSelection)
    
    # auch möglich mit Default Parser, da nur Text (nicht Länge) benötigt:
    # let sel = LuaFuncGet("editor:GetSelText()") 
    
    OutputConsole(fmt("+> Selection: {sel.text}"))
    
    # make cmdLine & execute
    let cmd = fmt("\"{websearch}\" {sel.text}")
    discard execCmd(cmd)
    Alles anzeigen


    Code: WebSearch.nim
    include winim/[inc\winuser]
    import functions        # eigene Procedures ausgelagert
    import BinToBase64, res # bin64-Ressourcen & Umwandlungsfunktion
    import os, parseopt, parsecfg, tables, strutils
    import wNim/[wApp, wFrame, wPanel, wTextCtrl, wComboBox, wStaticText, 
                 wCheckBox, wButton, wToolTip, wFont, wImage, wIcon, wBitmap,
                 wStaticBitmap]
    
    #========== DEBUG - MODE ============================================
    var debug = false                  # für "echo DEBUG" auf true setzen
    #====================================================================
    
    #========== cmd-Line auswerten ======================================
    # erwartet wird kein oder ein einzelner Parameter (Suchstring)
    let cmdLine = commandLineParams()
    if debug: echo "cmdLIne: ", cmdLine
    var 
      search_item: string
      p = initOptParser(cmdLine)
    for kind, key, val in p.getopt(): 
      if kind == cmdArgument: search_item = key
    if debug: echo "cmdLine-SearchItem: ", search_item
    #====================================================================
    
    #========== ini - initialization ====================================
    let ini_file = CurrentDir().joinPath("websearch.ini")
    var ini: Config
    
    if not ini_file.fileExists():
      echo "None INI"
      ini = newConfig()
      ini.setSectionKey("engines","Google",r"https://www.google.de/search?q=")
      ini.setSectionKey("engines","Startpage",r"https://www.startpage.com/do/dsearch?query=")
      ini.setSectionKey("sites","AutoIt-DE","autoit.de")
      ini.setSectionKey("sites","AutoIt-EN","autoitscript.com")
      ini.setSectionKey("sites","MSDN",r"msdn.microsoft.com")
      ini.writeConfig(ini_file)
    
    ini = loadConfig(ini_file)
    #====================================================================
    
    #========== websearch window ========================================
    type
      CtrlID = enum  # Festlegen der ID für Controls 
        idEngines = wIdUser, idSites, idItem, idNewVal
    
    var 
      combo_change: wComboBox       # Combo, in der aktuell neuer Eintrag erfolgte
      ini_has_changed: bool = false # wenn neuer Eintrag -- bei Beenden speichern
    
    let
      wsApp = App()
      ico_frame = Icon(ico_web_bin.Base64ToBin())
      ico_help = Icon(ico_help_bin.Base64ToBin())
      wsFrame = Frame(title="WEB - SUCHE",size=(600,280))
      wsPanel = wsFrame.Panel()
      wsBtnExit = wsPanel.BitmapButton(ico_exit_bin.Base64ToBin(), size=(24,24), 
                                       style=wBorderRaised)
      wsLabelEngine = wsPanel.StaticText(label="Suchmaschine")
      wsCheckSite = wsPanel.CheckBox(label=" Suchen auf Seite [optional]")
      wsLabelItem = wsPanel.StaticText(label="Suchbegriff")
      wsBtnNewVal = wsPanel.Button(label="Speichere neuen Eintrag")
      wsBtnHelp = wsPanel.Button(label="Hilfe")
      wsBtnSearch = wsPanel.Button(label="Suchen")
      wsComboEngines = wsPanel.ComboBox(id=idEngines,style=wCbDropDown)
      wsComboSites = wsPanel.ComboBox(id=idSites,style=wCbDropDown)
      wsItem = wsPanel.TextCtrl(value=search_item,id=idItem,style=wBorderSunken)
      wsNewValue = wsPanel.TextCtrl(id=idNewVal,style=wBorderSunken)
      wsHelp = wsFrame.Frame(title="Hilfe",size=(500,300), 
                             style=wCaption or wPopupWindow)
      wsHelpPanel = wsHelp.Panel()
      text_help = # ACHTUNG! Zeilenumbruch in Windows-Editfeld: \r\n
        "Erfassen neuer Suchmaschinen / Suchseiten\r\n\r\n" &
        "In der entsprechenden Combobox einen neuen Displaynamen für die Suchmaschine oder -seite eintragen und mit <ENTER> bestätigen.\r\n" &
        "Eine Textfeld wird eingeblendet, in dem die suchmaschinenspezifische " & "Adresszeile (z.B. \"www.yandex.com/search/?text=\") oder die Adresse " & "der Webseite eingetragen werden.\r\n" &
        "Abschließend den neuen Eintrag speichern."
      font_courier = Font(faceName="Courier New", pointSize=12)
      wsHelpText = wsHelp.TextCtrl(value=text_help,
                          style=wBorderSunken or wTeMultiLine or wTeReadOnly)
    
    wsHelpText.setFont(font_courier) # Font für Hilfetext
    wsFrame.disableCloseButton()     # Close-Button Suchfenster deaktivieren
    wsFrame.setIcon(ico_frame)
    wsHelp.setIcon(ico_help)
    wsNewValue.TextCtrlSetCueBanner(
               "Wert für den neuen Combobox-Eintrag hier erfassen")
    wsNewValue.hide()
    wsBtnNewVal.hide()
    
    proc ComboFill(combo: wComboBox, sec: OrderedTableRef[string,string]) =
      for k, _ in sec.pairs(): combo.append(k) 
      combo.select(0)
    
    wsComboEngines.ComboFill(ini.Section("engines"))
    wsComboSites.ComboFill(ini.Section("sites"))  
    
    proc AppExit() =
      if debug: echo "exit - ini_has_changed: ", ini_has_changed
      if ini_has_changed: 
        if debug: echo "Write to INI"
        ini.writeConfig(ini_file)
      wsFrame.delete()
    
    proc KeyByComboSelection(combo: wComboBox, sec: string): string =
      var index = combo.getSelection()
      if index < 0: index = 0 
      result = ini.Section(sec).Key(combo.getText(index))
    
    proc Search() =
      if not wsItem.isEmpty():
        let 
          text = wsItem.getValue()
          engine = wsComboEngines.KeyByComboSelection("engines")
        var site = "%20site:" & wsComboSites.KeyByComboSelection("sites")
        if not wsCheckSite.isChecked(): site = ""
        let cmd = engine & text & site
        if debug: echo "Search: [", text, "] cmd: ", cmd
        MyShellExecute(file=cmd)
        AppExit()
      else: wsItem.setValue("SUCHBEGRIFF FEHLT!")
    
    wsFrame.wEvent_TextEnter do (event: wEvent):  # ENTER in einem Textfeld
      let sender = event.getEventObject()         # wer hat das Event gesendet
      case sender.getId()                         # welche ID hat das Ctrl
      of idEngines: 
        if debug: echo "wEvent_TextEnter - Engines"
        combo_change = wsComboEngines
      of idSites: 
        if debug: echo "wEvent_TextEnter - Sites"
        combo_change = wsComboSites
      of idItem: 
        if debug: echo "wEvent_TextEnter - Search-Item"
        Search()
      else: discard
      wsNewValue.show()
      wsBtnNewVal.show()
    
    wsBtnSearch.wEvent_Button do ():
      Search()
    
    wsBtnHelp.wEvent_Button do ():
      wsHelp.show()
    
    wsBtnNewVal.wEvent_Button do ():
      # Wurde ein Wert erfasst
      let new_val = wsNewValue.getValue()
      if new_val == "": wsFrame.MessageBox("Für den neuen Eintrag wurde kein Wert erfasst!" ,"FEHLER", MB_OK or MB_ICONERROR)
      else:
        # Ini Sektion ermitteln, in der der neue Wert eingetragen wird
        var section = "engines"
        if combo_change.id == idSites: section = "sites"
        # Wert aus Combo, in der geändert wurde, auslesen (wEvent_TextEnter)
        let combo_val = combo_change.getValue() 
        # Prüfen ob der Wert noch nicht existiert (Index von Itemliste abfragen)
        let idx = combo_change.findText(combo_val)
        if debug: echo "gesuchter Eintrag Combo[", section, "]: ", 
                                         combo_val, " - Index: ", idx
        if idx == -1:  # Wert existiert noch nicht
          # der Combo-Liste hinzufügen
          combo_change.append(combo_val)
          # in Ini-Table Displayname und Wert eintragen
          ini.setSectionKey(section, combo_val, new_val)
          # Speichern der Ini bei Beenden veranlassen
          ini_has_changed = true
          if debug: echo "ini_has_changed: ", ini_has_changed
        else: wsFrame.MessageBox("Der Eintrag in der ComboBox \"" & 
                      section.capitalizeAscii() & "\" existiert bereits!",
                      "Achtung!", MB_OK or MB_ICONSTOP)
      wsNewValue.clear()
      wsNewValue.hide()
      wsBtnNewVal.hide()
    
    proc helpLayout() =
      wsHelp.layout:
        wsHelpPanel:
          width = wsHelp.width
          height = wsHelp.height
        wsHelpText:
          left = 15
          top = 15
          width = wsHelpPanel.width - 30
          height = wsHelpPanel.height - 30
    
    proc layout() =
      wsFrame.layout:
        wsPanel:
          width = wsFrame.width
          height = wsFrame.height
        wsBtnExit:
          right = wsFrame.width - 15
          top = 5
        wsLabelEngine:
          left = 15
          top = 15
        wsCheckSite:
          left = wsFrame.width / 2 + 15
          top = 15
        wsComboEngines:
          left = 15
          top = wsLabelEngine.bottom + 10
          width = wsFrame.width / 2 - 30
        wsComboSites:
          left = wsCheckSite.left
          top = wsComboEngines.top
          width = wsComboEngines.width
        wsLabelItem:
          left = 15
          top = wsComboEngines.bottom + 15
        wsItem:
          left = 15
          top = wsLabelItem.bottom + 10
          width = wsFrame.width - 30
        wsNewValue:
          left = 15
          top = wsItem.bottom + 10
          width = wsFrame.width - 30
        wsBtnNewVal:
          left = 15
          top = wsNewValue.bottom + 15
          width = wsBtnNewVal.getBestSize().width
        wsBtnHelp:
          centerX = wsFrame.centerX
          top = wsBtnNewVal.top
          width = wsBtnNewVal.width
        wsBtnSearch:
          right = wsFrame.width - 15
          top = wsBtnNewVal.top
          width = wsBtnNewVal.width
    
    wsBtnSearch.setFocus()
    
    wsFrame.wEvent_Size do ():
      layout()
    
    wsBtnExit.wEvent_CommandLeftClick do ():
      AppExit()
    
    wsFrame.wIdExit do ():  discard
    
    wsHelp.wIdExit do ():
      wsHelp.hide()
    
    wsHelp.minSize = (500,300)
    wsHelp.maxSize = (500,300)
    wsHelp.center()
    helpLayout()
    
    wsFrame.minSize = (600,280)
    wsFrame.maxSize = (int(GetSystemMetrics(SM_CXSCREEN)),280)
    layout()
    wsFrame.center()
    wsFrame.show()
    
    wsApp.mainLoop()
    #====================================================================
    Alles anzeigen

    Hier mal noch ein Bild dazu:

    websearch.PNG

    Dateien

    kompiliert.zip 860,51 kB – 485 Downloads SearchSelection.zip 5,01 kB – 552 Downloads WebSearch.zip 30,28 kB – 462 Downloads
  • Icon für Nim-Exe setzen: setExeIco

    • BugFix
    • 12. Juli 2020 um 17:30

    Wir können zwar für GUI in Nim Programmen ein Icon setzen, nicht aber für die erstellte Exe selbst.

    Mit RessourceHacker kann man das erledigen. Um das etwas zu vereinfachen, habe ich den Kommandozeilenaufruf für RH "eingepackt".

    Am Besten, man erstellt eine eigene Umgebungsvariable "ResHack" mit dem Pfad zur RessourceHacker.exe. Diese wird standardmäßig im Programm abgefragt.

    Wenn man jetzt noch die setExeIco.exe zur Umgebungsvariable "Path" hinzufügt, hat man einen recht komfortablen Aufruf aus jedem beliebigen Ordner.

    Parameter 1 und 2 sind erforderlich - in dieser Reihenfolge (Exe-bei-der-Icon-gesetzt-wird, Icon-Pfad). Optionale Parameter sind:

    --rh:Pfad_zum_Reshacker - überschreibt evtl. vorhandene Umgebungsvariable

    --new:neuer_Pfad_der_exe_nach_Setzen_des_Icon - standardmäßig wird der Pfad der Exe unverändert übernommen

    Syntax (Bsp):

    C:\CODE\nim\_myExamples_>setExeIco bounds.exe "C:\Users\BugFix\Pictures\ICO\Gnome-Face-Monkey.ico" 

    Aufruf des Reshackers erfolgt dann mit:

    "C:/portable/resource_hacker/ResourceHacker.exe" -open "bounds.exe" -save "bounds.exe" -action addskip -res "C:\Users\BugFix\Pictures\ICO\Gnome-Face-Monkey.ico" -mask ICONGROUP,MAINICON,

    Code: setExeIco.nim
    import os, osproc, parseopt, strformat
    
    # EMPFOHLEN:
    # Einrichten Benutzervariable
    #   Key: ResHack
    #   Val: "Pfad\zur\ResourceHacker.exe"
    
    # Syntax:
    # setExeIco.exe "Hier\Icon\setzen.exe" "Path\MyIcon.ico" --new: "Unter\anderem\Namen\Speichern.exe" --rh:"Pfad\zur\ResourceHacker.exe" 
    
    # --new und --rh sind optional. Sollte --rh angegeben werden, obwohl Environmentvariable "ResHack" gesetzt ist, wird der Wert von --rh verwendet.
    
    let cmdLine = commandLineParams()
    var 
      p = initOptParser(cmdLine)
      rh_path: string = getEnv("ResHack")
      set_exe, ico_path, new_exe: string
      arg_num = 0
      cmd_str: string
    
    for kind, key, val in p.getopt(): 
      case kind
      of cmdArgument:
        arg_num += 1
        if arg_num == 1: set_exe = key
        elif arg_num == 2: ico_path = key
        else: discard
      of cmdLongOption:
        case key
        of "--new": new_exe = val
        of "--rh": rh_path = val
        else: discard
      else: discard
    
    if new_exe == "": new_exe = set_exe
    
    if rh_path == "": 
      echo "Reshacker nicht gefunden"
    else:
      cmd_str = fmt("\"{rh_path}\" -open \"{set_exe}\" -save \"{new_exe}\" -action addskip -res \"{ico_path}\" -mask ICONGROUP,MAINICON,")
      discard execCmd(cmd_str)
    Alles anzeigen
  • GUI ohne Close-Button?

    • BugFix
    • 11. Juli 2020 um 11:07

    Danke für eure Tipps. Disablen geht so ganz praktisch.

    Ich versuche mal weiter, ob man den Button auch vom Menü entfernen kann.

  • ​Sammlung: Nim Snippets / Procedures

    • BugFix
    • 10. Juli 2020 um 18:53

    ShellExecute ist ja ein unverzichtbares Werkzeug.

    Ich habe den Aufruf hier vereinfacht, damit man das ständige Casten nicht an der Backe hat und mit "normalen" Strings arbeiten kann.

    Python
    include winim/[inc\winuser]
    from winim/inc\shellapi import ShellExecute
    
    # https://docs.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-shellexecutea
    proc MyShellExecute(hwnd: HWND = 0, operation: string = "", file: string,
                        param: string = "", dir: string = "", 
                        show: INT = SW_SHOW): HINSTANCE {.discardable.} =
      proc PointerOrNil(a: WideCStringObj): LPCWSTR = 
        if a == nil: result = nil
        else: result = cast[LPCWSTR](addr a[0])
      var 
        o_cs: WideCStringObj = nil 
        f_cs: WideCStringObj = newWideCString(file & chr(0),file.len + 1)
        p_cs: WideCStringObj = nil 
        d_cs: WideCStringObj = nil
      if operation != "":o_cs = newWideCString(operation & chr(0),operation.len + 1)
      if param != "": p_cs = newWideCString(param & chr(0),param.len + 1)
      if dir != "": d_cs = newWideCString(dir & chr(0),dir.len + 1)
      result = ShellExecute(hwnd, o_cs.PointerOrNil(), f_cs.PointerOrNil(), 
                            p_cs.PointerOrNil(), d_cs.PointerOrNil(), show)
    
    
    MyShellExecute(file="https://autoit.de/wcf/")
    Alles anzeigen
  • GUI ohne Close-Button?

    • BugFix
    • 10. Juli 2020 um 15:08
    Zitat von UEZ

    Hier ein Beispiel, um das Close Button zu deaktivieren

    Ja Danke, aber das ist in etwa derselbe Aufwand, wie eine eigene Titlebar. Werde ich mir in Ruhe überlegen, was besser ist.

    EDIT:

    Der Close Button wird damit nur funktionslos, das geht genauso mit umleiten der Msg. Ich hätte den Button gerne komplett weg.

  • GUI ohne Close-Button?

    • BugFix
    • 10. Juli 2020 um 13:06

    Ich möchte eine GUI erstellen, die alle Elemente der Standard Titelleiste anzeigt aber nicht den Close-Button. Aber das ist wohl nicht möglich. X/

    Oder hat das jemand mal hinbekommen. Ich habe keine große Lust, mir eine eigene Titelbar zu erstellen.

    AutoIt
    #include <WindowsConstants.au3>
    
    ; Standard: Icon + Titel + MinBox + MaxBox + CloseButton
    _GuiStyle()
    
    ; WS_CAPTION & WS_SYSMENU & WS_MAXIMIZEBOX & WS_MINIMIZEBOX: wie Standard (WS_SYSMENU muss verwendet werden)
    _GuiStyle(BitOR($WS_CAPTION, $WS_SYSMENU, $WS_MAXIMIZEBOX, $WS_MINIMIZEBOX))
    
    ; WS_CAPTION & WS_POPUPWINDOW: Icon + Titel + CloseButton
    _GuiStyle(BitOR($WS_CAPTION, $WS_POPUPWINDOW))
    
    ; WS_CAPTION & WS_POPUPWINDOW: Titel
    _GuiStyle(BitOR($WS_CAPTION, $WS_POPUP))
    
    ; GESUCHT: Icon + Titel + MinBox + MaxBox  OHNE CloseButton
    
    Func _GuiStyle($iStyle=-1)
        Local $hGui = GUICreate('Test',400,300,-1,-1,$iStyle)
        Local $exit = GUICtrlCreateButton('Exit', 50,50,80,25)
        GUISetState()
        While 1
            If GUIGetMsg() = $exit Then Return
        WEnd
    EndFunc
    Alles anzeigen
  • Problem: Button mit Icon - Icon ist verschoben

    • BugFix
    • 10. Juli 2020 um 11:58
    Zitat von Oscar

    Mit StaticBitmap kann man aber auch einen (randlosen) Button erzeugen

    Danke. :thumbup:

    Daraus habe ich gleich mal eine allgemeine Funktion erstellt, die mit allen Bildquellen arbeitet. Der Funktionsname ist eigentlich nicht exakt, da kein Button im eigentlichen Sinn, sondern ein StaticBitmap erstellt wird. :whistling:

    Interessant ist, dass nicht alle Angaben des Window-Style zum erwarteten Verhalten führen. "wBorderRaised" zeigt keinen Effekt, dafür erzeugt "wBorderDouble" diesen Effekt und Double gibt es nicht.

    Ich habe deshalb umgeroutet, sodass bei "Raised" auch der Button erhaben dargestellt wird. "Double" habe ich auf "Simple" umgeleitet, ergibt noch den meisten Sinn.

    Code
    # works with: *.ico / *.png / *.bmp / *.jpg
    # Styles:
    #   wBorderStatic:  leicht abgesenkt
    #   wBorderSimple:  dünner Rand
    #   wBorderRaised:  erhaben (intern: wBorderDouble)
    #   wBorderSunken:  abgesenkt
    proc BitmapButton(hwnd: wWindow, source: string, pos: wPoint=wDefaultPoint, 
                      size: wSize=wDefaultSize, style: wStyle=wSbAuto): wStaticBitmap =
      let bmp = source.Image().scale(size=size).Bitmap()
      var used_style = style
      if style == wBorderRaised: used_style = wBorderDouble
      elif style == wBorderDouble: used_style = wBorderSimple
      result = hwnd.StaticBitmap(pos=pos, size=size, bitmap=bmp, style=used_style)
    Alles anzeigen
  • Problem: Button mit Icon - Icon ist verschoben

    • BugFix
    • 9. Juli 2020 um 23:35

    Mir ist aufgefallen, dass immer, wenn ich Icon auf Button setze, diese nach rechts versetzt platziert werden und zusätzlich auch der rechte Rand beschnitten wird.

    Dabei ist es egal, ob ich das Icon direkt aus der Datei oder aus einem IconImage erstelle. Wie kann man das korrigieren?

    Die Icon Datei ist im Anhang - nur noch umbenennen.

    Code
    import os
    import wNim/[wApp, wFrame, wPanel, wButton, wIcon]
    
    proc CurrentDir(): string =
      result = getAppFilename().splitPath().head
    
    
    let 
      icon = Icon(CurrentDir().joinPath("exit.ico"), size=(32,32))
      app = App()
      frame = Frame(title="Test Icon-Button", size=(300,200))
      panel = frame.Panel()
      btExit = panel.Button(pos=(20,20), size=(32,32))
    
    btExit.setIcon(icon)
    
    btExit.wEvent_Button do (): frame.delete()
    
    frame.wIdExit do (): frame.delete()
    
    frame.center()
    frame.show()
    app.mainLoop()
    Alles anzeigen

    Dateien

    exit.ico.txt 4,29 kB – 595 Downloads
  • Diskussionen etc. zu Snippets

    • BugFix
    • 6. Juli 2020 um 10:22
    Zitat von Oscar

    Um die serielle Schnittstelle mit Nim ansprechen zu können, habe ich ein Objekt erstellt, das die entsprechenden Methoden bereitstellt.

    :klatschen: Sehr gut gelungen.

  • ​Sammlung: Nim Snippets / Procedures

    • BugFix
    • 5. Juli 2020 um 15:20

    Immer wieder im Einsatz: INI-Dateien. Nim stellt dazu das Modul parsecfg bereit. Eine Ini (Config) - Datei wird nach dem Laden temporär in einer Art Dictionary gehalten (ein OrderedTable of OrderedTables). Werden Änderungen vorgenommen, ist also am Programmende ein Schreiben in die Datei zwingend erforderlich (ini.writeConfig(ini_file)).

    Hier mal ein kleines Bsp.:

    EDIT

    Ich habe mal noch ergänzt um den Default-Wert beim Lesen eines Key.

    Für Delete- und Schreiboperationen gibt es Prozeduren im Modul.

    Code
    import os, parsecfg, tables
    
    let ini_file = "ini_test.ini" # Test ini
    var ini: Config               # type "Config": table of tables (OrderedTable)
    
    if not ini_file.fileExists():
      echo "INI file will created."
      ini = newConfig()  # leere ini erstellen
      # Daten eintragen
      ini.setSectionKey("Sektion A", "key1", "val1")
      ini.setSectionKey("Sektion A", "key2", "val2")
      ini.setSectionKey("Sektion A", "key3", "val3")
      ini.setSectionKey("Sektion B", "key4", "val4")
      ini.setSectionKey("Sektion B", "key5", "val5")
      # ini schreiben
      ini.writeConfig(ini_file)
    
    # ini Datei laden
    ini = loadConfig(ini_file)
    
    # Lesen im direkten Zugriff auf Config-Typ
    echo ini["Sektion B"]["key4"]
    
    # Änderung im direkten Zugriff 
    # zum Speichern: "ini.writeConfig(ini_file)" erforderlich !!!
    ini["Sektion B"]["key4"] = "new value4"
    echo ini["Sektion B"]["key4"]
    
    # Funktionen zum Zugriff
    
    # alle Sektionsnamen als String-Sequenz
    proc SectionNames(ini: Config): seq[string] =
      var sec_names = newSeq[string]()
      for section, _ in ini.pairs(): sec_names.add(section)
      result = sec_names
    
    # gibt eine Sektion als Table zurück
    proc Section(ini: Config, sec: string): OrderedTableRef[string,string] =
      var res = newOrderedTable[string, string]()
      if ini.hasKey(sec): result = ini[sec]
      else: result = res
    
    # gibt den Wert für den Schlüssel einer Sektion zurück
    # wenn Schlüssel nicht vorhanden: return Leerstring
    # Default - Value: wenn Schlüssel nicht vorhanden - return def_val
    proc Key(sec: OrderedTableRef[string,string], key: string, def_val: string = ""): string =
      if sec.hasKey(key): result = sec[key]
      else: result = def_val 
    
    # alle Sektionen:
    echo ini.SectionNames
    
    # einzelner Key:
    echo ini.Section("Sektion B").Key("key4")
    echo ini.Section("Sektion B").Key("key_gibt_es_nicht", "Default_value")
    Alles anzeigen
  • Zwei Webcam-Anwendungen

    • BugFix
    • 3. Juli 2020 um 16:54

    Lies mal ab Post #8, das Problem gibt es leider mehrfach - ohne echte Lösung.

  • MsgBox mit Zeitbegrenzung

    • BugFix
    • 30. Juni 2020 um 07:21

    Für deine Zwecke ist eine GUI dann aber weniger geeignet. Sowohl bewusst als auch unterbewusst wird in dieser kurzen Zeitspanne nur das Bild der aufpoppenden GUI wahrgenommen.

    Um gezielt Text erfassen zu können, solltest du diesen direkt auf den Desktop schreiben, über das jeweils offene Fenster.

  • AutoIt: Bitte um Hilfe

    • BugFix
    • 29. Juni 2020 um 17:33
    Zitat von Wesie

    Das ist doch unrelevant. Helft ihr mir oder nicht?

    Nein, es ist nicht irrelevant.

    Nach deinem Rumgemaule bin ich mir ziemlich sicher, dass der Hinweis auf deinen Blog wohl eher eine Alibiaussage ist, da dir klar ist, dass für das tatsächliche Ziel hier keine Hilfe zu erwarten ist.

    Ich kann mich irren, aber ich irre selten.

  • GUI am Bildschirm Rand immer sichtbar

    • BugFix
    • 29. Juni 2020 um 13:43

    Dann probier dich doch mal daran. Hol dir die Handle und docke.

  • AutoIt: Bitte um Hilfe

    • BugFix
    • 29. Juni 2020 um 10:48
    Zitat von Wesie

    Es geht darum, dass automatisch auf eine bestimmte Stelle des Screens geklickt werden soll, sobald sich dort die Farbe ändert.

    Zitat von Wesie

    Es geht um meine eigene Seite

    Wenn es deine eigene Seite ist, gestaltest doch DU SELBST die Inhalte. Wieso willst du dann mit einem Skript überwachen, welche Änderungen DU vornimmst?! :Face:

  • GUI am Bildschirm Rand immer sichtbar

    • BugFix
    • 29. Juni 2020 um 10:39
    Zitat von mcbaldrian

    Hat jemand sowar schon mal gebaut

    Etwas Ähnliches, vielleicht hilft es dir: DockIt

  • Eine mit Autoit erstellte, laufende .exe finden und beenden mit einer zweiten Autoit-EXE

    • BugFix
    • 27. Juni 2020 um 09:53

    Evtl. XY Problem?

    Kann es sein, dass du verhindern möchtest, dass deine exe ein zweites mal gestartet wird? Schau mal nach: _Singleton

  • Wie kann man etwas in der MainLoop ausführen?

    • BugFix
    • 26. Juni 2020 um 11:07

    So, nach ewigem Probieren und Suchen habe ich es (hoffentlich) hinbekommen. Teste mal, ob das wie von dir gewünscht funktioniert.

    Code
    import wNim/[wApp,wFrame,wPanel,wStaticText,wButton]
    import asyncdispatch, asyncfutures
    
    var
      bStart: bool = false
      iCount: int = 0
    
    let app = App()
    let frame = Frame(title="Test", size=(400, 300))
    let panel = Panel(frame)
    let idLabel = StaticText(panel, label= $iCount, pos=(10, 10), size=(380, 20))
    let idButton = Button(panel, label="Start/Stop", pos=(10, 50), size=(100, 25))
    
    # click wird mit Zielwert aufgerufen, bei dem die Asyn-Proc aktiv werden soll
    proc click(b: bool): Future[bool]   # generiert das Future-Objekt
    
    proc is_click(b: bool) {.async.} =  # Aufruf mit Zielwert
      let clicked = await click(b)      # wartet bis Wert von click == b ist
      # echo "do smth."
      iCount += 1
      idLabel.label = $iCount  
    
    proc click(b: bool): Future[bool] {.async.} =
      # echo "proc_click"
      return b
    
    
    idButton.wEvent_Button do (): 
      discard is_click(true)      # ruft die Async-Proc auf
      bStart = not bStart
    
    
    frame.center()
    frame.show()
    app.mainLoop()
    Alles anzeigen

    EDIT:

    Hmm, das scheint so auch nicht zu gehen, wenn ich in die Async-Proc eine Schleife hänge, wartet Button_event bis die Schleife beendet ist - also nicht async.

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™