FireMonkey 3D: Objecte dynamisch erstellen und wieder freigeben
-
Hallo.
Ich habe 100 TCube auf meinem TViewport3D verteilt und jedem eine Animation spendiert:
void __fastcall TForm1::Button1Click(TObject *Sender) { Randomize(); float distance = .5; for (int x=0;x<10;x++) { for (int y=0;y<10;y++) { TControl3D *cube = new TCube(this); cube->Parent = Dummy1; cube->SetSize(.3, .3, .3); cube->Position->Point = Point3D(-3 + x * distance, -3 + y * distance, 2); TFloatAnimation *animate = new TFloatAnimation(this); animate->Parent = cube; animate->PropertyName = "RotationAngle.X"; animate->StopValue = 180; animate->AutoReverse = true; animate->Duration = 1 + Random() * 2; animate->Loop = true; animate->Enabled = true; animate->Interpolation = TInterpolationType::itBack; } } }
Meine Fragen wäre jetzt:
1. Wer räumt hier wieder auf? Wird das automatisch sauber "delete" wenn ich das Programm beende oder muss ich doch noch etwas selber machen?
2. Wenn ich einen TCube auswählen würde, wie kann ich diesen sauber per Hand entfernen?
3. Wenn ich einen TCube auswählen würde, wie kann ich dessen hinzugefügte Animation entfernen?
-
Siehe FAQ, "Komponenten - zur Laufzeit erstellen ...".
Ist zwar VCL, dürfte in FMX aber wohl identisch sein.
-
Randomize();
Niemals mehrfach aufrufen! Also rein in den constructor.
1. Wer räumt hier wieder auf? Wird das automatisch sauber "delete" wenn ich das Programm beende oder muss ich doch noch etwas selber machen?
TControl3D *cube = new TCube(this);
Du legst mit *this* fest das der Owner deine Form ist.
Wird die Form zerstört wird, wird auch dein TCube zerstört.2. Wenn ich einen TCube auswählen würde, wie kann ich diesen sauber per Hand entfernen?
mit
delete DeinCube;3. Wenn ich einen TCube auswählen würde, wie kann ich dessen hinzugefügte Animation entfernen?
Beim erstellen der Animation den Cube als Owner übergeben dann wird die Animation gelöscht wenn der Cube gelöscht wird.
TFloatAnimation *animate = new TFloatAnimation(cube);
-
@Jansen
Dann bin ich aber etwas blind, denn vom freigeben lass ich dort nichts.@aberhallo
Danke für die Erklärungen.@Randomize
http://docwiki.embarcadero.com/Libraries/en/System.Randomize
Warum darf man Randomize() eigentlich nicht mehrmals aufrufen?
-
Hallo
~FireMonkey schrieb:
@Jansen
Dann bin ich aber etwas blind, denn vom freigeben lass ich dort nichts.Der Verweis auf die FAQ soll ausdrücken, das auch die 3D-Komponenten sich wie VCL-Controls verhalten. Da du beim Konstruktor this als Owner angibst, übernimmt das Form die Ownership. Spätestens wenn das Form gelöscht wird, werden auch die registrierten Komponenten gelöscht. Nur wenn du keinen Owner angibst, must du die Komponenten selber löschen.
Warum darf man Randomize() eigentlich nicht mehrmals aufrufen?
Es initialisiert den Zufallsgenerator. Dieses Initialisieren basiert auf der aktuellen Systemzeit. Wenn du also Initialisieren und Ziehung in einer Schleife schnell genug ausführst, ändert sich die Systemzeit nicht und du bekommst immer die gleichen Zahlen.
bis bald
akari