結構欄位名稱可否變數方式帶入取得其欄位值 |
尚未結案
|
bruce0211
版主 ![]() ![]() ![]() ![]() ![]() 發表:157 回覆:668 積分:279 註冊:2002-06-13 發送簡訊給我 |
|
Chance36
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:31 回覆:1033 積分:792 註冊:2002-12-31 發送簡訊給我 |
bruce0211 你好 基本上Record是無法達到Record.xxxx('Field')方式取值的
因為Record只是一資料的型態,而不是物件(當然物件也是型態),它不像物件可以實作事作及方法,它只有屬性的直接存取,所以你必直接指名存取的欄位名稱, 但是,你可以透過自定Procedure 或Function 來達到你的需求,就如
Str : String;
Str.AsInteger; // 不行
StrToInt(Str); // 可以
同樣的
type MYDATE = record
year: array[0..3] of BYTE;
month: array[0..1] of BYTE;
day: array[0..1] of BYTE;
end; Function MyDateFieldValue(FieldName:String):Integer ; var tmpdate: MYDATE 你可以
SomeVar := MyDateFieldValue('Year'); // 透過Function取值
|
bruce0211
版主 ![]() ![]() ![]() ![]() ![]() 發表:157 回覆:668 積分:279 註冊:2002-06-13 發送簡訊給我 |
我之前正如長官的方法
寫一個函式讓 user 可以透過變數字串的方式取得結構資料 var tmpdate: MYDATE Function MyDateFieldValue(FieldName:String):Integer ;
begin
if FieldName='year' then return tmpdate.year ...
if FieldName='month' then return tmpdate.month ...
if FieldName='day' then return tmpdate.day
......
end; 但是當我遇到一個結構有兩百個欄位的時候
我就不想再用這種方法了...
|
Chance36
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:31 回覆:1033 積分:792 註冊:2002-12-31 發送簡訊給我 |
引言: 我之前正如長官的方法 寫一個函式讓 user 可以透過變數字串的方式取得結構資料 var tmpdate: MYDATE Function MyDateFieldValue(FieldName:String):Integer ; begin if FieldName='year' then return tmpdate.year ... if FieldName='month' then return tmpdate.month ... if FieldName='day' then return tmpdate.day ...... end; 但是當我遇到一個結構有兩百個欄位的時候 我就不想再用這種方法了...bruce0211 你好 或許你可以改用TStringList Var Sl : TStringList; SomeVar :String ; Begin SL := TStringList.Create; SL.Values['Year'] := 'xxxx'; // 儲存資料 SomeVar := SL.Values['Year']; // 取出資料 SL.Free; End; |
bruce0211
版主 ![]() ![]() ![]() ![]() ![]() 發表:157 回覆:668 積分:279 註冊:2002-06-13 發送簡訊給我 |
|
thomas0728
中階會員 ![]() ![]() ![]() 發表:112 回覆:260 積分:89 註冊:2002-03-12 發送簡訊給我 |
TMyRecordField=class(TObject)
private
vFieldName:string;
VFieldValue:string;
public
constructor Create;
destructor Destroy;override;
end; constructor TMyRecordField.Create;
begin
inherited Create ;
end ; destructor TMyRecordField.Destroy ;
begin
inherited Destroy ;
end ; TMYClass =class
private
FData:TMyRecordField;
sl:TStringList;
function GetFieldValue(FieldName:string):string;
published
property :item[FieldName:string]:string read GetFieldValue;
public
constructor Create;
destructor Destroy;override;
function SetFieldValue(mvFieldName,mvFieldValue:string);
end; constructor TMYClass.Create;
begin
inherited Create ;
SL := TStringList.Create;
end ; destructor TMYClass.Destroy ;
begin
SL.FREE;
inherited Destroy ;
end ; function TMYClass.SetFieldValue(mvFieldName,mvFieldValue:string);
Var
mvindex:integer;
mvMyRecordField : TMyRecordField;
begin
mvIndex := SL.IndexOf(mvFieldName);
IF MVINDEX=-1 THEN
BEGIN
mvMyRecordField := TMyRecordField.Create ;
mvMyRecordField.vFieldName:=mvFieldName;
mvMyRecordField.VFieldValue:=mvFieldValue;
sl.AddObject(mvMyRecordField.vFieldName,mvMyRecordField) ;
end
else
begin
TMyRecordField(sl.Objects[mvIndex]).VFieldValue:= mvFieldValue;
END;
end; function GetFieldValue(mvFieldName:string);
mvIndex :INTEGER;
Begin
mvIndex :=SL.IndexOf(mvFieldName);
IF MVINDEX>-1 THEN
RETURN TMyRecordField(sl.Objects[mvIndex]).VFieldValue;
End; var MYCLASS:TMYCLASS 使用時,只要用 myclass.item('year') 就可得到你要的欄位值
當然你還要加強SetFieldValue ,要把文字檔讀入 TMyRecordField
或者擴充 TMyRecordField 的結構,如果你的文字檔有很多型態,可考慮用 VARIANT,把TMyRecordField 宣告成
vFieldName:string;
VFieldValue:VARIANT; 不知這樣你看的懂嗎 ? Thomas Chiou
------
Thomas Chiou |
bruce0211
版主 ![]() ![]() ![]() ![]() ![]() 發表:157 回覆:668 積分:279 註冊:2002-06-13 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |