Na dann: Herzlich willkommen!
Und keine scheu zu fragen, wir helfen gerne
Na dann: Herzlich willkommen!
Und keine scheu zu fragen, wir helfen gerne
Ich meine es ging darum, das man manchmal den ternären Operator in () setzen muss aber wann/warum und ob das mittlerweile gefixt ist, weiß ich nicht mehr.
Ein Beispiel was ich auf die schnele gefunden habe aber schon sehr alt ist: https://www.autoitscript.com/forum/topic/16…g-in-some-ways/
War einer der Gründe warum ich bei If..Then..else geblieben bin (wobei bei mir oft auch mehr als die pure Rückgabe eines Wertes gemacht werden muss).
Wie gesagt, kann mich auch falsch erinnern und so lange es bei dir klappt ist doch super.
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).
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:
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).
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/):
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
Wie meinst du das mit "mehr als 2"?
Du meinst sowas?
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
zip sollte gehen
Naja hier wäre etwas das funktionieren würde (incl. Ausblenden der Dateiendung!):
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
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:
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
Wieso?
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.
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.
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.
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:
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
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.
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:
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
Irgendwie macht für mich dein code kein Sinn:
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:
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
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.
Musashi : Nice, wieder was dazu gelernt. Das wusste ich auch noch nicht XD