| 
| 
 | Вопрос # 2 729/ вопрос открыт / | 
 |  Приветствую, уважаемые эксперты!Есть программа, которая следит за подключением флешек! Я использую для этого события  формы.
 
 procedure TForm1.WMDEVICECHANGE(var msg: TMessage);
 begin
 if (Msg.wParam = DBT_DEVICEARRIVAL) then
 begin
 .............
 ............;
 end;
 if (Msg.wParam = DBT_DEVICEREMOVECOMPLETE) then
 begin
 ............................
 ............................
 end;
 end;
 
 А также программе  используется CoolTrayIcon когда программа сворачивается в трей. Сворачиваю форму в трей! Подключаю флешку и происходит события формы
 
 procedure TForm1.WMDEVICECHANGE(var msg: TMessage);
 
 1. В это время прога должна развернутся и показать сообщение, но вместе этого прога даёт ошибку!
 2. А также после этого события!   Прогу стоящая в трейе невозможно открыть используя Popupmenu трея тоже показывает ошибку!
 Если не происходит это событие формы всё работает с событиями трея!
 Помогите найти проблему!
 Заранее способа!
 
|  |   Вопрос задал: Hideman (статус: Посетитель)Вопрос отправлен: 4 мая 2009, 11:02
 Состояние вопроса: открыт, ответов: 0.
 |  
 Мини-форум вопросаВсего сообщений: 12; последнее сообщение — 4 мая 2009, 19:46; участников в обсуждении: 3. 
