在DELPHI7中使用INIDY网络控件和ACM第三方音频控件时奇怪的三种情况:
1、当ACMIN的VISABLE属性设为FALSE,并且在TIdTCPServer的ONCONNECT中ACMIN.open(format)时,ACMIN.ONDATA无法正常响应.
2、当ACMIN的VISABLE属性设为TRUE,并且在TIdTCPServer的ONCONNECT中ACMIN.open(format)时,ACMIN.ONDATA可以正常响应.
3、奇怪的是,当在ACMIN.VISABLE:=FALSE并且TIdTCPClient的ONCONNECT事件中ACMIN.open(format)时,也可以正常响应ACMIN.ONDATA事件!!!
那请问产生这个情况的原因?并且如何让ACMIN.VISABLE:=FALSE时ACMIN.ONDATA事件一定可以触发?
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ACMWaveIn, StdCtrls, ExtCtrls, IdTCPConnection, IdTCPClient,
IdBaseComponent, IdComponent, IdTCPServer;type
TForm1 = class(TForm)
acmin: TACMWaveIn;
Button2: TButton;
server: TIdTCPServer;
client: TIdTCPClient;
procedure FormCreate(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure acminData(data: Pointer; size: Integer);
procedure serverConnect(AThread: TIdPeerThread);
private
{ Private declarations }
public
{ Public declarations }
end;
//自定义音频文件头
TGSM610=packed record
wFormatTag: Word;
nChannels: Word;
nSamplesPerSec: DWORD;
nAvgBytesPerSec: DWORD;
nBlockAlign: Word;
wBitsPerSample: Word;
cbSize: Word;
wSamplesPerBlock:word;
end;
var
Form1: TForm1;
format:pointer;
gsm610:TGSM610;
f:TFIlestream;
i:integer;
implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
begin
ACMIN.Visible:=FALSE; //注意这里,问题就出在这,法正确响应ACMINDATA事件。 with gsm610 do
begin
wFormatTag:=$31;
nChannels:=1;
wBitsPerSample:=0;
nSamplesPerSec:=8000;
nBlockAlign:=65;
nAvgBytesPerSec:=1625;
cbSize:=2;
wSamplesPerBlock:=$140;
end;
format:=@gsm610;
end;procedure TForm1.Button2Click(Sender: TObject);
begin
client.Connect(5000);end;procedure TForm1.acminData(data: Pointer; size: Integer);
begin
inc(i); 无法正确响应ACMINDATA事件。
f.WriteBuffer(data^,size);
FORM1.Canvas.TextOut(0,0,INTTOSTR(i));
end;procedure TForm1.serverConnect(AThread: TIdPeerThread); //备注:TIdTCPServer采用的是阻塞、多线程式。
begin
acmin.Open(format);
end;end.
1、当ACMIN的VISABLE属性设为FALSE,并且在TIdTCPServer的ONCONNECT中ACMIN.open(format)时,ACMIN.ONDATA无法正常响应.
2、当ACMIN的VISABLE属性设为TRUE,并且在TIdTCPServer的ONCONNECT中ACMIN.open(format)时,ACMIN.ONDATA可以正常响应.
3、奇怪的是,当在ACMIN.VISABLE:=FALSE并且TIdTCPClient的ONCONNECT事件中ACMIN.open(format)时,也可以正常响应ACMIN.ONDATA事件!!!
那请问产生这个情况的原因?并且如何让ACMIN.VISABLE:=FALSE时ACMIN.ONDATA事件一定可以触发?
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ACMWaveIn, StdCtrls, ExtCtrls, IdTCPConnection, IdTCPClient,
IdBaseComponent, IdComponent, IdTCPServer;type
TForm1 = class(TForm)
acmin: TACMWaveIn;
Button2: TButton;
server: TIdTCPServer;
client: TIdTCPClient;
procedure FormCreate(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure acminData(data: Pointer; size: Integer);
procedure serverConnect(AThread: TIdPeerThread);
private
{ Private declarations }
public
{ Public declarations }
end;
//自定义音频文件头
TGSM610=packed record
wFormatTag: Word;
nChannels: Word;
nSamplesPerSec: DWORD;
nAvgBytesPerSec: DWORD;
nBlockAlign: Word;
wBitsPerSample: Word;
cbSize: Word;
wSamplesPerBlock:word;
end;
var
Form1: TForm1;
format:pointer;
gsm610:TGSM610;
f:TFIlestream;
i:integer;
implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
begin
ACMIN.Visible:=FALSE; //注意这里,问题就出在这,法正确响应ACMINDATA事件。 with gsm610 do
begin
wFormatTag:=$31;
nChannels:=1;
wBitsPerSample:=0;
nSamplesPerSec:=8000;
nBlockAlign:=65;
nAvgBytesPerSec:=1625;
cbSize:=2;
wSamplesPerBlock:=$140;
end;
format:=@gsm610;
end;procedure TForm1.Button2Click(Sender: TObject);
begin
client.Connect(5000);end;procedure TForm1.acminData(data: Pointer; size: Integer);
begin
inc(i); 无法正确响应ACMINDATA事件。
f.WriteBuffer(data^,size);
FORM1.Canvas.TextOut(0,0,INTTOSTR(i));
end;procedure TForm1.serverConnect(AThread: TIdPeerThread); //备注:TIdTCPServer采用的是阻塞、多线程式。
begin
acmin.Open(format);
end;end.
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货