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

如何動態宣告變數

缺席
ivankuo
中階會員


發表:132
回覆:272
積分:95
註冊:2002-11-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-07-10 15:29:31 IP:61.221.xxx.xxx 未訂閱
小弟有個table是用來紀錄系統參數,內容主要包含參數名稱,值,型態 請問delphi 有辦法動態去宣告這些參數嗎?? 假設此參數table有下列參數 paraName type value ======== ======= ====== para1 string 'AAA' para2 integer 100 para3 boolean true 當form.create的時候就去讀此table,才動態宣告para1,para2,para3 小弟目前是用array來做,雖然已做好了,但是也想知道delphi可以這樣做嗎??
------
ivankuo
ha0009
版主


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-07-10 15:34:31 IP:61.30.xxx.xxx 未訂閱
你好:
var      A: Variant;
begin
  A := VarArrayCreate([0, 4], varVariant);
  A[0] := 1;
  A[1] := 1234.5678;
  A[2] := 'Hello world';
  A[3] := True;
  A[4] := VarArrayOf([1, 10, 100, 1000]);
  WriteLn(A[2]);        { Hello world }
  WriteLn(A[4][2]);        { 100 }    end;
ivankuo
中階會員


發表:132
回覆:272
積分:95
註冊:2002-11-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-07-10 15:50:28 IP:61.221.xxx.xxx 未訂閱
前輩:這方式我知道~~~ 真不好意思~~可能是我沒說清楚~~ 我想要的是 paraName type value ======== ======= ====== para1 string 'AAA' para2 integer 100 para3 boolean true runtime時期宣告para1,para2,para3 為全域變數 也就是在任何地方我都可以用para1,para2,para3的參數名稱喔, 並不是用array來做,我是認為應該不可能吧~~complier會有錯誤吧~~~ 各位前輩可以做到嗎??
------
ivankuo
ha0009
版主


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-07-10 16:06:32 IP:61.30.xxx.xxx 未訂閱
你好: 你可以利用 TParams 來達到這個功能。你只要把他宣告成公開的變數,其他單元要使用 到這個變數只要 Uses 這個單元既可。範例如下:    
unit UnitAll;
interface    uses
  SysUtils, Classes, db;    var
   ParamList : TParams;    implementation    initialization
   ParamList := TParams.Create;    finalization
   FreeAndNil (ParamList);
end;    unit Unit1;
interface    uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, db;    type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Button2: TButton;
    Button3: TButton;        procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;    implementation
uses
   UnitAll;    procedure TForm1.FormCreate(Sender: TObject);
begin
   with ParamList.Add Do begin
      Name := 'para1'
      Value := '111';
   end;       with ParamList.Add Do begin
      Name := 'para2'
      Value := 111;
   end;
end;    end;
ivankuo
中階會員


發表:132
回覆:272
積分:95
註冊:2002-11-21

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-07-10 16:30:51 IP:61.221.xxx.xxx 未訂閱
Value := 111; --這行有問題 這樣的的方式我還是無法直接使用para1 如: showmessage(para1); 變成去判斷ParamList 的參數哪一個是para1才能使用,不知道這樣說對嗎??
------
ivankuo
ha0009
版主


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-07-10 16:41:21 IP:61.30.xxx.xxx 未訂閱
你好: 既然都跟你說可以利用 TParams 來管理,你有去查 TParams 的用法嗎 > 我臨時 >; 這是很簡單除錯的才對吧< > 我想論壇的目的是要交流經驗 讓自己成長,而不是找答案完成工作的地方喔< > 共勉 < class="code"> with ParamList.Add Do begin Name := 'para1'; Value := '111'; end;
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-07-10 17:10:23 IP:218.16.xxx.xxx 未訂閱
引言: 小弟有個table是用來紀錄系統參數,內容主要包含參數名稱,值,型態 請問delphi 有辦法動態去宣告這些參數嗎?? 假設此參數table有下列參數 paraName type value ======== ======= ====== para1 string 'AAA' para2 integer 100 para3 boolean true 當form.create的時候就去讀此table,才動態宣告para1,para2,para3 小弟目前是用array來做,雖然已做好了,但是也想知道delphi可以這樣做嗎??
簡單來說就是不可以。如你所說,你在 Code 裡沒宣告形態的話當你直接用 para1, para2 時 Complier 也不會讓你過。 若你知道 Param 的數目或有一個明確上限的話,可以將他們全部宣告成 Variant;這樣便可動態的設定(是設定不是宣告)他們的形態和值如 : para1 := VarAsType('AAA',varString); para2 := VarAsType('100',varInteger); // 假設將 Value 的 Field 是 String Field 等等 若不知道 Params 的數目的話,你所說的用 Array (應是 Array of Variant 罷? 可用上述方法) 是我覺得較簡單的方法,使用 HA009 兄提議的TParamList 亦不失為一個很好的解決方法。 需然有不少解決辦法,但這都不否定不可以動態宣告變數及其形態的結論。(Variant 不算是動態宣告形態因這是一早宣告好是 Variant 形態,只是動態設定其實質形態而已。)
ivankuo
中階會員


發表:132
回覆:272
積分:95
註冊:2002-11-21

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-07-10 17:30:31 IP:61.221.xxx.xxx 未訂閱
ha0009前輩您好: 不好意思~~~小弟所說的有問題並不是指';'那個地方,我之前有去查過help了,並沒有找到value的屬性,我是用D5的版本不曉得有沒有差別,我執行下列程式時找不到prar1的參數 procedure TForm1.FormCreate(Sender: TObject); begin with ParamList.add do begin Name:='para1'; add // value:='111'; end; with ParamList.add do begin Name:='para2'; // value:='222'; end; showmessage(ParamList.ParamByName('para1').value); end; 於是我去找出剛剛TParams.add的methods,他是Derived from TCollection ,由button3中去找出para的name,發現是空白的,目前還在研究中,讓您知道一下吧.謝謝指導. procedure TForm1.Button3Click(Sender: TObject); var i:integer; begin for i:=0 to ParamList.Count-1 do begin ParamList.Items[i].Value:=ParamList.Items[i].Name '=' inttostr(i); showmessage(ParamList.items[i].value); end; end; 感謝Justmade前輩的指導,小弟提供自己的方式如下 宣告 sys_para:array of array of variant; 然後 第一維存 paraName 第二維存 value paraName命名規則需為@SYS_000 後三碼是流水號且是陣列的位置 所以取得所用參數知道他的編號是第幾個就知道他的值是多少了?? 這個方式有點笨,且有些限制,所以才請教各位前輩有何其他方式囉.
------
ivankuo
ha0009
版主


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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-07-10 17:49:00 IP:61.30.xxx.xxx 未訂閱
你好: 呵呵 我不知道 >),如果真的不能使用,那就繼承下來在改寫吧。 因為我發現很多發問的問題 > < src="http://sourceprovide.deepen.com.tw/K_Top/bp.gif">
ivankuo
中階會員


發表:132
回覆:272
積分:95
註冊:2002-11-21

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-07-10 18:01:04 IP:61.221.xxx.xxx 未訂閱
嗯~~~還是感謝前輩們~~~~~help雖然有的看不太懂~~努力研究中< >< >
------
ivankuo
suckin
一般會員


發表:13
回覆:26
積分:7
註冊:2003-06-16

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-07-11 14:25:15 IP:211.22.xxx.xxx 未訂閱
我記得是可以使用 RTI 達成的. 具體做法待我查到再覆.
系統時間:2024-04-30 2:14:15
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!