全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1228
推到 Plurk!
推到 Facebook!

Pointer傳輸

尚未結案
kkccgg
初階會員


發表:50
回覆:54
積分:30
註冊:2002-07-28

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-12-16 23:59:12 IP:203.204.xxx.xxx 未訂閱
請問: type Test = record X, Y: Single; end; Test可以用Pointer方式傳輸嘛.? 如何使用? 謝謝
chris_shieh
高階會員


發表:46
回覆:308
積分:240
註冊:2004-04-26

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-12-17 07:53:18 IP:218.167.xxx.xxx 未訂閱
可以的
type
  Test = record
     X, Y: Single;
  end;
  
  pTest = ^Test;    使用時
var
  ptExample:pTest;
begin
  New(ptExample);
  ptExample^.X:=100;
  ptExample^.Y:=100;
  testProcedure(ptExample);
   ...
  dispose(ptExample); 
end;    Procedure testProcedure(ptEx:ptTest);
var
  x,y:Single;
begin
  x:=ptEx^.X;
  y:=ptEx^.Y;
  ptEx^.X:=0;
  ptEx^.Y:=0;
end;
發表人 - chris_shieh 於 2004/12/17 11:57:28
ha0009
版主


發表:16
回覆:507
積分:639
註冊:2002-03-16

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-12-17 10:32:33 IP:219.80.xxx.xxx 未訂閱
你好:
  補充 chris_shieh 的回答, 也可以這樣傳遞    var
  Example : Test;
begin
  Example.X:=100;
  Example.Y:=100;
  testProcedure(@Example); // @ 是傳回變數的指標
end;        
kkccgg
初階會員


發表:50
回覆:54
積分:30
註冊:2002-07-28

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-12-18 01:43:51 IP:218.172.xxx.xxx 未訂閱
如果是函式是這樣請問如何傳 Procedure testProcedure(userdata:Point); thk
chris_shieh
高階會員


發表:46
回覆:308
積分:240
註冊:2004-04-26

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-12-20 10:01:22 IP:219.68.xxx.xxx 未訂閱
Procedure testProcedure(userdata:Point); 我想這應該要看你Point 型態的定義為何才能決定吧
Point 也是Pointer型態嗎
那就是
var
  originPt:Point;
begin
  new(originPt);
  //參考我前面的post 可以指定 originPt的值
  testProcedure(originPt);
  ...
  ...
  dispose(originPt);
end;    如果你的Point 型態是跟 TPoint 有關的話 (應該不是吧)
那就是
>        發表人 - 
        
kkccgg
初階會員


發表:50
回覆:54
積分:30
註冊:2002-07-28

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-12-20 11:35:13 IP:218.175.xxx.xxx 未訂閱
原函式為 function test(UserData: Pointer = nil): Cardinal; 那UserData可傳那種類資料, type類型的可以嗎 type Test = record X, Y: Single; end; 謝謝
chris_shieh
高階會員


發表:46
回覆:308
積分:240
註冊:2004-04-26

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-12-20 14:54:42 IP:218.167.xxx.xxx 未訂閱
unit Unit1;    interface    uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;    type
  Test = record
    X, Y: Single;
  end;
  pTest = ^Test;      TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    ptEx:pTest;
    function test(UserData: Pointer = nil): Cardinal;
    { Public declarations }
  end;    var
  Form1: TForm1;    implementation    {$R *.dfm}    function TForm1.test(UserData: Pointer = nil): Cardinal;
var
  ptLocal:pTest;
begin
  ptLocal:=pTest(UserData); //Type casting to pTest
  Showmessage(FloatToStr(ptLocal^.X));
  Showmessage(FloatToStr(ptLocal^.Y));
  ptLocal.X:=ptLocal.X*10; //update value
  ptLocal.Y:=ptLocal.Y*10; //update value
end;    procedure TForm1.FormCreate(Sender: TObject);
begin
  new(ptEx);
  ptEx.X:=10;
  ptEx.Y:=20;
  test(ptEx); 
  Showmessage(FloatToStr(ptEx^.X)); //show updated value
  Showmessage(FloatToStr(ptEx^.Y)); //show updated value
  dispose(ptEx);
end;    end.    
kkccgg
初階會員


發表:50
回覆:54
積分:30
註冊:2002-07-28

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-12-20 15:10:17 IP:218.175.xxx.xxx 未訂閱
很抱歉,表達有點錯誤 1.我是用由別人開發的物件,故無法修改函式內的程式 2.原件動作步驟如下 function test(UserData: Pointer = nil): Cardinal; 當下了該行函數後,在某狀態會觸發事件,而是件內包含以下資料 TTransactionInfo = record ID: Cardinal; UserData: Pointer; end; 而UserData會引用test傳入Pointer 該項解說是 UserData is a pointer to user-defined data that was supplied by the application to a previous call to one of the transaction initiation methods. 那UserData: Pointer;可以傳type嗎. 謝謝 謝謝
chris_shieh
高階會員


發表:46
回覆:308
積分:240
註冊:2004-04-26

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-12-20 15:54:55 IP:218.167.xxx.xxx 未訂閱
UserData is a pointer to user-defined data that was supplied by the application to a previous call to one of the transaction initiation methods. 所以 UserData 應該是您呼叫 transaction initiation methods 而可以得到的吧 function test 還是要傳Pointer , 不管是typed or untyped 我想test function 內應該自己會作處理 根據Delphi Online Help: Addr function ...... The result of Addr is of the predefined type Pointer, which means that it is assignment-compatible with all pointer types but can't be dereferenced directly without a typecast. 不過我想你應該要先瞭解test function所需要的 UserData 真正的型態定義才能給一個正確的UserData, 也才能正確宣告UserData
var
  UserData:Pointer;
begin
  UserData:=Get_From_TransInit_Method; //如果傳回的也是Pointer
  test(UserData);
end;
發表人 - chris_shieh 於 2004/12/20 17:36:48
系統時間:2024-11-22 12:48:36
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!