1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
function FindChild(Name: string ; Parent: TFmxObject): TFmxObject; var I: Integer ; Child: TFmxObject; begin Result := nil ; if (Parent <> nil ) and (Parent . Children <> nil ) then begin for I := Parent . Children . Count - 1 downto 0 do begin Child := TFmxObject(Parent . Children[I]); if Child . Name = Name then begin Result := Child; break; end ; end ; end ; end ; procedure FreeAndNilFmxObject( var Obj: TFmxObject); begin if Obj <> nil then begin Obj . Parent := nil ; Obj . SetRoot( nil ); FreeAndNil(Obj); end ; end ; var AIndex : Integer = 0 ; procedure TForm1 . Button1Click(Sender: TObject); var A: TButton; B: TFmxObject; begin ReportMemoryLeaksOnShutdown := True ; B := FindChild( 'A' , Self); if (B <> nil ) and (B is TButton) then begin A := B as TButton; B := nil ; // //后面 FormDestroy 的代码不一样,但效果一样。 FreeAndNilFmxObject(TFmxObject(A)); end ; // if (B <> nil) and (B is TButton) then // begin // A := B as TButton; // B.Parent := nil; // B.SetRoot(nil); // B := nil; // FreeAndNil(A); // end; inc(AIndex); A := TButton . Create( nil ); A . Name := 'A' ; A . Position . Y := AIndex * A . Height; A . Text := '按钮' + AIndex . ToString; A . Parent := Self; end ; procedure TForm1 . FormDestroy(Sender: TObject); var B: TFmxObject; begin ReportMemoryLeaksOnShutdown := True ; B := FindChild( 'A' , Self); //这样写更简单些。 FreeAndNilFmxObject(B); end ; |
http://www.delphi6.com/thread-68.htm