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

請問要如何將元件弄成陣列的樣子?

答題得分者是:andersonhsieh
c905165
中階會員


發表:50
回覆:120
積分:54
註冊:2002-09-29

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-11-13 03:36:37 IP:203.204.xxx.xxx 未訂閱
比如說,當label很多的時候,一字排開很壯觀,我們想要將這一些label設它的屬性,比如說設caption為1,2,3,.....,能不能用一個迴圈就做到這一些事? 像是: for x=1 to 100 begin label[x].caption=inttostr(x); end; 當然這是我瞎想的,但能不能做到呢?要怎麼做到呢?
------
有困難就是能力不足,有麻煩就是方法不對... 劣者總是遇到困難,也時常出現麻煩
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-11-13 08:59:35 IP:147.8.xxx.xxx 未訂閱
There are many ways to do it, e.g. using the Tag property, FindComponent, create components and store them as a list/array, loop through all components on the form, etc.
j := 1;
for i := 0 to Components.Count-1 do begin
    if Components[i] is TLabel then begin
        TLabel(Components[i]).Caption := IntToStr(j);
        inc(j);
    end;
end;
c905165
中階會員


發表:50
回覆:120
積分:54
註冊:2002-09-29

發送簡訊給我
#3 引用回覆 回覆 發表時間:2002-11-19 09:52:47 IP:163.28.xxx.xxx 未訂閱
您好,Components沒有.Count這個變數或方法耶? 另外,如果這一些元件,我把它們弄成二維的樣子,而只想要將第一排或第三排做設定,要怎麼做呢?也就是說,是有條件的來做這一些動作。謝謝。
------
有困難就是能力不足,有麻煩就是方法不對... 劣者總是遇到困難,也時常出現麻煩
andersonhsieh
版主


發表:33
回覆:531
積分:439
註冊:2002-06-10

發送簡訊給我
#4 引用回覆 回覆 發表時間:2002-11-19 10:07:57 IP:211.20.xxx.xxx 未訂閱
可以試試用物件陣列的方式試試,例如 var tt : array[1..10, 1..10] of TButton @@~~飛翔在天際的精靈~~@@ 發表人 - andersonhsieh 於 2002/11/19 10:09:22
------
@@~~飛翔在天際的精靈~~@@
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#5 引用回覆 回覆 發表時間:2002-11-19 10:12:30 IP:147.8.xxx.xxx 未訂閱
引言: 您好,Components沒有.Count這個變數或方法耶? sorry, it should be ComponentCount 另外,如果這一些元件,我把它們弄成二維的樣子,而只想要將第一排或第三排做設定,要怎麼做呢?也就是說,是有條件的來做這一些動作。謝謝。 <> class="code">for i := 0 to ComponentCount-1 do begin if (Components[i].Tag in [1,3]) then TLabel(Components[i]).Caption := IntToStr(j);
andersonhsieh
版主


發表:33
回覆:531
積分:439
註冊:2002-06-10

發送簡訊給我
#6 引用回覆 回覆 發表時間:2002-11-19 13:39:41 IP:211.20.xxx.xxx 未訂閱
引言: 可以試試用物件陣列的方式試試,例如 var tt : array[1..10, 1..10] of TButton @@~~飛翔在天際的精靈~~@@ 發表人 - andersonhsieh 於 2002/11/19 10:09:22
再給你一段sample看看 var Form1: TForm1; Labels: array[0..9, 0..9] of TLabel; implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); var i, j: Integer; lb: TLabel; begin for i := Low(Labels) to High(Labels) do begin for j := Low(Labels[i]) to High(Labels[i]) do begin lb := TLabel.Create(self); lb.Parent := Self; lb.Caption := IntToStr(StrToInt(IntToStr(i) IntToStr(j)) 1); lb.Width := 50; lb.Height := 20; lb.Left := j * lb.Width 5; lb.Top := i * lb.Height 5; Labels[i, j] := lb; end; end; end; @@~~飛翔在天際的精靈~~@@
------
@@~~飛翔在天際的精靈~~@@
c905165
中階會員


發表:50
回覆:120
積分:54
註冊:2002-09-29

