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

Beiträge von Moombas

  • Datei-Anzeige

    • Moombas
    • 1. September 2023 um 14:19

    Ich hab ja nur gesagt es gibt beide Möglichkeiten....

    Und ich habe irgendwas im Hiunterkopf, das der ternäre unter bestimmten Bedingungen nicht funktioniert aber ggf. habe ch das aber noch falsch im Gedächtnis (oder bereits behoben).

  • Datei-Anzeige

    • Moombas
    • 1. September 2023 um 13:59
    Zitat von mumpel

    Das Ergebnis ist aber das selbe.

    Dann würde ich aber keine Codezeilen sparen. ;)

    Das Ergebnis muss doch das Selbe sein, ich denke du suchst den Ersatz von IIf in Autoit?

    Natürlich sparst du Codezeilen, allerdings nur bei mehrerer Verwendung von _Iif() bzw. Verschachtelung.

    If...then...else = 5 Zeilen

    _Iif = 1 Zeile + Einmalig 7 Zeilen

    Bedeutet: Schon ab der 2. Verwendung sparst du Zeilen, bei nur einmaliger Verwendung brauchst du jedoch mehr.

    Wobei ich die Funktion sogar noch so wegkürzen würde und die Gleiche Funktionalität hätte:

    AutoIt
    Func _Iif($fTest, $vTrueVal, $vFalseVal)
        If $fTest Then Return $vTrueVal
        Return $vFalseVal
    EndFunc   ;==>_Iif

    Dann wäre es:

    If...then...else = 5 Zeilen

    _Iif = 1 Zeile + Einmalig 4 Zeilen

    Bedeutet: Schon ab der 1. Verwendung nutzt du die Gleiche Anzahl an Zeilen und jede weitere spart dir Zeilen.

    Du kannst diese Funktion auch in eine au3 Auslagern, die du am Anfang einbindest, dann brauchst du nur 1 Zeile zum Einbinden + max. 1 Zeile je Nutzung (egal welche Variante du wählst).

  • Datei-Anzeige

    • Moombas
    • 1. September 2023 um 13:47

    Ah ok, dann habe ich es falsch verstanden ;)

    Dann ließe sich das doch (abgesehen von den ternären operatoren) mit einer eigenen Funktion basteln.

    Fertige gefunden (https://www.autoitscript.com/forum/topic/15…changes-_iif/):

    AutoIt
    Consolewrite(_Iif('200 = 200', 99, 2) & @CRLF) ; > 99
    
    ; #FUNCTION# ====================================================================================================================
    ; Name...........: _Iif
    ; Description ...: Perform a boolean test within an expression.
    ; Syntax.........: _Iif($fTest, $vTrueVal, $vFalseVal)
    ; Parameters ....: $fTest     - Boolean test.
    ;                  $vTrueVal  - Value to return if $fTest is true.
    ;                  $vFalseVal - Value to return if $fTest is false.
    ; Return values .: True         - $vTrueVal
    ;                  False        - $vFalseVal
    ; Author ........: Dale (Klaatu) Thompson
    ; Modified.......:
    ; Remarks .......:
    ; Related .......:
    ; Link ..........:
    ; Example .......: Yes
    ; ===============================================================================================================================
    Func _Iif($fTest, $vTrueVal, $vFalseVal)
        If $fTest Then
            Return $vTrueVal
        Else
            Return $vFalseVal
        EndIf
    EndFunc   ;==>_Iif
    Alles anzeigen
  • Datei-Anzeige

    • Moombas
    • 1. September 2023 um 13:14

    Wie meinst du das mit "mehr als 2"?

  • Datei-Anzeige

    • Moombas
    • 1. September 2023 um 12:58

    Du meinst sowas?

    AutoIt
    Opt('MustDeclareVars', 1)
    #include <Array.au3>
    Global Enum $IllegalerEintrag1 = -1, $SicherheitsLevel1_1, $SicherheitsLevel1_2
    Global Const $IllegalerEintrag2 = 2, $SicherheitsLevel2_1 = 9, $SicherheitsLevel2_2 = 3 ; hier macht Enum keinen Sinn, da keine Logik vorhanden
    Global Const $SicherheitsLevel_1[3] = [$IllegalerEintrag1, $SicherheitsLevel1_1, $SicherheitsLevel1_2]
    Global Const $SicherheitsLevel_2[3] = [$IllegalerEintrag2, $SicherheitsLevel2_1, $SicherheitsLevel2_2]
    
    _Arraydisplay($SicherheitsLevel_1) ; -> -1, 0, 1
    _Arraydisplay($SicherheitsLevel_2) ; ->  2, 9, 3
  • Datei-Anzeige

    • Moombas
    • 1. September 2023 um 12:13

    Ist das Gegenstück für IIf nicht einfach eine logische Verknüpfung?

    Code
    ;Some VBA from internet: IIf([MEPNumber]>200,[BasicSalary],[BasicSalary]/30*21)
    ;Autoit (kept naming just for clarification
    If ([MEPNumber] > 200) and ([BasicSalary] or [BasicSalary]/30*21) then
  • Toolbar - Icon-Namen

    • Moombas
    • 31. August 2023 um 10:30

    zip sollte gehen ;)

  • Datei-Anzeige

    • Moombas
    • 28. August 2023 um 14:26

    Naja hier wäre etwas das funktionieren würde (incl. Ausblenden der Dateiendung!):

    AutoIt
    Opt('MustDeclareVars', 1)
    #include <WinAPIShPath.au3>
    #include <GuiTreeView.au3>
    #include <GUIConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <TreeViewConstants.au3>
    #include <StaticConstants.au3>
    #include <Array.au3>
    #AutoIt3Wrapper_Au3Check_Parameters=-q -d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 -w 7
    
    Global $bgcolor = 0x404040, $txtcolor = 0xff8800, $extcolor = 0xffcc00, $items[4000], $names[4000], $TreevieItemNow, $wParam, $hItemSelected
    Global $aTreeViewItems[1][2] = [[0],[]]
    Global Const $aExt[4] = [3, 'pdf', 'doc', 'xls']
    ;~Global Const  $StartDir = "D:\Test"
    Global Const $StartDir = @ScriptDir
    
    Global Const $hGui = GUICreate("Treeview_Test", 800, 600, -1, -1)
    Global Const $hTreeView = _GUICtrlTreeView_Create($hGui, 2, 2, 180, 600)
    Global Const $hTreeView_First = _GUICtrlTreeView_AddChild($hTreeView,"","Projekte")
    
    _GUICtrlTreeView_BeginUpdate($hTreeView)
    One($StartDir, $aExt, $hTreeView_First)
    _GUICtrlTreeView_EndUpdate($hTreeView)
    _GUICtrlTreeView_Expand($hTreeView)
    GUISetState(@SW_SHOW)
    
    GUIRegisterMsg($WM_NOTIFY, "_WM_NOTIFY")
    
     While 1
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE
                 ExitLoop
        EndSwitch
    
        If _GUICtrlTreeView_GetSelected($hTreeView, $hItemSelected) Then
            $TreevieItemNow = $aTreeViewItems[_ArraySearch($aTreeViewItems, $hItemSelected)][1]
            _GUICtrlTreeView_SetSelected($hTreeView, $hItemSelected, False)
    
            ;Code to work on file here!
            ConsoleWrite($TreevieItemNow & @CRLF) ; just for testing
        EndIf
    WEnd
    
    
    Func One($Path, $ext, $hItem, $strict = False)
        $Path = _WinAPI_PathAddBackslash($Path)
    Local $sFileName, $Split, $newHandle
    Local Const $hSearch = FileFindFirstFile($Path & '*.*')
    
        While 1
            $sFileName = FileFindNextFile($hSearch)
            If @error Then ExitLoop
    
            If @extended = 1 then ;Ordner gefunden
                $newHandle = _GUICtrlTreeView_AddChild($hTreeView, $hItem, $sFileName)
                _ArrayAdd($aTreeViewItems, $newHandle & '|' & $Path & $sFileName)
                One($Path & $sFileName, $ext, $newHandle, $strict)
            EndIf
    
            For $i = 1 to $ext[0]
                $Split = StringSplit($sFileName, '.')
                If not $strict and _
                   ($Split[0] > 1)   then
                    if StringInStr($Split[$Split[0]], $ext[$i]) then ;auch xlsx, docx etc.
                        $newHandle = _GUICtrlTreeView_AddChild($hTreeView, $hItem, StringSplit($sFileName, '.')[1])
                        _ArrayAdd($aTreeViewItems, $newHandle & '|' & $Path & $sFileName)
                    EndIf
                ElseIf $Split[0] > 1 then
                    If $Split[$Split[0]] = $ext[$i] then ; nur explizit
                        $newHandle = _GUICtrlTreeView_AddChild($hTreeView, $hItem, $sFileName)
                        _GUICtrlTreeView_AddChild($hTreeView, $hItem, $sFileName)
                    EndIf
                EndIf
            Next
        WEnd
    EndFunc
    
    Func _WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
        #forceref $hWnd, $iMsg, $wParam
        ; Create NMTREEVIEW structure
        Local $tStruct = DllStructCreate("struct;hwnd hWndFrom;uint_ptr IDFrom;INT Code;endstruct;" & _
                "uint Action;struct;uint OldMask;handle OldhItem;uint OldState;uint OldStateMask;" & _
                "ptr OldText;int OldTextMax;int OldImage;int OldSelectedImage;int OldChildren;lparam OldParam;endstruct;" & _
                "struct;uint NewMask;handle NewhItem;uint NewState;uint NewStateMask;" & _
                "ptr NewText;int NewTextMax;int NewImage;int NewSelectedImage;int NewChildren;lparam NewParam;endstruct;" & _
                "struct;long PointX;long PointY;endstruct", $lParam)
        If DllStructGetData($tStruct, "hWndFrom") = $hTreeView Then
            Switch DllStructGetData($tStruct, "Code")
                ; If item selection changed
                Case $TVN_SELCHANGEDA, $TVN_SELCHANGEDW
                    Local $hItem = DllStructGetData($tStruct, "NewhItem")
                    ; Set flag to selected item handle
                    If $hItem Then $hItemSelected = $hItem
            EndSwitch
        EndIf
    EndFunc
    Alles anzeigen
  • Datei-Anzeige

    • Moombas
    • 28. August 2023 um 08:51

    Zur Prüfung kannst du ja auch mal im Consolewrite immer die ganzen Pfade ausgeben lassen. Also z.B.: Consolewrite($sSourceFolder & "*.pdf" & @CRLF)

    Edit: Was natürlich sein kann (da habe ich aktuell nicht drüber nachgedacht), das er bei Nutzung von z.B. *.pdf keine Ordner findet und du somit auch keine Dateien in Unterverzeichnissen.

    Du müsstest das also in der While-Schleife abfragen, dann kannst du es aber direkt für alle Erweiterungen machen.

    Hier mal ein Beispiel dazu:

    AutoIt
    Opt('MustDeclareVars', 1)
    #include <WinAPIShPath.au3>
    
    Global Const $aExt[4] = [3, 'pdf', 'doc', 'xls']
    One(@ScriptDir, $aExt)
    
    Func One($Path, $ext, $strict = False)
        $Path = _WinAPI_PathAddBackslash($Path)
    Local $sFileName, $Split
    Local Const $hSearch = FileFindFirstFile($Path & '*.*')
    
        While 1
            $sFileName = FileFindNextFile($hSearch)
            If @error Then ExitLoop
    
            If @extended = 1 then ;Ordner gefunden
                One($Path & $sFileName, $ext, $strict)
            EndIf
    
            For $i = 1 to $ext[0]
                $Split = StringSplit($sFileName, '.')
                If not $strict and _
                   ($Split[0] > 1)   then
                    if StringInStr($Split[$Split[0]], $ext[$i]) then ;auch xlsx, docx etc.
                        _AddItemToListview($Path & $sFileName)
                    EndIf
                ElseIf $Split[0] > 1 then
                    If $Split[$Split[0]] = $ext[$i] then ; nur explizit
                        _AddItemToListview($Path & $sFileName)
                    EndIf
                EndIf
            Next
        WEnd
    EndFunc
    
    Func _AddItemToListview($sFile)
        ;Here comes your code to add the items to the listview
        ConsoleWrite($sFile & @CRLF) ;for testing only
    EndFunc
    Alles anzeigen
  • Datei-Anzeige

    • Moombas
    • 25. August 2023 um 15:30

    Wieso?

    AutoIt
    Local $hSearch = FileFindFirstFile($sSourceFolder & "*.*") -> Local $hSearch = FileFindFirstFile($sSourceFolder & "*.pdf")

    Edit:

    Ich würde, da du 3 Dateierweiterungen brauchst, über 3 FileFindFirstFile ein Array mit den Dateinamen+komplettenPfad füllen, sortieren und daraus dann das Treeview erstellen.

    Dann hättest du das entsprechend abgedeckelt auch für .doc (das schließt auch docx etc. ein!) und für .xls (das schleißt auch xlsx und xlsm etc. ein).

    Wenn du die Dateiendung nicht mit im Treeview hinterlegst, der Dateiname im jeweiligen Ordner aber unique ist, kannst du diese mit FileFindFirstFile ($path & "DATEINAME.*") suchen und öffnen.

  • Datei-Anzeige

    • Moombas
    • 24. August 2023 um 12:50

    Ich kenne mich leider mit der Strucktur der Dateien nicht aus, um dort direkt die Infos raus zu holen und dann in autoit entsprechend darzustellen.

  • Datei-Anzeige

    • Moombas
    • 24. August 2023 um 08:45

    mumpel: Solltest du mit dem von mumpel vorgeschlagenen nicht zufrieden sein und doch was eigenes brauchen, stellen sich bei mir div. Fragen:

    - Warum der Mix aus PDF/WORD/EXCEL?

    ----Kannst du das nicht vereinheitlichen (auf z.B. nur PDF)?

    --------Wenn nicht, sind die Dateinamen dann wenigstens einzigartig (es gibt kein PDF das so heißt wie ein anderes word oder excel Dokument)?

    ------------Wenn doch, wird das mit dem ausblenden der Dateiendung schonmal schwierig, wenn die Dateien dann noch im gleichen Ordner liegen auch nahezu unmöglich denn irgendwo braucht man einen Bezug zur exakt-richtigen Datei (wie man also vom Treeview-Eintrag wieder zurück zur entsprechenden Datei + Endung + Pfad kommt um sie anzeigen zu können).

    Mir persönlich ist kein autoit interner "viewer" für doc, pdf oder excel bekannt. Ich kenne nur Umwege über einen eingebetteten IE:

    Word (und müsste dann auch mit PDF und ggf. Excel funktionieren): https://www.autoitscript.com/forum/topic/28…&comment=203774

    Und das ist der Grund warum du wohl auch immer nur diese Ergebnisse zum IE findest.

  • Outlook

    • Moombas
    • 22. August 2023 um 12:02

    Bevor man sich noch weiter über mögliche Lösungsanstze den Kopf zerbricht: water : weißt du ob das Überschreiben des Obektes der Outlookverbindung negative folgen haben kann?

    Die Verbindung würde ja in der Theorie nie abgebaut werden und im worst case immer neue Verbindungen hinzukommen (deshalb hatte ich das _OL_Close() mit drinne um das zu verhindern).

    Wenn ja, müsste man vor dem _OL_Open immer sicherstellen, das Outlook bereits läuft um die Verbindung via _OL_Close schließen zu können ohne das Outlook beendet wird.
    Oder man immitiert dieses durch neusetzen der entscheidenden Variable aus der au3:

    AutoIt
    func start_objekt()
        $__bOL_AlreadyRunning = True ; <-
        _OL_Close($oOutlook)
    
        $oOutlook = _OL_Open()
        If @error <> 0 Then
          error_speichern($soerror,  "Outlook Error -> creating a connection to Outlook. @error = " & @error & ", @extended = " & @extended)
          infotexte()
          error_speichern($soerror,  "")
          _OL_ErrorNotify(3, @ScriptDir& '\neuerr.txt')
        EndIf
    EndFunc   ;==>start_objekt
    Alles anzeigen
  • Outlook

    • Moombas
    • 22. August 2023 um 08:16

    Hmm, evtl war meine Annahme falsch.

    Ich ging davon aus, das _OL_Close nur die Verbindung zu Outlook schließt aber nicht Outlook selber.

    Dann müsstest du diese Zeile auskommentieren.

    Wobei in der au3 es eben so steht "Closes the connection to Microsoft Outlook." andererseits sich aber bei den Parametern widerspricht "... $bForceClose - [optional] If True Outlook is closed ...".

    Daher denke ich du kannst Zeile 2 von meinem obigen Code einfach weglassen und sollte dann funktionieren wie du es wolltest.

  • Outlook

    • Moombas
    • 21. August 2023 um 15:18

    Du baust halt jedesmal eine neue Verbindung auf, wenn du start_objekt aufrufst, dann kannst du es auch gleich richtig machen (auch die alte verbindung wieder trennen) und die if-prüfung weglassen.

    Sprich:

    AutoIt
    func start_objekt()
        _OL_Close($oOutlook)
        $oOutlook = _OL_Open()
        If @error <> 0 Then
          error_speichern($soerror,  "Outlook Error -> creating a connection to Outlook. @error = " & @error & ", @extended = " & @extended)
          infotexte()
          error_speichern($soerror,  "")
          _OL_ErrorNotify(3, @ScriptDir& '\neuerr.txt')
        EndIf
    EndFunc   ;==>start_objekt
  • Outlook

    • Moombas
    • 21. August 2023 um 12:37

    Irgendwie macht für mich dein code kein Sinn:

    AutoIt
    func start_objekt()
      IF IsObj($oOutlook) Then ;wenn es ein Objekt ist, mache es IMMER leer (warum?)
        $oOutlook = ''
      EndIf
    
      If Not IsObj($oOutlook) Then ;wird IMMER der Fall sein wegen vorheriger Abfrage!
        $oOutlook = _OL_Open()
        If @error <> 0 Then
          error_speichern($soerror,  "Outlook Error -> creating a connection to Outlook. @error = " & @error & ", @extended = " & @extended)
          infotexte()
        EndIf
        error_speichern($soerror,  "") ;Fehler speichern, auch wenn keiner vorhanden?
        _OL_ErrorNotify(3, @ScriptDir& '\neuerr.txt') ;Fehler anzeigen, auch wenn keiner vorhanden?
      EndIf
    EndFunc   ;==>start_objekt
    Alles anzeigen

    Meinem Beispiel folgend und deinen Code hier als Grundlage nehmend, wäre ich eher bei:

    AutoIt
    Global $pidOutlook
    ;...
    
    func start_objekt()
    Local Const $pid = WinGetProcess('Outlook')
        If not ($pid = $pidOutlook) then
            _OL_Close($oOutlook)
            $pidOutlook = $pid
            $oOutlook = _OL_Open()
            If @error <> 0 Then
              error_speichern($soerror,  "Outlook Error -> creating a connection to Outlook. @error = " & @error & ", @extended = " & @extended)
              infotexte()
              error_speichern($soerror,  "")
              _OL_ErrorNotify(3, @ScriptDir& '\neuerr.txt')
            EndIf
        EndIf
    EndFunc   ;==>start_objekt
    Alles anzeigen
  • Outlook

    • Moombas
    • 21. August 2023 um 09:27

    Noch eine option wäre, das man den outlook link ersetzt und dieser dein skript startet und dein skript dann outlook und somit sofort die pid kennt bzw sich auch beendet wenn outlook geschlossen wird.

    Startet der Nutzer dann wieder über den Link Outlook neu, startet auch dein skript neu und kennt die pid und kann wie vorher die verbindung direkt wieder aufbauen.

  • kompilierte Datei unterschiedlich groß

    • Moombas
    • 18. August 2023 um 12:53

    @Musashi : Nice, wieder was dazu gelernt. Das wusste ich auch noch nicht XD

  • Outlook

    • Moombas
    • 18. August 2023 um 11:48

    Du kannst eine Funktion bauen, die prüft ob das Objekt noch aktuell ist und for jedem Aufruf entsprechend prüfen.

    (folgendes sind nur Annahmen):

    1. Beim start die pid von outlook auslesen und speichern

    2. in der oben angesprochenen funktion prüfen ob pid noch existiert

    2.a. wenn ja, wieder zurück

    2.b wenn nein: objekt schließen, pid neu suchen und speichern

    3. objekt (verbindung) neu aufbauen

    Edit: Ich habe leider nichts gefunden um das Objekt direkt zu prüfen aber evtl. weiß hier jemand mehr dazu.

    Edit2: Es gibt aber wohl ein Event das auftritt, wenn Outlook zu schließen beginnt, jedoch bin ich überfragt, wie man das abfangen/darauf reagiren kann: https://learn.microsoft.com/de-de/dotnet/a…iew=outlook-pia

  • Control sicher identifizieren

    • Moombas
    • 17. August 2023 um 11:09

    Eventuell sowas hier zur Prüfung:

    AutoIt
    If ControlGetHandle('Window', 'Window Text', 'Control ID') Then 
        MsgBox(64, 'Info', 'Control Exists')
    Else
        MsgBox(16, 'Error', 'Control Does Not Exists')
    EndIf

    Quelle: https://www.autoitscript.com/forum/topic/42…of-a-control-id

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™