請問一下如何得到集合的個數?? |
答題得分者是:hagar
|
seaturn99
版主 發表:69 回覆:427 積分:214 註冊:2003-08-25 發送簡訊給我 |
|
huangeider
高階會員 發表:288 回覆:492 積分:231 註冊:2003-02-26 發送簡訊給我 |
procedure TForm1.FormActivate(Sender: TObject);
var I,j : Integer;
begin
j:=0;
For I:=0 to Form1.ComponentCount-1 do
begin
if Form1.Components[I].ClassType=Tbutton then
j:=j 1;
end;
label1.caption:='有' inttostr(j) '個 TBUTTON';
end; 「堅持」從洗馬桶做起
Aric
|
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
|
solnone
中階會員 發表:2 回覆:97 積分:69 註冊:2003-05-06 發送簡訊給我 |
// 以 TAlignSet 為例
procedure TForm1.Button1Click(Sender: TObject);
var
align: TAlignSet;
begin
align := [];
// 是否為空 set
if align = [] then
Memo1.Lines.Add('[]');
// 加入 alTop, alRight 這二個 element
include( align, [alTop, alRight]);
// set 中是否有 alRight 這個 element
if alRight in align then
Memo1.Lines.Add('Have alRight');
end;
|
solnone
中階會員 發表:2 回覆:97 積分:69 註冊:2003-05-06 發送簡訊給我 |
// sorry, include 寫錯了!要一個一個加入
// 以 TAlignSet 為例
procedure TForm1.Button1Click(Sender: TObject);
var
align: TAlignSet;
begin
align := [];
// 是否為空 set
if align = [] then
Memo1.Lines.Add('[]');
// 加入 alTop, alRight 這二個 element
include(align, alTop);
include(align, alRight);
// set 中是否有 alRight 這個 element
if alRight in align then
Memo1.Lines.Add('Have alRight');
end;
|
elase
一般會員 發表:4 回覆:23 積分:10 註冊:2003-06-05 發送簡訊給我 |
一般來說我們不會知道集合的個數
要處理的時候會用 High() 及 Low() 這二個函數
利用 For 迴圈一個一個處理
如果想知道集合對應的值可以用 Ord()
EX: procedure TForm1.Button1Click(Sender: TObject); type Rainbow = (Red,Orange,Yellow,Green,Bule,Indigo,Purple); var i:Rainbow; //i 宣告為 Rainbow 型態 begin for i:= low(Rainbow) to high(Rainbow) do ShowMessage(inttostr(ord(i))); //因為用 Ord() 得到的值是 Integer 所以要轉換 end;輸出的結果會從 0 ~ 6 |
syntax
尊榮會員 發表:26 回覆:1139 積分:1258 註冊:2002-04-23 發送簡訊給我 |
引言: // sorry, include 寫錯了!要一個一個加入 // 以 TAlignSet 為例 procedure TForm1.Button1Click(Sender: TObject); var align: TAlignSet; begin align := []; // 是否為空 set if align = [] then Memo1.Lines.Add('[]'); // 加入 alTop, alRight 這二個 element include(align, alTop); include(align, alRight); // set 中是否有 alRight 這個 element if alRight in align then Memo1.Lines.Add('Have alRight'); end;align := align [alTop] [alRight]; |
speedup
資深會員 發表:19 回覆:259 積分:280 註冊:2003-07-04 發送簡訊給我 |
引言: 請問一下如何取得集合的個數,或是判斷此集合被 assign 值?? 不會要用每個 element 去 Check 吧??當及集合的元素範圍小於8可以用轉型為Byte,小於16可以轉型為word,delphi利用該形態的每一bit來表示該元素是否存於該集合之中 以下函數可偵測集合的元素範圍小於32的集合元素數量 function CalcSetCount(aSet:Cardinal):integer; var i :integer; begin result := 0 ; for i := 0 to 31 do if ((aSet shr i ) and $01)=$01 then inc(result); end;測試的程式碼 type TTestSet = (sOne, sTwo, sThree, sFour, sFive, sSix, sSeven,sEight,sNine); TMySet = set of TTestSet; procedure TForm1.Button1Click(Sender: TObject); var aSet:TMySet; begin aSet := [sOne,sThree]; showmessage(InttoStr(CalcSetCount(word(aSet)))); end;混心雜欲 棄修身~唉
------
唉~ |
seaturn99
版主 發表:69 回覆:427 積分:214 註冊:2003-08-25 發送簡訊給我 |
引言: 當及集合的元素範圍小於8可以用轉型為Byte,小於16可以轉型為word,delphi利用該形態的每一bit來表示該元素是否存於該集合之中 以下函數可偵測集合的元素範圍小於32的集合元素數量Sorry!! 上禮拜受訓,所以上禮拜沒有辦法整理測試 .. 今天測試後受益良多 .. 不過,完全命中我的問題是還是 hager ,經過我的測試 ..function CalcSetCount(aSet:Cardinal):integer; var i :integer; begin result := 0 ; for i := 0 to 31 do if ((aSet shr i ) and $01)=$01 then inc(result); end;測試的程式碼type TTestSet = (sOne, sTwo, sThree, sFour, sFive, sSix, sSeven,sEight,sNine); TMySet = set of TTestSet; procedure TForm1.Button1Click(Sender: TObject); var aSet:TMySet; begin aSet := [sOne,sThree]; showmessage(InttoStr(CalcSetCount(word(aSet)))); end;混心雜欲 棄修身~唉 function card(var tar; size: integer): integer; // Returns the number of bits set in the Size bytes starting from Tar. const // nibble table Ca: array[0..15] of integer = (0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4); var ab: TbyteArray absolute tar; j: integer; begin result := 0; for j := 0 to size - 1 do begin inc(result, Ca[ab[j] and $F] Ca[ab[j] shr 4]); end; end;Card 這個 function 可以傳回 Set 的個數,經我測試 69 個,亦可正確顯示, Speedup 的解法有個數上的限制.. huangeider 可能誤解了我的意思 .. solnone 提供一個簡單判斷空集合方法(= []); elase 提供一個方法判斷集合的上下界; 感謝各位熱心回答,使我受益良多 ... 不過 Card Function 的演算法,我有一點看不太懂.. 可否請看懂的人解釋一下 .. nibble table 的作用為何?? |
speedup
資深會員 發表:19 回覆:259 積分:280 註冊:2003-07-04 發送簡訊給我 |
引言: Ca: array[0..15] of integer = (0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 不過 Card Function 的演算法,我有一點看不太懂.. 可否請看懂的人解釋一下 .. nibble table 的作用為何??ca是一個轉換表,讓你的演算法可以快四倍 數值 二進位 幾個bit 0 0000 0 ca[0] 1 0001 1 ca[1] 2 0010 1 ca[2] 3 0011 2 ca[3] 4 0100 1 ca[4] ... 15 1111 4 ca[15]此演算法將傳入的byte(8bit) 再對拆成兩對(4bit =0~15),直接套對照表換算該組擁有幾個1 混心雜欲 棄修身~唉
------
唉~ |
seaturn99
版主 發表:69 回覆:427 積分:214 註冊:2003-08-25 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |