Delphi XE10 对于对象的生命周期管理,WINDOWS 底下和 Android 底下不一样 |
|
pcplayer99
尊榮會員 發表:146 回覆:790 積分:632 註冊:2003-01-21 發送簡訊給我 |
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 發送簡訊給我 |
继续试验:
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 上面显示的条目。 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |