2016-02-17 61 views
1

我當前創建了兩個TLabels和一個TEdit動態地命名它們LblDesc + i,EdtAmount + i和LblUnit + i - 我每次添加這3個元素時迭代一個整數。元素中的數據僅用於模擬目的。 我現在的問題是刪除這三個對象。我試過免費和FreeAndNil,沒有運氣。 任何幫助,不勝感激。在Delphi中刪除TLabel

procedure TForm1.BtnAddClick(Sender: TObject); 
begin 
    LblDesc := TLabel.Create(Self); 
    LblDesc.Caption := 'Item '+IntToStr(i); 
    LblDesc.Name := 'LblDesc'+IntToStr(i); 
    LblDesc.Left := 16; 
    LblDesc.Top := 30 + i*30; 
    LblDesc.Width := 100; 
    LblDesc.Height := 25; 
    LblDesc.Parent := Self; 

    EdtAmount := TEdit.Create(Self); 
    EdtAmount.Text := IntToStr(i); 
    EdtAmount.Name := 'EdtAmount'+IntToStr(i); 
    EdtAmount.Left := 105; 
    EdtAmount.Top := 27 + i*30; 
    EdtAmount.Width := 60; 
    EdtAmount.Height := 25; 
    EdtAmount.Parent := Self; 

    LblUnit := TLabel.Create(Self); 
    LblUnit.Caption := 'Kg'; 
    LblUnit.Name := 'LblUnit'+IntToStr(i); 
    LblUnit.Left := 170; 
    LblUnit.Top := 30 + i*30; 
    LblUnit.Width := 50; 
    LblUnit.Height := 25; 
    LblUnit.Parent := Self; 

    i := i+1; 
end; 

procedure TForm1.BtnRemoveClick(Sender: TObject); 
begin 
    //Delete 

end; 
+1

什麼意思是「沒有運氣」?發生了什麼/沒有發生?無論如何,您需要顯示您實際嘗試用於刪除組件的代碼。 – MartynA

+1

歡迎來到StackOverflow。請顯示您是如何嘗試刪除這些控件的。在任何情況下,您都可以保留創建的控件的引用,或者使用['FindComponent'](http://docwiki.embarcadero.com/Libraries/XE7/en/System.Classes.TComponent.FindComponent)後來。 –

+0

我恢復了上次的編輯。如果您想要顯示最終工作的代碼,請將其作爲答案放在下面的空白處(標題*您的答案*)所屬的地方。回答你自己的問題在這裏完全可以接受。 –

回答

4

在我相關的一些成分的缺失,我已經解決了家長的組件設置爲nil問題,但它應該是不再因爲TControl的析構函數的情況下,過去的 - 如果所謂的 - 已經這樣做工作。

該組件應該通過簡單釋放它來刪除。

LblUnit.Free; 

如果你需要它的名字找到組件,使用System.Classes.TComponent.FindComponent或迭代Components名單上。

for i := ComponentCount-1 downto 0 do begin 
    if Components[i].Name = 'LblUnit'+IntToStr(i) then begin 
    //TControl(Components[i]).Parent := nil; {uncomment if you have the same issue I've had} 
    Components[i].Free; 
    end; 
    . . . 
end; 

EDIT

如果用於該組件的名稱施工'LblUnit'+IntToStr(i)索引i不位於的範圍內[0..ComponentCount-1],指數必須被相應地修改。

+0

這個我試過了,問題是它從來沒有找到組件。調試時,它會遍歷組件並永遠不會找到它。 – H4rdstyler

+0

也許'BtnAddClick'中的'i'大於'ComponentCount-1' – fantaghirocco

+0

在Componenets [j] .Name上的調試器表示:「Components ='['expected,但是找到文件結尾。我從1開始當第一個組件被添加時 – H4rdstyler

0

要刪除動態創建的組件,您必須有有效的引用。

您可以組織自己的數組或列表來保留您的對象或使用現有列表,例如 - Form.Components[],該對象的所有者爲Form

在你的名字找到與FindComponent需要的對象,或通過Components[]走,並與一些功能搜索組件第二種情況(名稱,類類型,標籤等)

0

該結束了工作在這個答案:

​​
+1

有沒有必要設置父爲零 – MBo

+0

你最好保持自己的陣列/您創建的標籤列表,然後可以在需要時循環使用。你可以使用'Owner'的'Components'''屬性或'Parent'''''''屬性來爲你管理它,但考慮到其他控件也在這些列表中。最好是在你自己的列表中隔離你想要的控件,你的代碼會更乾淨,更安全。 –

相關問題