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

讀取OleVariant

答題得分者是:speedup
donlly
一般會員


發表:45
回覆:73
積分:23
註冊:2004-11-30

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-02-02 14:38:51 IP:219.235.xxx.xxx 未訂閱
[/code] unit server; procedure Tcorecord.Readrecord(str: OleVariant); begin showmessage(str.Month); end; -------------------------------------------------------------- Unit client; procedure TForm1.Button1Click(Sender: TObject); type TDateRec = record Year: Integer; Month: (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec); Day: 1..31; end; var Record1: TDateRec; begin with Record1 do begin Year := 1904; Month := Jun; Day := 16; end; dep:=vararraycreate([0, 2], varVariant); dep[0]:=Record1.Year; dep[1]:=Record1.Month; dep[2]:=Record1.Day; SocketConnection1.AppServer.Rererord(dep); end; [/code] 請問為什么編譯錯誤?server怎樣可以把client的record1讀取?
speedup
資深會員


發表:19
回覆:259
積分:280
註冊:2003-07-04

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-02-02 15:42:08 IP:220.135.xxx.xxx 未訂閱
引言:
    unit server;    procedure Tcorecord.Readrecord(str: OleVariant);
begin
 //showmessage(str.Month);
 ShowMessage(str[0]);//Client 傳過來的是oleVariant 不是結構(Record)
end;    --------------------------------------------------------------    Unit client;    procedure TForm1.Button1Click(Sender: TObject);
type
  TDateRec = record
    Year: Integer;
    Month: (Jan, Feb, Mar, Apr, May, Jun, 
            Jul, Aug, Sep, Oct, Nov, Dec);
    Day: 1..31;
  end;
 var Record1: TDateRec;    begin
   with Record1 do
begin
  Year := 1904;
  Month := Jun;
  Day := 16;
end;
 dep:=vararraycreate([0, 2], varVariant);
 dep[0]:=Record1.Year;
 dep[1]:=Record1.Month;
 dep[2]:=Record1.Day;    SocketConnection1.AppServer.Rererord(dep);
end;
請問為什么編譯錯誤?server怎樣可以把client的record1讀取?
混心雜欲 棄修身~唉
------
唉~
speedup
資深會員


發表:19
回覆:259
積分:280
註冊:2003-07-04

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-02-02 15:46:24 IP:220.135.xxx.xxx 未訂閱
引言:
    unit server;    procedure Tcorecord.Readrecord(str: OleVariant);
begin
 //showmessage(str.Month);
 ShowMessage(str[0]);//Client 傳過來的是oleVariant 不是結構(Record)
end;    --------------------------------------------------------------    Unit client;    procedure TForm1.Button1Click(Sender: TObject);
type
  TDateRec = record
    Year: Integer;
    Month: (Jan, Feb, Mar, Apr, May, Jun, 
            Jul, Aug, Sep, Oct, Nov, Dec);
    Day: 1..31;
  end;
 var Record1: TDateRec;    begin
   with Record1 do
begin
  Year := 1904;
  Month := Jun;
  Day := 16;
end;
 dep:=vararraycreate([0, 2], varVariant);
 dep[0]:=Record1.Year;
 dep[1]:=Record1.Month;
 dep[2]:=Record1.Day;    SocketConnection1.AppServer.Rererord(dep);
end;
請問為什么編譯錯誤?server怎樣可以把client的record1讀取?
混心雜欲 棄修身~唉
------
唉~
donlly
一般會員


發表:45
回覆:73
積分:23
註冊:2004-11-30

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-02-02 16:07:24 IP:219.235.xxx.xxx 未訂閱
引言:
    unit server;    procedure Tcorecord.Readrecord(str: OleVariant);
begin
 //showmessage(str.Month);
 ShowMessage(str[0]);//Client 傳過來的是oleVariant 不是結構(Record)
end;    --------------------------------------------------------------    Unit client;    procedure TForm1.Button1Click(Sender: TObject);
type
  TDateRec = record
    Year: Integer;
    Month: (Jan, Feb, Mar, Apr, May, Jun, 
            Jul, Aug, Sep, Oct, Nov, Dec);
    Day: 1..31;
  end;
 var Record1: TDateRec;    begin
   with Record1 do
begin
  Year := 1904;
  Month := Jun;
  Day := 16;
end;
 dep:=vararraycreate([0, 2], varVariant);
 dep[0]:=Record1.Year;
 dep[1]:=Record1.Month;
 dep[2]:=Record1.Day;    SocketConnection1.AppServer.Rererord(dep);
end;
請問為什么編譯錯誤?server怎樣可以把client的record1讀取?
謝謝,請問有方法可以把OleVariant還原為Record嗎? 發表人 - donlly 於 2005/02/02 16:27:25
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-02-02 21:49:45 IP:61.31.xxx.xxx 未訂閱
可以使用vararraycreate([0,sizeof(TDateRec)],varbyte); 的方式。再用move 指令將Record 資料搬進去。 取出來方法也差不多。利用 vararraylock 回傳指針。 就這樣吧!
johnny2212
初階會員


發表:34
回覆:65
積分:39
註冊:2003-04-09

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-02-03 00:02:36 IP:61.226.xxx.xxx 未訂閱
若您希望傳入Server 或傳入Client的資料較為結構化,您不妨使用 memory table的方式(至少我是這麼做的),若按您的需求,可用以下的方法 Client 1 放入一個TClientDataSet的元件 2 在FieldDefs下,定義好三個欄位,Year,Month,Day,還有DataType一定要定義 3 以下是程式部分 procedure TForm1.Button1Click(Sender: TObject); begin ClientDataSet1.CreateDataSet; //您也可以在ClientDataSet按右鍵靜態CreateDataSet ClientDataSet1.Insert; ClientDataSet1['Year']:='1904'; ClientDataSet1['Month']:='Jun'; ClientDataSet1['Day']:='16'; ClientDAtaSet1.Post; SocketConnection1.AppServer.Rererord(ClientDataSet1.Data); end; Server procedure Tcorecord.Readrecord(str: OleVariant); begin //一樣放入ClientDataSet1 到資料模組上(TRemoteDataModule) ClientDataSet1.Data:=Str; //此處麻煩您自己測試一下 ShowMessage(ClientDataSet1['Month']); //或 ShowMessage(ClientDataSet1.Fields[0].AsString) ; //或 ShowMessage(ClientDataSet1.FindField('Month').AsString); //或FieldByName end; 我個人覺得如此做,就比較符合資料模組化的精神,若您要更複雜的結構, 可用ChildDefs(父結構使用ftArray,size代表有幾個)
speedup
資深會員


發表:19
回覆:259
積分:280
註冊:2003-07-04

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-02-04 14:48:53 IP:220.135.xxx.xxx 未訂閱
引言: 謝謝,請問有方法可以把OleVariant還原為Record嗎?
用笨方法 你怎麼包 就怎摸解
procedure Tcorecord.Readrecord(str: OleVariant);
type
  TDateRec = record
    Year: Integer;
    Month: (Jan, Feb, Mar, Apr, May, Jun, 
            Jul, Aug, Sep, Oct, Nov, Dec);
    Day: 1..31;
  end;
 var Record1: TDateRec;
begin
 record1.Year := str[0];
 record1.Month := str[1];
 record.Day := str[2];
end;
如果為常用結構型態寫成獨立的單元來定義此結構 並寫兩個函數一個用來包OleVariant 一個用來解OleVariant 混心雜欲 棄修身~唉
------
唉~
系統時間:2024-04-20 8:35:48
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!