發送簡訊給我
#7 引用回覆 回覆 發表時間:2002-11-26 23:31:14 IP:203.204.xxx.xxx 未訂閱
這個部份完全已經知道怎麼用了,也已經做成功了。現在問題來了, 因為這一些元件是動態的,而,要為這一些元件建立event的話呢? 因為如果事先建好,比如說事先建好 label[2,4].onClick 這個程序,編譯時會發生錯誤。 因為我的元件很多,「看起來很壯觀」,而我只是要讓其中的某一些(假設是第三排,第二個到第十個)元件有 event 的功能。程式碼要寫在何處呢?
------
有困難就是能力不足,有麻煩就是方法不對... 劣者總是遇到困難,也時常出現麻煩
andersonhsieh
版主


發表:33
回覆:531
積分:439
註冊:2002-06-10

發送簡訊給我
#8 引用回覆 回覆 發表時間:2002-11-26 23:38:12 IP:211.23.xxx.xxx 未訂閱
例如己先定了一個procedure如下 procedure Label1Click(Sender: TObject); 再用如下方法做 label[2,4].onClick := Label1Click; @@~~飛翔在天際的精靈~~@@
------
@@~~飛翔在天際的精靈~~@@
c905165
中階會員


發表:50
回覆:120
積分:54
註冊:2002-09-29

發送簡訊給我
#9 引用回覆 回覆 發表時間:2002-12-03 05:17:54 IP:203.204.xxx.xxx 未訂閱
哦,原來是指定一個現有的「程序」過去,居然沒有想到。 對了,後來又發現一個問題!! 如果我「現有」一個 Label10 而且這個元件放在 groupbox 之內,執行以下程式碼,會造成這一些動態產生的 label 不會「屬於」這個 groupbox,而且根本不會對齊這個 label10。如果 label10 不放在 groupbox 之內就不會出現問題了。這怎麼辦呢? 要怎麼讓這一些動態產生出來的元件「屬於」到這個 groupbox 之內? for i:=1 to 5 do begin lb:=TLabel.Create(self); lb.Parent:=self; lb.Caption := inttostr(i); lb.Width:=label10.Width; lb.Height:=label10.Height; lb.Left:=label10.Left; lb.Top:=label10.Top ( 5 30*i); Labels[i, 1] := lb; end; 再問一個問題,忽然遇到了,假設我根據上述的方法,指定「程序」(或者是稱為副程式)給一個動態產生的物件。比如說 edit[1,2].onreturnpressed:=labelab_enterpress; edit[2,2].onreturnpressed:=labelab_enterpress; edit[3,2].onreturnpressed:=labelab_enterpress; 假設labelab_enterpress裡面有一段程式碼label1.caption:=edit[x,y].text; 現在問題來了,我每一個都讓它去指定相同的副程式。當我按enter時,如果我在edit[1,2]按下enter,我希望它會將 edit[1,2]的.text傳到label1.caption. 而如果我在 edit[2,2]輸入並按 enter ,我希望它會 label1.caption:=edit[2,2].text;依此類推edit[x,y]。 現在的問題是,如果我將每一個edit[x,y].onreturnpressed:=到同一個副程式,就會造成沒有辦法判斷是從那一個edit來按 enter,我這一個 label1.caption 就不知道要接收誰的字串。 反之,如果我建立了很多個副程式,來讓每一個edit[x,y].onreturnpressed:=指定到不同的副程式,那不用說,是很笨的方式,因為,假設有上百個副程式呢? 發表人 - c905165 於 2002/12/03 05:56:46
------
有困難就是能力不足,有麻煩就是方法不對... 劣者總是遇到困難,也時常出現麻煩
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#10 引用回覆 回覆 發表時間:2002-12-03 09:40:04 IP:147.8.xxx.xxx 未訂閱
引言: 哦,原來是指定一個現有的「程序」過去,居然沒有想到。 對了,後來又發現一個問題!! 如果我「現有」一個 Label10 而且這個元件放在 groupbox 之內,執行以下程式碼,會造成這一些動態產生的 label 不會「屬於」這個 groupbox,而且根本不會對齊這個 label10。如果 label10 不放在 groupbox 之內就不會出現問題了。這怎麼辦呢? 要怎麼讓這一些動態產生出來的元件「屬於」到這個 groupbox 之內? for i:=1 to 5 do begin lb:=TLabel.Create(self); lb.Parent:=groupbox1; lb.Caption := inttostr(i); lb.Width:=label10.Width; lb.Height:=label10.Height; lb.Left:=label10.Left; lb.Top:=label10.Top ( 5 30*i); Labels[i, 1] := lb; end; 再問一個問題,忽然遇到了,假設我根據上述的方法,指定「程序」(或者是稱為副程式)給一個動態產生的物件。比如說 edit[1,2].onreturnpressed:=labelab_enterpress; edit[2,2].onreturnpressed:=labelab_enterpress; edit[3,2].onreturnpressed:=labelab_enterpress; 假設labelab_enterpress裡面有一段程式碼label1.caption:=edit[x,y].text; 現在問題來了,我每一個都讓它去指定相同的副程式。當我按enter時,如果我在edit[1,2]按下enter,我希望它會將 edit[1,2]的.text傳到label1.caption. 而如果我在 edit[2,2]輸入並按 enter ,我希望它會 label1.caption:=edit[2,2].text;依此類推edit[x,y]。 現在的問題是,如果我將每一個edit[x,y].onreturnpressed:=到同一個副程式,就會造成沒有辦法判斷是從那一個edit來按 enter,我這一個 label1.caption 就不知道要接收誰的字串。 反之,如果我建立了很多個副程式,來讓每一個edit[x,y].onreturnpressed:=指定到不同的副程式,那不用說,是很笨的方式,因為,假設有上百個副程式呢? You may want to make use of the Sender parameter passed in the event handler. 發表人 - c905165 於 2002/12/03 05:56:46
ericyu
一般會員


