如何動態宣告變數 |
缺席
|
ivankuo
中階會員 發表:132 回覆:272 積分:95 註冊:2002-11-21 發送簡訊給我 |
小弟有個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 發送簡訊給我 |
|
ivankuo
中階會員 發表:132 回覆:272 積分:95 註冊:2002-11-21 發送簡訊給我 |
前輩:這方式我知道~~~
真不好意思~~可能是我沒說清楚~~
我想要的是
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 發送簡訊給我 |
你好:
你可以利用 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 發送簡訊給我 |
|
ha0009
版主 發表:16 回覆:507 積分:639 註冊:2002-03-16 發送簡訊給我 |
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
引言: 小弟有個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 發送簡訊給我 |
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 發送簡訊給我 |
|
ivankuo
中階會員 發表:132 回覆:272 積分:95 註冊:2002-11-21 發送簡訊給我 |
|
suckin
一般會員 發表:13 回覆:26 積分:7 註冊:2003-06-16 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |