Ich habe einige Formulare in meiner Anwendung, die verschiedene "Zustände" haben, abhängig davon, was der Benutzer macht; beispielsweise zeigt das Formular beim Auflisten seiner Dateien einige Daten über diese Datei in einem Raster an, aber wenn er auf eine Schaltfläche klickt, wird das Raster durch eine Grafik ersetzt, die sich darauf bezieht. Einfach gesagt, die Steuerelemente im Formular hängen davon ab, was der Benutzer tun möchte.Soll ich Delphi-Tframes für Formulare mit mehreren Seiten verwenden?
Natürlich war das das Zeigen/Verstecken von Steuerelementen nach Bedarf, funktioniert wie ein Zauber für kleine Zahlen, aber sobald Sie 10/15 + Steuerelemente pro Zustand (oder mehr als 3 Zustände wirklich) erreichen, ist es unbrauchbar.
Ich experimentiere gerade mit TFrames: Ich erstelle einen Rahmen für jeden Zustand, ich erstelle dann eine Instanz von jedem Rahmen auf meinem Formular übereinander und dann zeige ich nur die mit Visible - while einige Kontrollen darüber, aus irgendeinem Rahmen, da sie alle sie teilen.
Ist das der richtige Weg, um zu tun, was ich will, oder habe ich etwas auf dem Weg vermisst? Ich dachte, ich könnte nur eine Tframe-Instanz erstellen und dann auswählen, welche in der Tframe-Instanz angezeigt werden soll, aber das sieht nicht so aus.
Dank
+1, aber beachten Sie, dass der Code, wie es lädt leckt Speicher. Es sei denn, MYFrame1.CurrentFrame wird explizit auf Null gesetzt oder wenn MYFrame1 zerstört wird, wird es nicht freigegeben. Es wäre besser, MyFrame1 als Eigentümer an den Konstruktor zu übergeben und die automatische Lebensdauerverwaltung in der VCL zu verwenden. – mghie
@mghie: IIRC das Parent eines Controls übernimmt auch das Lifetime Management, also sollte es keinen Speicherleck in Tims Code geben. –
Eigentlich denke ich, wenn Sie statt TSomeFrame.Create (nil) TSomeFrame.Create (Self) aufrufen, die das Formular zum Eigentümer des Frames machen würden, und das Formular würde es freigeben, wenn es selbst zerstört wird. Alternativ könnten Sie CurrentFrame im OnDestroy-Ereignis auf null setzen. Das Wechseln von einem Bild zum anderen führt nicht zu Speicherverlusten, da der Setter den FCurrentFrame freigibt, bevor er auf ein anderes Bild gesetzt wird. –