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

請問用SendMessage如何送一個record

尚未結案
brianwung
一般會員


發表:18
回覆:22
積分:8
註冊:2002-06-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-05-14 16:04:35 IP:220.135.xxx.xxx 未訂閱
請問用SendMessage如何送一個record Trec = Recored A : String[8]; B : word; C : word; end; 我有試用WM_COPYDATA傳送 但收時指標遇結束符号#0 讀出來的值就有問題 請幫忙一下,謝謝
Mickey
版主


發表:77
回覆:1882
積分:1390
註冊:2002-12-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-05-14 22:02:27 IP:218.32.xxx.xxx 未訂閱
brianwung 你好: 我沒有實際測試,不過依據 COPYDATASTRUCT 的結構說明: typedef struct tagCOPYDATASTRUCT { // cds DWORD dwData; DWORD cbData; PVOID lpData; } COPYDATASTRUCT; Members dwData Specifies up to 32 bits of data to be passed to the receiving application. cbData Specifies the size, in bytes, of the data pointed to by the lpData member. lpData Points to data to be passed to the receiving application. This member can be NULL. 其中 cbData 有描述 Data 的長度, 應該是您讀出時, 須依據 Size 處理, #0 不應該會造成困擾才是.
brianwung
一般會員


發表:18
回覆:22
積分:8
註冊:2002-06-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-05-14 22:55:05 IP:203.204.xxx.xxx 未訂閱
感謝版主回覆, 我試了很久的確有#0的問題 會不會是pchar的問題 不知有沒有其它方式解決呢? 謝謝
jest0024
高階會員


發表:11
回覆:310
積分:224
註冊:2002-11-24

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-05-15 01:20:45 IP:211.74.xxx.xxx 未訂閱
引言: 感謝版主回覆, 我試了很久的確有#0的問題 會不會是pchar的問題 不知有沒有其它方式解決呢? 謝謝
經測試沒問題呀!?
//因為要建立2個視窗,所以標題改了一下,測試用..
procedure TForm1.FormCreate(Sender: TObject);
var
  dc:THandle;
begin
  Caption:='';
  dc:=FindWindow(nil,'Test1');
  if(dc>0)then Caption:='Test2' else Caption:='Test1';
end;    //傳遞訊息
procedure TForm1.Button1Click(Sender: TObject);
VAR
  R:Trec;
  P:COPYDATASTRUCT;
  dc:THandle;
begin
  R.A:=#0#1#2#3#4#5#6#7;
  R.B:=1;
  R.C:=2;
  if Caption='Test1' then dc:=FindWindow(nil,'Test2')
                     else dc:=FindWindow(nil,'Test1');
  if dc=0 then Showmessage('找不到視窗') else begin
    P.dwData:=dc;
    P.cbData:=Sizeof(R);
    P.lpData:=@R;
    SendMessage(dc,WM_COPYDATA,Handle,Integer(@P));
  end;
end;    //接收用訊息
procedure TForm1.WMCopy(var Msg:TMessage);
var
  R:Trec;
  P:COPYDATASTRUCT;
  function GetStr(Str:String):String;{這函數將Str轉為Hex}
  var i:Integer;
  begin
    Result:='';
    for i:=1 to Length(Str)do Result:=Result ':' IntToHex(Byte(Str[i]),2);
  end;
begin
  memo1.Lines.Add('Wparam:' inttostr(msg.wParam));
  P:=COPYDATASTRUCT(Pointer(Msg.lParam)^);
  R:=TRec(P.lpData^);
  Memo1.Lines.Add('A:' GetStr(r.A));
  memo1.Lines.Add('B:' inttostr(r.B));
  memo1.Lines.Add('C:' inttostr(r.C));
end;    
學而時習之不亦樂乎!
brianwung
一般會員


發表:18
回覆:22
積分:8
註冊:2002-06-12

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-05-18 10:40:48 IP:220.135.xxx.xxx 未訂閱
感謝回答~ R:=TRec(P.lpData^); 原來要用原來的形態去接point 謝謝啦
系統時間:2024-05-19 8:47:54
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!