Что нового

[Элементы GUI] Элемент поля ввода и возможность перетаскивать в него файлы

MnM

Post-Hardcore
Сообщения
679
Репутация
90
Здравствуйте, помогите с проблемным кодом:
Код:
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
$Form1 = GUICreate("", 396, 443, 307, 132,-1,$WS_EX_ACCEPTFILES)
$Edit1 = GUICtrlCreateEdit("", 0, 0, 393, 440)
GUICtrlSetState(-1,$GUI_DROPACCEPTED)
GUISetState(@SW_SHOW)
While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $GUI_EVENT_DROPPED
			If @GUI_DropId = $Edit1 Then
				GUICtrlSetData($Edit1, FileRead(@GUI_DragFile))
			EndIf
	EndSwitch
WEnd

По задумке при перетаскивании файла, должно происходить получение пути к файлу, чтение его самого и передача его данных в текстовое поле Edit.
Проблема в том что действие скрипта доходит до чтения файла, но FileRead() возвращает пустую строку.(Отловил это через MsgBox())
Код:
If @GUI_DropId = $Edit1 Then
				$file = FileRead(@GUI_DragFile)
				GUICtrlSetData($Edit1, $file)
			EndIf

При таком же раскладе, но используя вместо поля Edit, Input то все исполняется корректно. Почему с GUICtrlCreateEdit() данное не получается?
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
MnM
@GUI_DragFile у тебя содержит в конце перенос строки, естественно FileRead такого не видит. Что качается Input то там при перекидывании нескольких файлов перечисление идет через |, поэтому FileRead тоже будет спотыкатся.
 
Автор
MnM

MnM

Post-Hardcore
Сообщения
679
Репутация
90
Тогда посоветуйте правильный путь :smile:
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
MnM
Смотри WM_DROPFILES в справке, универсальное средство.
 

ildar

Осваивающий
Сообщения
252
Репутация
29
И все таки как решилась проблема? Изменил как сказал InnI не катит.
Код:
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
$Form1 = GUICreate("", 396, 443, 307, 132,-1,$WS_EX_ACCEPTFILES)
$Edit1 = GUICtrlCreateEdit("", 0, 0, 393, 440)
GUICtrlSetState(-1,$GUI_DROPACCEPTED)
GUISetState(@SW_SHOW)
While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $GUI_EVENT_DROPPED
            If @GUI_DropId = $Edit1 Then
                GUICtrlSetData($Edit1, FileRead(StringStripWS(@GUI_DragFile, 2)))
            EndIf
    EndSwitch
WEnd
Может я не так понял?
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
В чём выражается "не катит"? У меня открылся файл.
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
У меня тоже нормально открывает и из проводника и из Total Commander.
ildar, если у вас скрипт запускается с правами администратора, то и приложение, из которого перетаскиваете, должно иметь такие же права.
 

ildar

Осваивающий
Сообщения
252
Репутация
29
Извините! Не внимателен. В спешке не дочитал(недоосмыслил) первый вопрос в теме. Мне нужно было только получение пути, без чтения файлов. Сделал так:
Код:
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
$Form1 = GUICreate("", 396, 443, 307, 132,-1,$WS_EX_ACCEPTFILES)
$Edit1 = GUICtrlCreateEdit("", 0, 0, 393, 440)
GUICtrlSetState(-1,$GUI_DROPACCEPTED)
GUISetState(@SW_SHOW)
While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $GUI_EVENT_DROPPED
            If @GUI_DropId = $Edit1 Then
               GUICtrlSetData($Edit1, FileGetLongName(StringStripWS(@GUI_DragFile, 2)))                             ;GUICtrlSetData($Edit1, FileRead(@GUI_DragFile))
            EndIf
    EndSwitch
WEnd
Получаю путь. А как реализовать, чтобы при перетаскивании нескольких файлов, получить массив из нескольких путей?
Это не вопрос, мысли вслух. Я пока не думал над этим вопросом, разгребу дела попробую решить. Спасибо за ответы. Ваши "у меня открылся файл" навели на путь истинный :smile:
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
ildar [?]
при перетаскивании нескольких файлов, получить массив из нескольких путей
Edit это делает по умолчанию. Просто уберите обработку $GUI_EVENT_DROPPED
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
$Form1 = GUICreate("", 396, 443, 307, 132,-1,$WS_EX_ACCEPTFILES)
$Edit1 = GUICtrlCreateEdit("", 0, 0, 393, 440)
GUICtrlSetState(-1,$GUI_DROPACCEPTED)
GUISetState(@SW_SHOW)
While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd
 
Верх