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

動態產生的物件如何判斷已經存在

答題得分者是:小傑克
douglas
初階會員


發表:24
回覆:42
積分:38
註冊:2008-03-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-03-30 16:35:31 IP:59.125.xxx.xxx 訂閱
請教: 動態產生的物件如何判斷已經存在?

以下是我動態產生的語法:
var vQRLabel: TQRLabel;

for i := 1 to ADOQuery1.RecordCount do
begin
vQRLabel := TQRLabel.Create(QRBand2); //QRBand2: Page Footer
vQRLabel.Name := 'qrlb' IntToStr(i);
另外設定了: Left, Top, Caption
end;


因為想要重複利用已經建立過的物件
所以使用了判斷式, 不存在時才另外再建立:
if FindComponent('qrlb' IntToStr(i)) = nil then
begin
動態產生...
end;
但是此判斷式尚不能正常運作
已經產生過的QRLabel還是會判斷為 nil
請教各位大大, 我的問題點在哪邊?

----- 我是分隔線 -----
參考了資料之後, 我修改了以下部分:
for i := 1 to ADOQuery1.RecordCount do
begin
vQRLabel := TQRLabel.Create(self); //QRBand2 -> self
vQRLabel.Parent := QRBand2 //加入此行
vQRLabel.Name := 'qrlb' IntToStr(i);
另外設定了: Left, Top, Caption
end;

異動上述部份之後, FindComponent() 就能正常判斷了
請教原因為何?
編輯記錄
douglas 重新編輯於 2009-03-30 16:49:45, 註解 無‧
max5020
資深會員


發表:30
回覆:277
積分:321
註冊:2003-06-04

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-03-30 17:01:31 IP:59.120.xxx.xxx 訂閱
因為
if FindComponent('qrlb' IntToStr(i))
其實是
if Self.FindComponent('qrlb' IntToStr(i))
如果原程式不改的話,
就改用 if QRBand2.FindComponent('qrlb' IntToStr(i))
不過,
還是改了之後的用法比較OK
編輯記錄
max5020 重新編輯於 2009-03-30 17:13:12, 註解 無‧
max5020 重新編輯於 2009-03-30 17:13:34, 註解 無‧
max5020 重新編輯於 2009-03-30 17:14:56, 註解 無‧
小傑克
資深會員


發表:5
回覆:209
積分:357
註冊:2009-02-16

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-03-30 18:39:07 IP:59.112.xxx.xxx 訂閱
在可視物件中 xxx.Create(AOwner)  是指定誰擁有 xxx 物件的, ooo.FindComponent 這個function是尋找ooo所擁有的物件
xxx.Parent 是用來指定上層物件的, 因為可視物件需要繪圖, 必須指定parent , delphi 才知道要幫你把這個圖畫在哪邊

例如 一個form1 上面有一個panel

var o :TButton ; //一個動態按鈕

o := TButton.Create(Panel1);
o.Parent := Self ;
o.Name := 'x1';

結果是 Panel1.FindComponent('x1') 可以找到這個物件, 但是 Self.FindComponent('x1') 找不到
但是按鈕的圖會出現在 Self 上 也就是 Form1 上, Parent 跟Create (Aowner) 的owner差別在這邊
如果Parent 沒指定是怎樣呢? 那Button圖形就不會顯示, 因為delphi 不知道要把Button畫在哪裡
------
額有朝天骨,眼中有靈光
douglas
初階會員


發表:24
回覆:42
積分:38
註冊:2008-03-05

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-03-31 08:26:28 IP:59.125.xxx.xxx 訂閱
謝謝 max5020, 小傑克 兩位熱心答覆 ^_^
roviury
一般會員


發表:3
回覆:49
積分:15
註冊:2008-08-28

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-04-05 20:57:04 IP:203.186.xxx.xxx 訂閱
ps.
你既然利用 vQRLabel 作為物件的地址變數, 你只要檢查 assigned(vQRLabel) 就可以既準確又快速地 判斷動態物件存在
(全域變數)

或者是判別 vQRLabel 是否為 nil, 否的話表示有物件
編輯記錄
roviury 重新編輯於 2009-04-05 20:57:57, 註解 無‧
roviury 重新編輯於 2009-04-05 22:05:41, 註解 無‧
系統時間:2024-05-18 16:00:32
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!