2010-12-09 21 views
5

ist es möglich, Laufzeit-Frame zu erstellen und bestehende Panels wie die Eltern des Panels zum Frame hinzuzufügen? und wenn es hinzugefügt wurde, dulplicate den Rahmen und benutze es?create Tframes zur Laufzeit:

mag:

f:= Tframe. create(..) 
... 

panel3.parent = f; //where panel3 has many controls. 

dann die f duplizieren? war es möglich? Wie? oder irgendeine andere Suggestion? e

Antwort

5

Ich glaube nicht, dass Sie dies durch Duplizieren lösen würden. Was Sie brauchen, ist eine Funktion wie folgt aus:

function CreateFrameAndHostPanel(Owner: TComponent; Parent: TWinControl; Panel: TPanel): TFrame; 
begin 
    Result := TFrame.Create(Owner); 
    Try 
    Result.Parent := Parent; 
    Panel.Parent := Result; 
    Except 
    FreeAndNil(Result); 
    raise; 
    End; 
end; 
3

Sie müssen sich daran erinnern, dass alle Funktionen mit einem Elternteil und einen Besitzer haben. Besitzer könnten nil sein, aber dann müssen Sie diese Steuerelemente durch Code freigeben, sodass die meisten Steuerelemente einer anderen Komponente gehören.

Also, wenn der Besitzer zerstört wird, würde das Panel auch zerstört werden. Und wenn das Panel in Design-Zeit erstellt wurde, gehört es dem Formular, auf dem es sich befindet!

Das Zerstören dieser Form würde das Panel zerstören!

Wenn Sie jedoch die Panels in Runtime erstellen und als Eigentümer anstelle eines Formulars festlegen, können sie über mehrere Formulare und Rahmen verschoben werden.

Aber ist es ein gutes Entwurfsmuster? Ich weiß nicht, was Sie versuchen, aber es ist wahrscheinlich eine schlechte Idee!

Im Allgemeinen wäre es praktischer, den gesamten Rahmen mit Platten in Design-Zeit zu gestalten. Fügen Sie dann Code hinzu, mit dem der Frame erstellt werden kann, indem Sie Daten aus einem anderen Panel oder Steuerelement kopieren. Das wäre ein besseres Entwurfsmuster ...

1

Sie müssen den neuen Rahmen (FRAME2) mit dem gleichen Code erstellen, mit dem Sie den ersten erstellt haben (FRAME1); Und später müssen Sie alle Komponenten erstellen, die zur Laufzeit in FRAME1 in FRAME2 enthalten sind.

Für dazu verwenden:

for i := 0 to (FRAME1.ComponentCount - 1) do 
    ... 
    cmp := TComponent(FRAME1.Component[i]); 
    ... create cmp on Frame2 

Sie können eine zweite Alternative versuchen; Speichern Sie den FRAME1 mit einem TMemoryStream (SaveComponent) und erstellen Sie später den neuen Frame und rufen Sie die gespeicherte Information in Stream ab (Ich habe diese Option nicht getestet).

Grüße.