發表:2
回覆:18
積分:24
註冊:2002-03-13

發送簡訊給我
#11 引用回覆 回覆 發表時間:2002-12-03 10:21:55 IP:61.57.xxx.xxx 未訂閱
引言: 再問一個問題,忽然遇到了,假設我根據上述的方法,指定「程序」(或者是稱為副程式)給一個動態產生的物件。比如說 edit[1,2].onreturnpressed:=labelab_enterpress; edit[2,2].onreturnpressed:=labelab_enterpress; edit[3,2].onreturnpressed:=labelab_enterpress; 假設labelab_enterpress裡面有一段程式碼label1.caption:=edit[x,y].text; 現在問題來了,我每一個都讓它去指定相同的副程式。當我按enter時,如果我在edit[1,2]按下enter,我希望它會將 edit[1,2]的.text傳到label1.caption. 而如果我在 edit[2,2]輸入並按 enter ,我希望它會 label1.caption:=edit[2,2].text;依此類推edit[x,y]。 現在的問題是,如果我將每一個edit[x,y].onreturnpressed:=到同一個副程式,就會造成沒有辦法判斷是從那一個edit來按 enter,我這一個 label1.caption 就不知道要接收誰的字串。 反之,如果我建立了很多個副程式,來讓每一個edit[x,y].onreturnpressed:=指定到不同的副程式,那不用說,是很笨的方式,因為,假設有上百個副程式呢? You may want to make use of the Sender parameter passed in the event handler.
補充一下, 就像這樣: label1.caption := TEdit(Sender).Text;
c905165
中階會員


發表:50
回覆:120
積分:54
註冊:2002-09-29

發送簡訊給我
#12 引用回覆 回覆 發表時間:2002-12-03 12:17:25 IP:203.204.xxx.xxx 未訂閱
parent是解決了。但是, 我試了一些方法,但還是不行,最後的一個方法是這樣,錯在那兒呢?應該怎麼做才對? 這是一個程序: for i:=2 to maxbedno do begin comboboxs[i,5].items.assign(comboboxs[1,5].items); comboboxs[i,8].items.assign(comboboxs[1,8].items); edits[i,2].OnReturnPressed:= Edit3ReturnPressed;//就是這一行 end; 這是另一個程序: procedure TForm4.Edit3ReturnPressed(Sender: TObject); begin beep; edit1.text:=Tedit(sender).text; end;
------
有困難就是能力不足,有麻煩就是方法不對... 劣者總是遇到困難,也時常出現麻煩
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#13 引用回覆 回覆 發表時間:2002-12-03 12:23:27 IP:147.8.xxx.xxx 未訂閱
引言:parent是解決了。但是, 我試了一些方法,但還是不行,最後的一個方法是這樣,錯在那兒呢?應該怎麼做才對? 這是一個程序: for i:=2 to maxbedno do begin comboboxs[i,5].items.assign(comboboxs[1,5].items); comboboxs[i,8].items.assign(comboboxs[1,8].items); edits[i,2].OnReturnPressed:= Edit3ReturnPressed;//就是這一行 end; 這是另一個程序: procedure TForm4.Edit3ReturnPressed(Sender: TObject; var Key: char); begin if Key=#13 then begin beep; edit1.text:=Tedit(sender).text; Key := #0; end; end;
c905165
中階會員


