Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Две машины, одна программа, одна флешка... на одном компе работает, на другом нет 
:(
    Опции темы
saneea
Дата 14.12.2007, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 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
PM MAIL   Вверх
Alix
Дата 15.12.2007, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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
PM MAIL ICQ Skype   Вверх
saneea
Дата 15.12.2007, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 205
Регистрация: 13.7.2005

Репутация: нет
Всего: 0



Спасибо за замечания!

Цитата

1. ShellListView для получения содержимого папки - это кошмар! Используйте FindFirst, FindNext, FindClose

помоглоsmile

Цитата

2. Называйте переменные понятными именами

дык это... вроде понятные имена... ну или мне так кажется

Цитата

3. Зачем использовать таймер для проверки наличия дисков, если этот код можно выполнить сразу из  TForm1.ComponentUSB1USBArrival ? Ведь суть - вставили флеху, проверяем ее.

ComponentUSB1USBArrival как я понял проверяет наличие нового USB устройства, а не появление в системе нового диска. Если делать проверку непосредсвтенно в ComponentUSB1USBArrival, то появление диска происходит секунд аж через 20, а если через таймер, то 1-2 секунды (это результаты экспериментов). Изначально вместо таймера был поток, а вместо булевской переменной EV была переменая-событие EV, алгоритм работы был тем же.

Спасибо, за совет теперь всё работает отлично!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0413 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.