動態元件名稱 |
|
weber
初階會員 ![]() ![]() 發表:24 回覆:56 積分:26 註冊:2002-03-13 發送簡訊給我 |
|
hagar
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
|
weber
初階會員 ![]() ![]() 發表:24 回覆:56 積分:26 註冊:2002-03-13 發送簡訊給我 |
|
tommyli0913
一般會員 ![]() ![]() 發表:9 回覆:19 積分:5 註冊:2004-02-02 發送簡訊給我 |
請問hagar先進:
因剛好也碰到類似的問題,雖這篇文章已久遠,但仍想問hagar先進一個問題,您的方法在靜態元件是可以的,但是在動態陣列元件上要如何使用呢? 我的動態陣列元件是 NewEdit[1] ~ NewEdit[20],但其"Name"並非一致性,如 NewEdit[1].Name:='RTest" , NewEdit[2].Name:="LTest",.....等等,當我想找"LTest"名稱的元件時,目前我是用for迴圈來找出我要的元件來,但是是否有像"FindComponent"函數可以直接找到並應用之呢?
|
hagar
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
您好, 用 FindComponent 也可以, 例:
var edt: TEdit; begin edt := FindComponent('LTest') as TEdit; if edt <> nil then ShowMessage('找到了 Name 為 LTest 的 Edit'); end;或者可以 Components 與 ComponentCount 搭配使用, 例: procedure TForm1.Button1Click(Sender: TObject); var i: integer; edt: TEdit; begin for i := 0 to Form1.ComponentCount - 1 do brgin if (Form1.Components[i] is TEdit) and (Form1.Componnts[i].Name = 'LTest' then begin edt := TEdit(Form1.Components[i]); // 找到了 Name 為 'LTest' 的 TEdit Break; // 找到了就不用再找下去了 end; end; end;-- 向 KTop 的弟兄們致敬! ![]() |
tommyli0913
一般會員 ![]() ![]() 發表:9 回覆:19 積分:5 註冊:2004-02-02 發送簡訊給我 |
hagar先進:
我的程式如下: private
NewEdit:array[1..3] of Tedit;
........... procedure TForm1.FormCreate(Sender: TObject);
var
i:integer;
const
pp:array[1..3] of string=('RTest','Ltest','PTest');
begin
for i:=1 to 3 do
begin
NewEdit[i]:=TEdit.Create(Owner);
NewEdit[i].Name :=pp[i];
NewEdit[i].Parent:=Form1;
NewEdit[i].Visible :=True;
NewEdit[i].Left :=10*i;
NewEdit[i].Top :=10*i;
NewEdit[i].Text :='TestWord' inttostr(i);
end;
end; procedure TForm1.Button1Click(Sender: TObject);
var
edt: TEdit;
begin
edt := FindComponent('RTest') as TEdit;
if edt <> nil then
ShowMessage('找到了 Name 為 LTest 的 Edit');
end; 上面的程式並無法找到RTest的元件說,目前我是用如下程式:
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
for i:=1 to 3 do
begin
if NewEdit[i]='RTest' then
begin
ShowMessage('找到了 Name 為 RTest 的 Edit');
break;
end;
end;
end;
但如此程式動態元件少倒還好,但元件多時,效率就不太好,今看到FindComponent函數實在興奮但卻不知如何用之??或有什麼方法或函數可以直接使用呢?
|
hagar
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
先了解一個概念, 以這句 Form1.FindComponent(AName: string) 來做說明
這句的意思是尋找 Onwer 為 Form1, 而 Name 屬性值為 AName 的 TComponent
再來看您的問題
procedure TForm1.FormCreate(Sender: TObject); var i: integer; const pp: array[1..3] of string = ('RTest', 'Ltest', 'PTest'); begin for i:=1 to 3 do begin NewEdit[i] := TEdit.Create(Owner); // 問題出在這句, 此時 NewEdit[i] 的 Owner 是 Form1 的 Owner, 那 Form1 的 Owner 是誰呢?是 TApplication, 您可以改成: NewEdit[i] := TEdit.Create(Self); 試試 // .. end; end; procedure TForm1.Button1Click(Sender: TObject); var edt: TEdit; begin edt := FindComponent('RTest') as TEdit; // 這句的 FindComponent 的用意是要找 Owner 為 Form1 且 Name 屬性值為 'RTest' 的 TComponent, 配合上面的問題點所在, 所以找不到了, 因 Name 屬性值為 'RTest' 的 TEdit 其 Owner 為 TApplication, 不是 Form1 了 if edt <> nil then ShowMessage('找到了 Name 為 LTest 的 Edit'); end;-- 向 KTop 的弟兄們致敬! ![]() |
tommyli0913
一般會員 ![]() ![]() 發表:9 回覆:19 積分:5 註冊:2004-02-02 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |