2010-12-09 6 views
5

런타임 프레임을 생성하고 패널의 부모를 프레임에 설정하는 것과 같은 기존 패널을 추가 할 수 있습니까? 추가 할 때 프레임을 중복하여 사용합니까?런타임시 Tframes 생성 :

좋아 :

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

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

은 다음 F를 복제? 그게 가능 했어? 방법? 또는 다른 suggerstion? e

답변

5

복제로 해결할 수 없을 것이라고 생각합니다. 필요한 기능은 다음과 같습니다.

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

모든 컨트롤에는 부모와 소유자가 있다는 것을 기억해야합니다. 소유자는 nil 일 수 있지만 코드를 통해 해당 컨트롤을 해제해야하므로 대부분의 컨트롤은 다른 구성 요소의 소유입니다.

따라서 소유자가 파괴되면 패널도 파괴됩니다. 그리고 패널이 디자인 타임에 생성 된 경우에는 해당 패널이 소유 한 형태로 소유됩니다.

해당 양식을 삭제하면 패널이 파괴됩니다.

런타임에서 패널을 만들고 양식 대신 소유자로 Application을 설정하면 여러 가지 양식과 프레임으로 이동할 수 있습니다.

하지만 좋은 디자인 패턴입니까? 네가하려는 일을 모르지만 나쁜 생각 일거야!

일반적으로 디자인 타임에 전체 프레임을 패널로 디자인하는 것이 더 실용적입니다. 그런 다음 다른 패널이나 컨트롤에서 데이터를 복사하여 프레임을 만들 수있는 코드를 추가하십시오. 그게 더 나은 디자인 패턴이 될거야 ...

1

첫 번째 (FRAME1)를 만드는 데 사용한 코드와 동일한 코드로 새 프레임 (FRAME2)을 만들어야합니다. 그리고 나중에 FRAME2의 FRAME1에 포함 된 모든 구성 요소 (런타임에 생성됨)를 만들어야합니다. 이것에 대한

는 사용

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

당신은 두 번째 대안을 시도 할 수 있습니다; TMemoryStream (SaveComponent)을 사용하여 FRAME1을 저장하고 나중에 새 프레임을 만들고 Stream에 저장된 정보를 검색합니다 (이 옵션을 테스트하지 않았습니다).

감사합니다.