線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:7350
推到 Plurk!
推到 Facebook!

Delphi如何宣告PSafeArray型態的參數

尚未結案
sally
一般會員


發表:10
回覆:21
積分:6
註冊:2003-08-08

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-11-13 09:16:33 IP:61.13.xxx.xxx 未訂閱
請教各位先進:Delphi呼叫VB的ocx,其中一個方法含有型態為PSafeArray的參數(var buf:PSafeArray),請問在Delphi中該如何宣告?謝謝不吝賜教!
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-11-13 09:35:23 IP:203.95.xxx.xxx 未訂閱
Hi, please uses ActiveX unit !
sally
一般會員


發表:10
回覆:21
積分:6
註冊:2003-08-08

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-11-13 09:40:58 IP:61.13.xxx.xxx 未訂閱
抱歉!看不懂您的意思。
ccchen
版主


發表:61
回覆:940
積分:1394
註冊:2002-04-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-11-13 10:01:46 IP:218.163.xxx.xxx 未訂閱
引言: 請教各位先進:Delphi呼叫VB的ocx,其中一個方法含有型態為PSafeArray的參數(var buf:PSafeArray),請問在Delphi中該如何宣告?謝謝不吝賜教!
1. PsafeArray是一個Record的pointer, 宣告在Activex.pas中,如下
  PSafeArray = ^TSafeArray;
  {$EXTERNALSYM tagSAFEARRAY}
  tagSAFEARRAY = record
    cDims: Word;
    fFeatures: Word;
    cbElements: Longint;
    cLocks: Longint;
    pvData: Pointer;
    rgsabound: array[0..0] of TSafeArrayBound;
  end;
  TSafeArray = tagSAFEARRAY;
2. 在delphi中你可以用Variant來處理其Data 例如以下是寫入WebBrowse之片段程式 var v:Variant; ws:WideString; begin v := VarArrayCreate([0,0],varVariant); //create成variant array ws:=PageProducer1.Content; v[0] := ws; HTMLDocument := WebBrowser1.Document as IHTMLDocument2; HTML(pSafearray(TVarData(v).VArray)); ... end;
sally
一般會員


發表:10
回覆:21
積分:6
註冊:2003-08-08

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-11-13 11:31:12 IP:61.13.xxx.xxx 未訂閱
歹勢,我的問題似乎不夠明確,容我再繼續說明:ocx中有一方法SendByte,包含二個參數(var id:WideString; var buf:PSafeArray),現在要將由鍵盤輸入的id及data分別傳入SendByte的id及buf,而data是binary type,一般寫入資料庫時以"0x"開頭即可表示二進制資料,但透過ocx方法該如何轉換,SendByte才能接受?曾出現的錯誤訊息如右->Types of actual and formal var parameters must be identical;麻煩各位了,謝謝!
ccchen
版主


發表:61
回覆:940
積分:1394
註冊:2002-04-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-11-13 13:17:21 IP:218.163.xxx.xxx 未訂閱
那不是很清楚嗎, 你可以 宣告一個TSafeArray,填入此Record 之各field, 然後將其pointer傳入 或用SafeArrayCreate 之API    不習慣這些API的話, 由於Delphi的Varaint有一型態VT_ARRAY即是pSafeArray,故可以可以Create Vararray再轉型為所要的 v := VarArrayCreate([0,0],varVariant); //create成variant array v[0] := data;  //assing data SendByte(xx, pSafearray(TVarData(v).VArray))
sally
一般會員


發表:10
回覆:21
積分:6
註冊:2003-08-08

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-11-14 09:13:49 IP:61.13.xxx.xxx 未訂閱
Hi,ccchen: Delphi我不是很熟,撰寫上述程式碼之前是否須做什麼動作嗎?根據您的範例套在我的程式碼裡,編譯後出現如右錯誤訊息Undeclared identifier: 'PSafeArray';以下是SendByte部份完整程式碼 procedure TForm1.buSendClick(Sender: TObject); var Lws_Id : WideString; Ls_Data : Variant; begin Lws_Id := edSend_Id.text; Ls_Data := VarArrayCreate([0,0],varVariant); //create成variant array Ls_Data[0] := edSend_Data.Text; //assing data TcpClient1.SendByte(Lws_Id, PSafeArray(TVarData(Ls_Data).VArray)); end; 其中TcpClient1為物件名稱,謝謝!!
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-11-14 09:49:12 IP:203.95.xxx.xxx 未訂閱
Undeclared identifier: 'PSafeArray' 請參考第二篇: 若不知如何 uses 請看該 unit 的最上面, 有 uses Windows, Messages, SysUtils ... 再加上 ActiveX 即可!
sally
一般會員


發表:10
回覆:21
積分:6
註冊:2003-08-08

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-11-14 10:13:51 IP:61.13.xxx.xxx 未訂閱
感謝 ccchen 及 timhuang 二位不吝指導,但由於 ccchen 的說明較仔細,所以得分者給 ccchen,並對 timhuang 說聲抱歉!
系統時間:2024-03-29 0:09:57
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!