5,388
社区成员
发帖
与我相关
我的任务
分享
for i:=0 to m-1 do
begin
a[i]:=dat[i];
end;
procedure TForm1.can0_sendClick(Sender: TObject);
var
a: olevariant;
i:integer;
len:integer;
begin
len:= strtoint(len_0.Text);
if( len>0 ) then
begin
ID0 := strtoint(id_0.Text) ;
RTR0 := strtoint(rtr_0.Text) ;
a:=VarArrayCreate([0, len-1], varByte);
for i:=0 to len-1 do
begin
a[i]:=byte(send_edit_0.Text[i+1]);
end;
if( pcican.SEND(0,ID0,RTR0,len,a)) then
begin
form1.StatusBar1.Panels[3].Text:='can0資料發送成功';
end;
olevariant
end;
end
pcican.RECEIVE(1,buff ) // SC2102c.oxc 控制項的介面函數。
procedure TForm1.pcicanCanEvent(ASender: TObject; IntFlag: Smallint);
var
buff: olevariant;
s: array[0..7] of byte;
i:integer;
begin
if((IntFlag and 16)=16) then
begin
if( pcican.RECEIVE(1,buff )) then
begin
for i:=0 to 7 do
begin
s[i]:=buff[i];
end;
can1_rec_memo.Lines.Add(BytesToStr(s));
label19.Caption:=inttostr(pcican.ID);
end;
end
else
if((IntFlag and 1)=1) then
begin
if( pcican.RECEIVE(0,buff )) then
begin
for i:=0 to 7 do
begin
s[i]:=buff[i];
end;
can0_rec_memo.Lines.Add( BytesToStr(s) );
end;
end;
end;
function GetBuffer(var Buffer: {??PSafeArray}OleVariant; TimeOut: Smallint): Integer; dispid 1610809374;
OLEVariant資料類型,看到Variant就知道這個是個變體,可變為其他的類型,前提是要知道怎麼給它賦值,因為不能直接把array of byte賦給它。這只說明這一種用法,賦值陣列。
首先先建立一個變數;
var
test:OLEVariant;
i:integer;
然後要分配空間,使用VarArrayCreat(),這個方法在variants單元中,所以確保前面已經包含進這個單元。
varArrayCreat([0,255],varbyte),[0,255]表明分配256個空間,類型為byte。
這一段代碼這樣寫:
test:=VarArrayCreat([0,255],varbyte);
for i:=0 to 255 do
begin
test[i]:=data[i];//data[]為你的要賦給test的陣列
end;
之後就可以直接使用test了。
例如:mscomm控制項中的輸出
mscomm1.output:=test;會把這個陣列發送出去。
採用test而不直接用char(),是因為char()轉換為字元值,而有些byte值沒對應的字元這時,char()會返回0的,這樣傳送的位元組資料就會出問題。