陣列改用StringList |
尚未結案
|
amandaLi3
一般會員 ![]() ![]() 發表:1 回覆:4 積分:1 註冊:2005-06-27 發送簡訊給我 |
請教各位:
我怎麼將下面的陣列用法改成StringList?
找了很多文章,都說StringList也可以用Recored,可是怎麼用呢?
可否舉例說明?
type
myWacRec=Record
item : String;
price : real;
num : Integer;
end;
.
.
.
//若是StringList,下面怎麼改呢?
Var myAry : array of myWacRec;
begin
SetLength(myAry,10);
myAry[0].item = 'AAAA';
myAry[0].price = 20.9;
myAry[0].num = 10'
.
.
.
end; 謝謝!!
|
h@visli
資深會員 ![]() ![]() ![]() ![]() ![]() 發表:103 回覆:429 積分:431 註冊:2004-02-13 發送簡訊給我 |
pmyWacRec = ^myWacRec;
myWacRec=Record
item : String;
price : real;
num : Integer;
end; var
Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject);
var
ts: tstrings;
Rec: pmyWacRec;
begin
GetMem(Rec, SizeOf(Rec));
Rec.item := 'AAA';
Rec.price := 21.9;
Rec.num := 3;
ts := tstringlist.Create;
ts.AddObject(Rec.item, TObject(Rec));
end; ----------------------------
於Delphi K.Top之上
博采眾家之長, 奉獻綿薄之力
---------------------------
------
------------------------ 博采眾家之長,奉獻綿薄之力 ------------------------ |
amandaLi3
一般會員 ![]() ![]() 發表:1 回覆:4 積分:1 註冊:2005-06-27 發送簡訊給我 |
不好意思,再請教一下,放進去後,我該如何應用呢?
例如,我怎麼去找出item='1110',它的price/num的值呢?
是不是要用indexof找出它的位置,可是該怎麼寫... table t1:
item price num
---- ----- ----
1109 12.92 3
1110 10.53 1
1112 15.15 2 ---------------------------
type
pmyRec = ^myRec;
myRec=Record
item : String;
price : real;
num : Integer;
end; procedure TForm1.Button1Click(Sender: TObject);
var
ts: TstringList;
Rec: pmyRec;
begin
ts := tstringlist.Create;
GetMem(Rec, SizeOf(Rec)); --->這裡設定size,需要依t1的列數決定嗎?
with q1 do
begin
Close;
SQL.Text := 'Select item_id ,price,qty From t1 ';
Open;
While not eof do
begin
Rec.item := FieldByName('item_id').AsString;
Rec.price := FieldByName('price').AsFloat;
Rec.num := FieldByName('qty').AsInteger;
ts.AddObject(Rec.item, TObject(Rec));
next;
end;
<再來怎麼搜尋資料呢?>
ts.Free;
end;
end; 謝謝!!
|
h@visli
資深會員 ![]() ![]() ![]() ![]() ![]() 發表:103 回覆:429 積分:431 註冊:2004-02-13 發送簡訊給我 |
type pmyRec = ^myRec; myRec=Record item : String; price : real; num : Integer; end; procedure TForm1.Button1Click(Sender: TObject); var ts: TstringList; Rec, freeRec: pmyRec; Lable_price: real; i: integer; begin ts := tstringlist.Create; GetMem(Rec, SizeOf(Rec)); --->這裡設定size,需要依t1的列數決定嗎? //不需要,與t1的列數無關 with q1 do begin Close; SQL.Text := 'Select item_id ,price,qty From t1 '; Open; While not eof do begin Rec.item := FieldByName('item_id').AsString; Rec.price := FieldByName('price').AsFloat; Rec.num := FieldByName('qty').AsInteger; ts.AddObject(Rec.item, TObject(Rec)); next; end; <再來怎麼搜尋資料呢?> Lable_price := pmyRec(ts.Objects[2]).price; //ts釋放之前記得先把對應的Object(即pmyRec所指內存給釋放了) for i := ts.Count - 1 downto 0 do begin freeRec := pmyRec(ts.Objects[i]); ts.Objects[i] := nil; FreeMem(FreeRec, SizeOf(freeRec)); end; ts.Free; end; end;---------------------------- 於Delphi K.Top之上 博采眾家之長, 奉獻綿薄之力 --------------------------- 發表人 - h@visli 於 2005/09/29 18:24:02
------
------------------------ 博采眾家之長,奉獻綿薄之力 ------------------------ |
amandaLi3
一般會員 ![]() ![]() 發表:1 回覆:4 積分:1 註冊:2005-06-27 發送簡訊給我 |
|
h@visli
資深會員 ![]() ![]() ![]() ![]() ![]() 發表:103 回覆:429 積分:431 註冊:2004-02-13 發送簡訊給我 |
引言: 不好意思,我表達的不夠清楚 我想知道怎麼運用index... 因為我只知道item,所以必須靠著item去找出它的位置,再去找出price //我怎麼知道是在2這個位置呢? Lable_price := pmyRec(ts.Objects[2]).price; 以上,謝謝!!我不清楚你的具體應用,如果你程序中是要把這個TStrings顯示出來的話,例如運用了TListBox等可視化組件,那麼就很簡單了,直接可以取ListBox1.ItemIndex為當前選擇的Index。 而如果你程序中并沒有把這個TStrings顯示出來的話,要在ts中進行定位,就需要循環查找比較了: [code] for i := ts.Count - 1 downto 0 do begin if pmyRec(ts.Objects[i]).item = 'AAA' then begin _price := pmyRec(ts.Objects[i]).price; break; end; end; ---------------------------- 於Delphi K.Top之上 博采眾家之長, 奉獻綿薄之力 ---------------------------
------
------------------------ 博采眾家之長,奉獻綿薄之力 ------------------------ |
amandaLi3
一般會員 ![]() ![]() 發表:1 回覆:4 積分:1 註冊:2005-06-27 發送簡訊給我 |
|
h@visli
資深會員 ![]() ![]() ![]() ![]() ![]() 發表:103 回覆:429 積分:431 註冊:2004-02-13 發送簡訊給我 |
引言: 了解,謝謝!! 我以為也可以像一般StringList一樣用indexOf(),就可以找出他的位置了 因為料號資料量大,所以我想先將符合條件的料號找出來,將其金額/數量都先放進陣列 才不用每次都進資料庫做select,來找金額或數量。這樣的話,倒不如直接采用數組(臺灣叫陣列)的形式, 而不用再使用TStrings: procedure TForm1.Button1Click(Sender: TObject); type myRec=Record item : String; price : real; num : Integer; end; var ArrRec: array of myRec; L: integer; begin Q1.SQL.Clear; Q1.SQL.Add('select count(*) from t1'); Q1.Open; L := Q1.Fields[0].AsInteger; if L = 0 then exit; //退出 SetLength(ArrRec, L); Q1.SQL.Clear; Q1.SQL.Add('Select item_id ,price,qty From t1'); Q1.Open; for L := 0 to Q1.RecordCount - 1 do begin ArrRec[L].item := Q1.FieldByName('item_id').AsString; ArrRec[L].price := Q1.FieldByName('price').AsFloat; ArrRec[L].num := Q1.FieldByName('qty').AsInteger; Q1.Next; end; //......// end;---------------------------- 於Delphi K.Top之上 博采眾家之長, 奉獻綿薄之力 --------------------------- 發表人 - h@visli 於 2005/09/30 15:42:42
------
------------------------ 博采眾家之長,奉獻綿薄之力 ------------------------ |
amandaLi3
一般會員 ![]() ![]() 發表:1 回覆:4 積分:1 註冊:2005-06-27 發送簡訊給我 |
|
h@visli
資深會員 ![]() ![]() ![]() ![]() ![]() 發表:103 回覆:429 積分:431 註冊:2004-02-13 發送簡訊給我 |
引言: 謝謝 h@visli.... 我原本是用陣列的,想說看看有沒有辦法利用indexOf一行解決... 看樣子,還是不能偷懶的
------
------------------------ 博采眾家之長,奉獻綿薄之力 ------------------------ |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |