大侠们帮帮忙,这几个问题如何解决,分不够可再加,先谢过了 小弟是个新手,遇到了以下几个问题1、向ListView中添加大量数据时,如何判断所有的数据全部添加完毕?我要在数据全部添加完毕后执行另一个过程;2、程序运行期间,如何知道指定的光驱被弹出(最好也能检测虚拟光驱的弹出)?3、Delphi中如何分辨物理光驱和虚拟光驱?问题解决,立即给分; 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 转贴:检测虚拟光驱监测是否是虚拟光驱,没有测试,:(给你一个函数,(可以区分真实光驱和虚拟光驱):Function IsCDROM(Drv : Char):BOOLEAN;Var CDR : string; cnt : byte; Count,First : word;begin Result := false; CDR := ''; asm mov ax, 1500h xor bx, bx int $2f les di, COUNT mov es:[di], bx les di, FIRST mov es:[di], cx end; if Count > 0 then for cnt := 0 to (Count-1) do CDR := CDR + char(First + Byte('A') + cnt); Result := (Pos(upcase(Drv),CDR) > 0);end; 转贴自超级猛料------------------检测光驱是否就绪function CDROMReady(DRV:char):boolean;var i:dword; buf:array[0..MAX_PATH] of char; pd:DWORD;begin pd:=0; GetVolumeInformation(DRV+':\',buf,i,@pd,i,i,buf,i); result:=pd<>0;end;-------------------监视光驱是否有光盘拦截消息WM_DEVICECHANGE即可!//响应该消息procedure Tform1.WMDEVICECHANGE(var msgx :Tmessage);const DBT_DEVICEARRIVAL=$8000; DBT_DEVICEREMOVECOMPLETE=$8004;begin inherited; case msgx.WParam of DBT_DEVICEARRIVAL:Caption :='有了!'; DBT_DEVICEREMOVECOMPLETE:Caption :='取走了'; end;end; 1.你是不是采用数据循环加入的方式把大量数据加到ListView中的,则在循环完备后即执行另一个过程即可,如果是在进程中,则把另一个过程也写到该加入过程中,不就可以了!第2、3问题,请参考楼上的方法! WMDEVICECHANGE(var msgx :Tmessage) 是Delphi自带的还是自定义的??? WMDEVICECHANGE(var msgx :Tmessage)是一个消息处理函数,需要自己定义type TForm1 = class(TForm) private { Private declarations } procedure WMDEVICECHANGE(var msgx: TWMChar); message WM_DEVICECHANGE; public { Public declarations } end; 检测虚拟光驱的那段代码无法执行,提示如下 les di, COUNT[Error] Invalid combination of opcode and operands les di, FIRST[Error] Invalid combination of opcode and operands不过我的问题已经解决了,谢谢各位大侠了,如果哪位能将上述问题解决地话,再发个帖子,不胜感激结帖给分了 代码看不明白。大虾帮忙。 如何判断当前硬盘是IDE硬盘还是SCSI硬盘,并获得磁盘序列号(在线等待)? Delphi和c++ builder冲突??? 请问如何在DELPHI下…… delphi里面怎么打印? 在delphi中,十六制数参加计算,怎么表示?如12+1是两个十进制相加,那么十六制数12+1怎么表示? 超长SQL语句,高手进来看,在线等待 这个字段类型怎么了ftString 请问如何将OpenDialog中选定的多个文件写入ListBox中? 关于软盘传递数据记录的问题 紧急:clientdataset 压缩?? ClientSocket不会自动断开
给你一个函数,(可以区分真实光驱和虚拟光驱):
Function IsCDROM(Drv : Char):BOOLEAN;
Var
CDR : string;
cnt : byte;
Count,First : word;
begin
Result := false;
CDR := '';
asm
mov ax, 1500h
xor bx, bx
int $2f
les di, COUNT
mov es:[di], bx
les di, FIRST
mov es:[di], cx
end;
if Count > 0 then
for cnt := 0 to (Count-1) do
CDR := CDR + char(First + Byte('A') + cnt);
Result := (Pos(upcase(Drv),CDR) > 0);
end;
------------------
检测光驱是否就绪
function CDROMReady(DRV:char):boolean;
var
i:dword;
buf:array[0..MAX_PATH] of char;
pd:DWORD;
begin
pd:=0;
GetVolumeInformation(DRV+':\',buf,i,@pd,i,i,buf,i);
result:=pd<>0;
end;
-------------------
监视光驱是否有光盘拦截消息WM_DEVICECHANGE即可!
//响应该消息
procedure Tform1.WMDEVICECHANGE(var msgx :Tmessage);
const
DBT_DEVICEARRIVAL=$8000;
DBT_DEVICEREMOVECOMPLETE=$8004;
begin
inherited;
case msgx.WParam of
DBT_DEVICEARRIVAL:Caption :='有了!';
DBT_DEVICEREMOVECOMPLETE:Caption :='取走了';
end;
end;
TForm1 = class(TForm)
private
{ Private declarations }
procedure WMDEVICECHANGE(var msgx: TWMChar); message WM_DEVICECHANGE;
public
{ Public declarations }
end;
les di, COUNT
[Error] Invalid combination of opcode and operands
les di, FIRST
[Error] Invalid combination of opcode and operands
不过我的问题已经解决了,谢谢各位大侠了,如果哪位能将上述问题解决地话,再发个帖子,不胜感激结帖给分了