|   | min@y™ (статус: Доктор наук), 4 мая 2009, 11:33 [#1]:Когда ж народ научится ПРАВИЛЬНО задавать вопросы? 
 Цитата: В это время прога должна развернутся и показать сообщение, но вместе этого прога даёт ошибку! Самое главное не написал - КАКУЮ ОШИБКУ-ТО? Мы ж не телепаты, чесслово!
 
 З.Ы. Когда ты флешку пихаешь, приходит НЕСКОЛЬКО сообщений WM_DEVICECHANGE. Помни об этом и обрабатывай wParam и lParam.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Hideman (статус: Посетитель), 4 мая 2009, 12:17 [#2]:Вот и ошибка! Project "имя проги".exe raised exception class EExternalException with message 'External exception C0000006' |  
|   | Hideman (статус: Посетитель), 4 мая 2009, 12:22 [#3]:Если не подключить procedure TForm1.WMDEVICECHANGE(var msg: TMessage); работает нормально! |  
|   | Вадим К (статус: Академик), 4 мая 2009, 12:31 [#4]:видимо надо привести полный код этой процедуры, а не сокращенный. Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Вадим К (статус: Академик), 4 мая 2009, 12:43 [#5]:Успел заметить кусок кода. Думаю, что проблема в том, что обновляется DriveBox, когда форма невидимая. На самом деле такое поведение (дать фокус элементу, который невидимый) - плохое.
 Надо начать с коментирования строк в этой процедуре (WMDEVICECHANGE). вначале всё закоментировать и оставить воспроизведение звука, потом обновление боксов и так дальше...
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Hideman (статус: Посетитель), 4 мая 2009, 12:45 [#6]:procedure DiskType; var c:char;
 s:string;
 begin
 for c := 'B' to 'Z' do
 begin
 s:=upcase(c);
 case GetDriveType(pchar(c+':\')) of
 DRIVE_REMOVABLE:
 begin
 form1.drive1.Drive:=c;
 form1.searchfile(s);
 end;
 end;
 end;
 end;
 
 
 procedure TForm1.WMDEVICECHANGE(var msg: TMessage);
 begin
 if (Msg.wParam = DBT_DEVICEARRIVAL) then
 begin
 mplay.FileName:='C:\Program Files\ScannerXP\Media\Windows Vista Hardware Insert.wav';
 mplay.Open;
 mplay.Play;
 drive1.Refresh;
 DiskType;
 end;
 if (Msg.wParam = DBT_DEVICEREMOVECOMPLETE) then
 begin
 mplay.FileName:='C:\Program Files\ScannerXP\Media\Windows Vista Hardware Remove.wav';
 mplay.Open;
 mplay.Play;
 drive1.Refresh;
 end;
 end;
 
 function TForm1.searchfile(var drv: string): boolean;
 var
 s:Tsearchrec;
 f:string;
 i,j:integer;
 sr:boolean;
 drv1:string;
 begin
 sr:=false;
 case GetDriveType(pchar(drv+':\')) of
 DRIVE_REMOVABLE:drv1:='Флеш диск';
 DRIVE_FIXED:drv1:='Жесткый диск';
 end;
 if findfirst(drv+':\*.*',faanyfile,s)=0 then
 repeat
 if  (s.Attr>=32) or (s.Attr<=39)then
 begin
 j:=length(s.Name);
 i:=pos('.',s.Name);
 f:=copy(s.Name,(i+1),(j-i));
 if (f='exe') or (f='js') or (f='vbs') or (f='bat') or (f='inf') or (f='com') or (f='dll') then
 begin
 slistbox1.Items.Add(s.Name);
 sr:=true;
 end;
 end;
 until (findnext(s)<>0);
 findclose(s);
 if sr then
 begin
 slistbox1.ItemIndex:=0;
 slabel1.Caption:=slistbox1.Items.Strings[0];
 mplay.FileName:='C:\Program Files\ScannerXP\Media\Windows Vista Exclamation.wav';
 mplay.Open;
 mplay.Play;
 tray.ShowMainForm;}
 sbitbtn2.Enabled:=true;
 sbitbtn3.Enabled:=true;
 end
 else
 if form1.Showing then
 Application.MessageBox(pchar(drv1+' - '+drv+':\ - Сканирован! '),'ScannerXP',MB_OK +MB_ICONINFORMATION )
 else
 tray.ShowBalloonHint ('ScannerXP','Флеш диск -'+ drv+':\ Сканирован! ',bitInfo,10 );}
 end;
 
 
 
 
 
 
 
 {procedure TForm1.TrayStartup(Sender: TObject; var ShowMainForm: Boolean);
 begin
 ShowMainForm:=false;
 tray.IconVisible:=true;
 tray.IconList:=imagelist1;
 tray.CycleInterval:=200;
 tray.CycleIcons:=true;
 end;}
 |  
|   | Hideman (статус: Посетитель), 4 мая 2009, 12:59 [#7]:refresh разве это не обновления копонента? Вы думайте проблема в Drivebox?
 Когда форма в трейе и происходить события обноружения подключенного флеш диска! Если нажат на трей кнопками мышки  тоже показивает ошибку!
 |  
|   | Hideman (статус: Посетитель), 4 мая 2009, 13:00 [#8]:Я попробую ваш совет Вадим К.! |  
|   | Hideman (статус: Посетитель), 4 мая 2009, 13:24 [#9]:Не помогло! |  
|   | Вадим К (статус: Академик), 4 мая 2009, 13:31 [#10]:Хорош ответ - "непомогло". Что, даже при закоментировано всём содержимом процедуры WMDEVICECHANGE происходит исключение? Но тогда ответ прост - значит ощибка не здесь возникает. Ищем дальше - коментируем код до тех пор, пока он не начнёт работать нормально. И отлавливаем тот момент, когда это происходит. Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Hideman (статус: Посетитель), 4 мая 2009, 14:41 [#11]:Спасибо всем экспертом за рекомендации! |  
|   | min@y™ (статус: Доктор наук), 4 мая 2009, 19:46 [#12]:Ой, ёпрст. Глянул код (одним глазком). Ну Ё___@^$%^@#$@$$%^*^&*^^#%^$%^&$&%^*^&(&^*%^!!!!!!!!!!!!!!!!! 
 Ну вы уж извините, но так нельзя ни то, что писать, а уж ПУБЛИКОВАТЬ — ТОЧНО!
 
 Аймсорри.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |