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

一個 record 的定義問題

缺席
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#1 引用回覆 回覆 發表時間:2019-01-14 16:09:43 IP:59.120.xxx.xxx 未訂閱
請問各位,

腦袋突然打結, 想不透一個問題

我有20個欄位(例如 'A', 'B', 'C'......)
我定義了一個
const myFD : Array[0..19] of string = ('A', 'B', 'C', 'D',.....)

而我想寫一支 function 把20組值寫入到這些欄位中(欄位有 string, boolean, integer)
function InsertData(?1)
var i : integer;
begin
Query1.Append;
for i := low(myFD) to high(myFD) do
begin
Query1.FieldByName(myFD[i]).Value := ?2
end;
Query1.Post;
end;

請問, ?1 及 ?2 我該如何定義, 才能達成
原先我用 Record 方式
例如
type
TmyFDRec = Record
A : string;
B : string;
C : Integer;
D : boolean;
....
end;

但 ?1 我放進去 myValue : TmyFDRec 是可以的, 但 ?2 卻不知要如何表達語法

雖然我可以這麼下,
function InsertData(a: string; b:string; c:integer; d:boolean; e:xxxxx......)
begin
Query1.FieldByName('A').Value := a;
Query1.FieldByName('B').Value := b;
Query1.FieldByName('C').Value := c;
...
end;

但要寫一大串, 有沒有更精簡的下法, 感恩...
pedro
尊榮會員


發表:152
回覆:1187
積分:892
註冊:2002-06-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2019-01-14 22:17:33 IP:223.140.xxx.xxx 未訂閱
Hi PD大,

好像也沒什麼簡便的方式, 要用一些判斷式去判斷欄位型態
procedure TForm2.Button1Click(Sender: TObject);
var
i:Integer;
begin
ClientDataSet1.CreateDataSet;
ClientDataSet1.Append;
for I := 0 to ClientDataSet1.FieldCount-1 do
begin
if ClientDataSet1.Fields[i].DataType=ftString then
ClientDataSet1.Fields[i].AsString:='abc';
if ClientDataSet1.Fields[i].DataType=ftInteger then
ClientDataSet1.Fields[i].AsInteger:=20;
end;
end;

===================引 用 P.D. 文 章===================
請問各位,

腦袋突然打結, 想不透一個問題

我有20個欄位(例如 'A', 'B', 'C'......)
我定義了一個
const myFD : Array[0..19] of string = ('A', 'B', 'C', 'D',.....)

而我想寫一支 function 把20組值寫入到這些欄位中(欄位有 string, boolean, integer)
function InsertData(?1)
var i : integer;
begin
Query1.Append;
for i := low(myFD) to high(myFD) do
begin
Query1.FieldByName(myFD[i]).Value := ?2
end;
Query1.Post;
end;

請問, ?1 及 ?2 我該如何定義, 才能達成
原先我用 Record 方式
例如
type
TmyFDRec = Record
A : string;
B : string;
C : Integer;
D : boolean;
....
end;

但 ?1 我放進去 myValue : TmyFDRec 是可以的, 但 ?2 卻不知要如何表達語法

雖然我可以這麼下,
function InsertData(a: string; b:string; c:integer; d:boolean; e:xxxxx......)
begin
Query1.FieldByName('A').Value := a;
Query1.FieldByName('B').Value := b;
Query1.FieldByName('C').Value := c;
...
end;

但要寫一大串, 有沒有更精簡的下法, 感恩...
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#3 引用回覆 回覆 發表時間:2019-01-15 00:46:54 IP:118.169.xxx.xxx 未訂閱
感謝提點, 不過要用if判斷, 我可能直接寫20個Query 指定, 在效能上可能還比較好一點哦!
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#4 引用回覆 回覆 發表時間:2019-01-24 12:28:05 IP:118.169.xxx.xxx 未訂閱
搜尋網路沒找到相關的討論, 但我相信應該是有其他方法, 目前就只能一個一個指定, 雖然要寫一大堆, 暫時先結案
tick228
高階會員


發表:1
回覆:47
積分:104
註冊:2003-11-03

發送簡訊給我
#5 引用回覆 回覆 發表時間:2019-01-24 14:44:29 IP:39.10.xxx.xxx 未訂閱
可透過 RTTI 功能, 來達到你的需求.
參考此網頁
https://stackoverflow.com/questions/23823731/access-all-elements-of-a-record-using-rtti

不過, 最大的問題, 是會嚴重影响執行效率.

在寫作方便性和執行效率的選取, 就看個人的選擇了.
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#6 引用回覆 回覆 發表時間:2019-01-24 20:51:24 IP:1.170.xxx.xxx 未訂閱
感謝提供來源, 其實我只是看能不能少寫一點code而已, 而不用一個個指定很麻煩, 如果之後還有增刪結構, 還要再改, 很麻煩!
chenyk
高階會員


發表:14
回覆:95
積分:171
註冊:2002-07-08

發送簡訊給我
#7 引用回覆 回覆 發表時間:2019-11-12 16:51:06 IP:211.75.xxx.xxx 未訂閱
或許可以用 .Fields[i].DataType 先判斷欄位的資料型態,再依型態別來處理,
彈性應該比列出所有欄位來得好

參考資料:
http://delphi.ktop.com.tw/board.php?cid=30&fid=66&tid=83783
系統時間:2024-04-27 20:52:05
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!