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

Delphi XE10 对于对象的生命周期管理,WINDOWS 底下和 Android 底下不一样

 
pcplayer99
尊榮會員


發表:146
回覆:790
積分:632
註冊:2003-01-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2015-12-10 18:43:20 IP:120.236.xxx.xxx 訂閱
for I := 0 to 9 do
begin
UI := TFrameDownloadItem.Create(Self);
UI.Name := 'FrameDownloadItemA' IntToStr(i);
UI.Parent := LayoutDownloadTask;
UI.Align := TAlignLayout.Top;
UI.Height := 40;
UI.ShowFileName('FrameDownloadItemA' IntToStr(i));

end;


这里的 TFrameDownloadItem 是一个 TFrame。创建它,放到一个 Layout 上面。做成一个列表。

然后,清除这个列表:

for i := LayoutDownloadTask.ChildrenCount -1 downto 0 do
begin
if LayoutDownloadTask.Children[i] is TFrameDownloadItem then
begin
O := TFrameDownloadItem(LayoutDownloadTask.Children[i]);

LayoutDownloadTask.RemoveObject(LayoutDownloadTask.Children[i]);
O.Free;
end;
end;


上面的代码,在 WINDOWS 底下,之行完毕以后,又可以重复创建的代码。

但是,在 Android 底下,Free 之后,再次执行上述循环创建列表的代码时,就会弹出 "A Component named FrameDownloadItemA0 already exists" 的 exception.

也就是说,在 Android 底下,一个 Component 被 Free 后,那个名字还被占用着。而在 Windows 底下,不会有这样的情况。不一致,这是个问题。
pcplayer99
尊榮會員


發表:146
回覆:790
積分:632
註冊:2003-01-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2015-12-10 19:22:19 IP:120.236.xxx.xxx 訂閱
继续试验:

for i := Self.ComponentCount -1 downto 0 do
begin
if Self.Components[i] is TFrameDownloadItem then
begin
O := TFrameDownloadItem(Self.Components[i]);
Self.RemoveComponent(O);
end;

end;

这段代码,在 windows 底下管用。在 Android 底下,Object 的确是释放了。再次 Create 的时候,不会提示有同名的了。但是,Form 上的列表还在。


然后,再次加上:

for i := LayoutDownloadTask.ChildrenCount -1 downto 0 do
begin
if LayoutDownloadTask.Children[i] is TFrameDownloadItem then
begin
O := TFrameDownloadItem(LayoutDownloadTask.Children[i]);

LayoutDownloadTask.RemoveObject(LayoutDownloadTask.Children[i]);
O.Free;
end;
end;

在安卓底下,这两段都要用上,才能够真正清除掉 LayoutDownloadTask 上面显示的条目。
系統時間:2024-11-21 21:00:04
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!