FileOpenDialog zeigt Dateiname nicht vollständig an
-
Tweaky -
22. September 2018 um 23:52 -
Erledigt
-
-
Hallo Tweaky
Wir bei FileOpenDialog ein Dateiname mitgegeben
Wie meinst du das? Wie gibst du der Funktion einen Dateinamen mit?
Prinzipiell konnte ich das Problem bei mir nicht nachvollziehen. Dateinamen werden bei mir normal lesbar (Anfang des Namens ist auch sichtbar) angezeigt.
-
Ist das ein Bug?
Ja, das ist ein Bug. Bei mir (Windows 7/10 Pro) ist es auch nicht anders... ab 15 Zeichen wird vorne eines weggeschnitten... bis "Dateiname 1234" geht also korrekt.
Dateiname 1234567890_WIN_7.png
Wie meinst du das? Wie gibst du der Funktion einen Dateinamen mit?
-
-
Hat aber wohl eher nichts mit Autoit zu tun, da der FileOpenDialog ein Windowsbestandteil ist.
Um die Ursache zu finden sollten diejenigen mit und ohne diesen Fehler mal mehr Details zur genutzten Umgebung posten.
Genaue Windows Version? -> CMD: "winver" (1703 / 1709 / 1803 / 1809 ???)
Standard Theme? (Bitnugger nutzt jedenfalls nicht den Standard)
DPI verändert? (wahrscheinlichste Ursache für Anzeigefehler)
-
- Offizieller Beitrag
-
https://social.msdn.microsoft.com/Forums/en-US/d…forum=vbgeneral
https://social.msdn.microsoft.com/Forums/vstudio…ified?forum=wpf
Anscheinend wirklich ein Windows Bug, der nachwievor nicht behoben wurde. Autoiter hat geschummelt und nicht den vorausgefüllten Dialog geöffnet.
Workaround:
Evtl. kann man mit den input / edit ctrl UDF Funktionen die Anzeige des Inputs manipulieren (zum Textanfang "scrollen" oder den Text neusetzen). Ich erinnere mich noch ganz schwach daran sowas selbst schonmal gehabt und entsprechend behoben zu haben.
-
Autoiter hat geschummelt und nicht den vorausgefüllten Dialog geöffnet.
Also das verbitte ich mir ja!!
Ich hatte echt nicht gepeilt, wie es gemeint war und Bitnugger hat das erst nach meinem Beitrag ergänzt. Nun habe ich es richtig gemacht und kann das Problem auch nachvollziehen.
-
Habe mir da einen kleinen Fix für geschrieben...
AutoIt
Alles anzeigen; Dieses Script kompilieren und als '_FixFileOpenDialog.exe' speichern. If $CMDLINE[0] = 2 Then _FixFileOpenDialog($CMDLINE[1], $CMDLINE[2]) Func _FixFileOpenDialog($sTitle, $sName) Local $hWnd = WinWait($sTitle, '', 3) If IsHWnd($hWnd) Then Local $hCtrl = ControlGetHandle($hWnd, $sName, '') If IsHWnd($hCtrl) Then ControlSetText($hCtrl, '', '', $sName) Send('^a') EndIf EndIf EndFunc
AutoIt
Alles anzeigen; Anstelle von FileOpenDialog nun _FixedFileOpenDialog benutzen Global Const $g_sFixFileOpenDialog = @ScriptDir & '\_FixFileOpenDialog.exe' Local $sFile = _FixedFileOpenDialog('Select File...', 'C:', 'All (*.*)', 0, 'Dateiname 1234567890') MsgBox(64, @ScriptName, '$sFile = ' & $sFile) Func _FixedFileOpenDialog($sTitle, $sInitDir, $sFilter, $iOptions = 0 , $sDefaultName = '', $hWnd = '') If StringLen($sDefaultName) > 14 Then Run(StringFormat('"%s" "%s" "%s"', $g_sFixFileOpenDialog, $sTitle, $sDefaultName)) ; Problem mit der Anzeige fixen, dass ab 15 Zeichen auftritt Local $sFile = FileOpenDialog($sTitle, $sInitDir, $sFilter, $iOptions, $sDefaultName) Return SetError(@error, @extended, $sFile) EndFunc
-
- Offizieller Beitrag
Habe mir da einen kleinen Fix für geschrieben...
Ich hätte da noch eine Variante, bei der man keine zusätzliche Exe-Datei braucht.
Eine globale Variable "$sFileOpenTitle" und zwei kleine Funktionen:
Code
Alles anzeigen#include <Timers.au3> Global $sFileOpenTitle = '' Global $sFile = _FileOpenDialog('Select File...', 'C:', 'All (*.*)', 0, 'Dateiname 1234567890') ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $sFile = ' & $sFile & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console Func _FileOpenDialog($sTitle, $sInitDir, $sFilter, $iOptions = 0, $sDefaultName = '', $hWnd = 0) $sFileOpenTitle = $sTitle Local $hDummyGui = GUICreate('DummyGui') Local $hTimer = _Timer_SetTimer($hDummyGui, 250, '_FileOpenCheck') Local $sFile = FileOpenDialog($sTitle, $sInitDir, $sFilter, $iOptions, $sDefaultName, $hWnd) GUIDelete($hDummyGui) Return $sFile EndFunc Func _FileOpenCheck($hWnd, $iMsg, $iIDTimer, $iTime) If Not WinExists($sFileOpenTitle) Then Return _Timer_KillTimer($hWnd, $iIDTimer) ControlSend($sFileOpenTitle, '', '[CLASS:Edit; INSTANCE:1]', '{HOME}') EndFunc
Das funktioniert, weil die Funktion der Timer-UDF quasi parallel läuft und durch das FileOpenDialog nicht geblockt wird.
Und so nebenbei kann man damit auch noch den FileOpenDialog in der Größe verändern und nach Wunsch auf dem Desktop plazieren:
Code
Alles anzeigen#include <Timers.au3> Global $sFileOpenTitle = '' Global $sFile = _FileOpenDialog('Select File...', 'C:', 'All (*.*)', 0, 'Dateiname 1234567890') ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $sFile = ' & $sFile & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console Func _FileOpenDialog($sTitle, $sInitDir, $sFilter, $iOptions = 0, $sDefaultName = '', $hWnd = 0) $sFileOpenTitle = $sTitle Local $hDummyGui = GUICreate('DummyGui') Local $hTimer = _Timer_SetTimer($hDummyGui, 250, '_FileOpenCheck') Local $sFile = FileOpenDialog($sTitle, $sInitDir, $sFilter, $iOptions, $sDefaultName, $hWnd) GUIDelete($hDummyGui) Return $sFile EndFunc Func _FileOpenCheck($hWnd, $iMsg, $iIDTimer, $iTime) Local $iWidth = 800, $iHeight = 600 If Not WinExists($sFileOpenTitle) Then Return _Timer_KillTimer($hWnd, $iIDTimer) ControlSend($sFileOpenTitle, '', '[CLASS:Edit; INSTANCE:1]', '{HOME}') WinMove($sFileOpenTitle, '', @DesktopWidth / 2 - $iWidth / 2, @DesktopHeight / 2 - $iHeight / 2, $iWidth, $iHeight) EndFunc
-
Ich hätte da noch eine Variante, bei der man keine zusätzliche Exe-Datei braucht.
Sehr schön...
Hier eine daraus abgewandelte Variante, die ich nun benutze:
AutoIt: _FileOpenDialog.au3
Alles anzeigen#include-once #include <Timers.au3> Global $g_sFileOpenDialogTitle Func _FileOpenDialog($sTitle, $sInitDir, $sFilter, $iOptions = 0, $sDefaultName = '', $hWnd = 0) If StringLen($sDefaultName) > 14 Then ; Problem mit der Anzeige des DefaultName im FileOpenDialog fixen, dass ab 15 Zeichen auftritt $g_sFileOpenDialogTitle = $sTitle Local $hDummyGui = GUICreate('DummyGui'), $iIDTimer = _Timer_SetTimer($hDummyGui, 250, '_FileOpenCheck') EndIf Local $sWorkingDir = @WorkingDir, $sFile = FileOpenDialog($sTitle, $sInitDir, $sFilter, $iOptions, $sDefaultName, $hWnd), $iError = @error, $iExtended = @extended FileChangeDir($sWorkingDir) If StringLen($sDefaultName) > 14 Then GUIDelete($hDummyGui) Return SetError($iError, $iExtended, $sFile) EndFunc ;==>_FileOpenDialog Func _FileOpenCheck($hWnd, $iMsg, $iIDTimer, $iTime) _Timer_KillTimer($hWnd, $iIDTimer) If WinWait($g_sFileOpenDialogTitle, '', 3) Then ControlSend($g_sFileOpenDialogTitle, '', '[CLASS:Edit; INSTANCE:1]', '{HOME}^a') EndFunc ;==>_FileOpenCheck
-
- Offizieller Beitrag
Es geht sogar ohne globale Variable, wenn man stattdessen eine statische Variable einsetzt:
AutoIt
Alles anzeigen#include-once #include <Timers.au3> Func _FileOpenDialog($sTitle, $sInitDir, $sFilter, $iOptions = 0, $sDefaultName = '', $hWnd = 0) If StringLen($sDefaultName) > 14 Then ; Problem mit der Anzeige des DefaultName im FileOpenDialog fixen, dass ab 15 Zeichen auftritt Local $hDummyGui = GUICreate('DummyGui'), $iIDTimer = _Timer_SetTimer($hDummyGui, 50, '_FileOpenCheck') _FileOpenCheck(0, $sTitle, 0, 0) EndIf Local $sWorkingDir = @WorkingDir, $sFile = FileOpenDialog($sTitle, $sInitDir, $sFilter, $iOptions, $sDefaultName, $hWnd), $iError = @error, $iExtended = @extended FileChangeDir($sWorkingDir) If StringLen($sDefaultName) > 14 Then GUIDelete($hDummyGui) Return SetError($iError, $iExtended, $sFile) EndFunc Func _FileOpenCheck($hWnd, $iMsg, $iIDTimer, $iTime) Local Static $sFileOpenTitle If $hWnd = 0 Then $sFileOpenTitle = $iMsg ; bei Aufruf mit $hWnd = 0 den Fenstertitel in die statische Variable uebernehmen Return EndIf _Timer_KillTimer($hWnd, $iIDTimer) If WinWait($sFileOpenTitle, '', 3) Then ControlSend($sFileOpenTitle, '', '[CLASS:Edit; INSTANCE:1]', '{HOME}^a') EndFunc