본문 바로가기
Delphi Tip/+Tip

dfm 직접 폼디자인 변경

by MonoSoft 2024. 7. 1.
728x90
반응형

dfm 직접 폼디자인 변경

728x90

 

 

 

실시간에 소켓등으로 dfm 파일을 쏴서

그걸 읽어서 폼디자인 변경할 수 있는 방법인데 몇가지 제한이 있는데

콤포넌트의 이벤트는 dfm 에 없어야 하고..

form 전체를 dfm 으로 받아서 할수는 없고 form 에 프레임이나

패널을 써서 프레임이나 패널이 dfm 의 최상위 콤퍼넌트일 때 쓸 수 있고

RegisterClasses 로 클래스 등록을 모두 해줘야 하는등.. 제한이 있네요..

 

간단히 예제를 만들어봐서 올립니다.

폼의 일부 영역만 바꾸려고 할 때는 유용할 거 같네요.

이벤트없고 콤포넌트만 있는다거나 하는 경우..

 

소스는 아래와 같은데

TReader 의 ReadRootComponent 메소드로 dfm 읽어들여서

그 루트콤포넌트의 parent 만 정해주는 방식입니다.

 

procedure TForm12.Button1Click(Sender: TObject);

var

reader: TReader;

cmp: Tcomponent;

strm: TMemoryStream;

strs: TFileStream;

begin

strs := TFileStream.Create('unit13_panel.dfm', fmOpenRead);

strs.Position := 0;

strm := TMemoryStream.Create;

ObjectTextToResource(strs, strm);

strm.Position := 0;

strm.ReadResHeader;

reader := TReader.Create(strm, 4096);

try

reader.owner := self;

reader.parent := self;

DisableAlign; // prevent blinking..

if FContainer <> nil then

begin

FContainer.Parent := nil;

FContainer.Free;

FContainer := nil;

end;

 

cmp := reader.ReadRootComponent(nil);

FContainer := TWinControl(cmp);

FContainer.Parent := self;

finally

EnableAlign;

reader.Free;

strs.free;

strm.Free;

end;

end;

 

procedure TForm12.FormCreate(Sender: TObject);

begin

FContainer := Panel1;

end;

initialization

RegisterClasses([TPanel, TEdit, TLabel, TMemo, TComboBox, TRadioGroup, TButton, TListBox]);

 

728x90
반응형

댓글