![]() |
|
Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply |
![]()
|
|
| saneea |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 205 Регистрация: 13.7.2005 Репутация: нет Всего: 0 |
Пишу программу для переброса фоток с фотоаппарата. Значит должна она быть невидимой, а когда появляется фотик "появиться" и предложить скопировать или переместить фотки. Испытания проводились на обычной флешке Generic (если это кончно важно).
Для обнаруюения нового USB в системе я использовал компонент ComponentUSB (в этой теме нашёл:http://forum.vingrad.ru/forum/s/e26ce45164342b9f683a6b3dfa843a2e/topic-88326.html). Алгоритм следующий: 0. Делаем форму невидимой. 1. Каждую секунду происходит "тик" таймера, в котором он пытается обнаруюжить новое устройство и вывести его содержимое в ЛистБокс. Всё это ему не даёт сделать переменная EV, которая будет равна FALSE, пока не подключиться новое устройство. 2. При "вставке" USB устройства включается событие "ComponentUSB1USBArrival": обнуляется множественная переменная MN и заполняется известными системе на данный момент времени съёмными дисками. И главное делает переменную EV=true! 3.1 Когда переменная EV стала равна TRUE, то мы её сбрасываем в FALSE и выполняем следюущие действия: 3.2 Обнаружение нового съёмного диска 3.3 Если новый диск обнаружен, то делаем форму видимой и заполняем ЛистБокс содержанием интересующей нас папки (в нашем случае это <буква_диска>+':\fotki\1': проверяем есть ли такая папка, и если есть делаем устанавливаем нужный нам путь (Form1.ShellListView1.Root:=dr+':\'+put) и выводим содержимое ShellListView1 в ЛистБокс. Если же диск новый не обнаружили, то возвращаемся к пункту 3.2 Проблема в том, что на моём компьютере это всё сначала (в процессе отладки) работало нормльно, а потом программа стала выводить ошибку: "Error setting path: 'I:\fotki\1'", и вылетает эта ошибка в строке "Form1.ShellListView1.Root:=dr+':\'+put". Самое интересное, на другом компьютере всё работает на этой же флешке! Прицепляю файлик с проектом Почему так? Может быть стоит использовать другой компонент (не ShellListView)? Может быть система запомнила мою флешку? В реестре я нашёл в истории инфу про свою флешку, но удалить эту инфу винда не дала, что делать? Заранее спасибо! Присоединённый файл ( Кол-во скачиваний: 12 )
prog.rar 2,26 Kb |
|||
|
||||
| Alix |
|
|||
|
L45 ![]() ![]() Профиль Группа: Участник Сообщений: 581 Регистрация: 4.5.2005 Где: Pskov/Spb Репутация: 3 Всего: 23 |
Замечания
1. ShellListView для получения содержимого папки - это кошмар! Используйте FindFirst, FindNext, FindClose 2. Называйте переменные понятными именами 3. Зачем использовать таймер для проверки наличия дисков, если этот код можно выполнить сразу из TForm1.ComponentUSB1USBArrival ? Ведь суть - вставили флеху, проверяем ее. Логика Вашего кода, если я понял такова: -- что-то вставили в usb, быстренько запоминаем какие съемные диски есть сейчас -- в течении 20 сек ждем, пока появится новый диск Минус в том, что он может появиться сразу и этап "быстренько запоминаем..." может произойти когда новый диск уже добавился. Насколько мне известно об этом компоненте (хотя по правде почти ничего не известно), это событие происходит уже при добавлении диска, а не просто устройства в порт усб. [тут уже была похожая тема] Тебе бы надо запомнить все диски при старте программы, а потом уже только реагировать на вставку/удаление флешек, тогда ты сможешь точно определять какие добавились, а какие были удалены. -------------------- Знание только тогда знание, когда оно приобретено усилиями своей мысли, а не памятью (с) Л. Толстой High tech. Low live. (с) Gardner Dozois |
|||
|
||||
| saneea |
|
||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 205 Регистрация: 13.7.2005 Репутация: нет Всего: 0 |
Спасибо за замечания!
помогло
дык это... вроде понятные имена... ну или мне так кажется
ComponentUSB1USBArrival как я понял проверяет наличие нового USB устройства, а не появление в системе нового диска. Если делать проверку непосредсвтенно в ComponentUSB1USBArrival, то появление диска происходит секунд аж через 20, а если через таймер, то 1-2 секунды (это результаты экспериментов). Изначально вместо таймера был поток, а вместо булевской переменной EV была переменая-событие EV, алгоритм работы был тем же. Спасибо, за совет теперь всё работает отлично! |
||||||
|
|||||||
![]()
|
| Правила форума "Delphi: WinAPI и системное программирование" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |