Kod: Tümünü seç
//declaration
procedure WMDEVICECHANGE(var Msg: TMessage); message WM_DEVICECHANGE;
//////////////
procedure TForm1.WMDEVICECHANGE(var Msg: TMessage);
var
prt: PDEV_BROADCAST_PORT;
port: integer;
begin
if Msg.wparam = DBT_DEVICEREMOVECOMPLETE then
if PDevBroadcastHdr(Msg.lParam)^.dbcd_devicetype = DBT_DEVTYP_PORT then
begin
b_PortRemoved := True; //check this flag before each operation with port.
prt := PDEV_BROADCAST_PORT(PDEV_BROADCAST_PORT(Msg.lParam));
s := prt.dbcp_name;
try
sleep( 200);
if port1.Open then begin
port1.Open:=false;
Button1.Caption:='Baglan';
ApdStatusLight1.Lit:=false;
ApdStatusLight2.Lit:=false;
ApdStatusLight3.Lit:=false;
ApdStatusLight4.Lit:=false;
ApdStatusLight5.Lit:=false;
ApdStatusLight6.Lit:=false;
ApdStatusLight7.Lit:=false;
end;
except on e:exception do e.CleanupInstance;
end;
Memo1.Lines.Add('ComPort ' + s + ' has been removed.');
end;
if Msg.wparam = DBT_DEVICEARRIVAL then
if PDevBroadcastHdr(Msg.lParam)^.dbcd_devicetype = DBT_DEVTYP_PORT then
begin
prt := PDEV_BROADCAST_PORT(PDEV_BROADCAST_PORT(Msg.lParam));
z := prt.dbcp_name;
port:=strtointdef(rightstr(z,1),3);
// USB-COM plugged, you can find it and make some reinitialisation
if b_PortRemoved then begin
sleep( 200);
port1.ComNumber:=port;
port1.Open:=true;
Button1.Caption:='Baglandı';
if port1.DTR then ApdStatusLight2.Lit:=true
else ApdStatusLight2.Lit:=false;
if port1.CTS then ApdStatusLight3.Lit:=true
else ApdStatusLight3.Lit:=false;
if port1.DSR then ApdStatusLight4.Lit:=true
else ApdStatusLight4.Lit:=false;
if port1.Open then ApdStatusLight4.Lit:=true
else ApdStatusLight4.Lit:=false;
if port1.CharReady then ApdStatusLight5.Lit:=true
else ApdStatusLight5.Lit:=false;
end
else begin
Edit1.Text:=inttostr(Comno);
Edit2.Text:='19200';
Edit3.Text:='8';
Edit4.Text:='1';
RadioButton1.Checked:=true;
port1.Open:=false;
Button1.Caption:='Baglan';
end;
Memo1.Lines.Add('ComPort ' + z + ' has been plugged'+inttostr(port));
end;
end;
Bu bölüm cok güzel calsıyor ve hangi cihaz hangi port sokulup baglanırsa o kapatılıp acılıyor. Ama bu program devreye girip comport kapatılana kadar sürede seklinde hata mesajı geliyor ve tabi enter ile mesajı kapatmayınca program işlemeye devam etmiyor. Bu ahat tabiki önemsiz bir hata cünkü yapılması gerekenler zaten yapılacak ama bu hatayı programda bir türlü yakalayıp ekrana gelmesini durduramadım. Try blogu işe yaramaz çünkü programatik bir olay değil device in out hatası Bunu için application.onexcept ve bazı low level örnekleri denedim fakat hiç biri bu hatayı yakalayamadı.
ayrıce madexcept de denedim hatayı yakaladı ama o da ekrana kendi eylem iletisini cıkartıyor ve onu da bir türlü kapatamadım yanı ben bu hata geldiçinde onu ignore edecek bir program yapısına ihtiyacım var
Bu sorunum için bir önerisi olan arkadaş olursa simdiden tesekkür ederim iyi çalısmalar dileğiyle.