發表:50
回覆:120
積分:54
註冊:2002-09-29

發送簡訊給我
#14 引用回覆 回覆 發表時間:2002-12-03 12:33:08 IP:203.204.xxx.xxx 未訂閱
現在變成了「//就是這一行」出現問題了,編譯時發生 parameter lists differ 的錯誤。
------
有困難就是能力不足,有麻煩就是方法不對... 劣者總是遇到困難,也時常出現麻煩
andersonhsieh
版主


發表:33
回覆:531
積分:439
註冊:2002-06-10

發送簡訊給我
#15 引用回覆 回覆 發表時間:2002-12-03 12:44:20 IP:211.20.xxx.xxx 未訂閱
借問一下我怎麼找不到OnReturnPressed這一個EVENT @@~~飛翔在天際的精靈~~@@
------
@@~~飛翔在天際的精靈~~@@
c905165
中階會員


發表:50
回覆:120
積分:54
註冊:2002-09-29

發送簡訊給我
#16 引用回覆 回覆 發表時間:2002-12-03 12:46:52 IP:203.204.xxx.xxx 未訂閱
有啦,有這個event
------
有困難就是能力不足,有麻煩就是方法不對... 劣者總是遇到困難,也時常出現麻煩
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#17 引用回覆 回覆 發表時間:2002-12-03 13:45:35 IP:147.8.xxx.xxx 未訂閱
So it is not a standard TEdit?
c905165
中階會員


發表:50
回覆:120
積分:54
註冊:2002-09-29

發送簡訊給我
#18 引用回覆 回覆 發表時間:2002-12-06 07:22:13 IP:203.204.xxx.xxx 未訂閱
它是我們宣告出來的元件,如果您有從上面看下來就會看到了 只是現在不知道要如何從程式去「示別」它。 比如說我指定它的 > 這要怎麼解決呢? 發表人 -
------
有困難就是能力不足,有麻煩就是方法不對... 劣者總是遇到困難,也時常出現麻煩
c905165
中階會員


發表:50
回覆:120
積分:54
註冊:2002-09-29

發送簡訊給我
#19 引用回覆 回覆 發表時間:2002-12-06 07:41:05 IP:203.204.xxx.xxx 未訂閱
能不能給一個範例,假設是5*5 的動態產生的元件,如下: edit[1,1],label[1,2],label[1,3],label[1,4],label[1,5] edit[2,1],label[2,2],label[2,3],label[2,4],label[2,5] edit[3,1],label[3,2],label[3,3],label[3,4],label[3,5] edit[4,1],label[4,2],label[4,3],label[4,4],label[4,5] edit[5,1],label[5,2],label[5,3],label[5,4],label[5,5] 假設我在第 edit[3,1]輸入一個值,按enter,label[3,2]就顯示乘上二的值,label[3,3]就顯示乘上三的值,依此類推。 有例子就比較好理解。
------
有困難就是能力不足,有麻煩就是方法不對... 劣者總是遇到困難,也時常出現麻煩
andersonhsieh
版主


發表:33
回覆:531
積分:439
註冊:2002-06-10

發送簡訊給我
#20 引用回覆 回覆 發表時間:2002-12-06 20:17:18 IP:211.23.xxx.xxx 未訂閱
那是因為你OnReturnPressed和Edit3ReturnPressed兩個的宣告不同造成的 如OnReturnPressed共需要3個參數,而你卻將2個參數的Edit3ReturnPressed指給它,這樣就會有錯誤 @@~~飛翔在天際的精靈~~@@
------
@@~~飛翔在天際的精靈~~@@
系統時間:2024-04-20 11:35:01
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!