dfm 직접 폼디자인 변경
실시간에 소켓등으로 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]);
'Delphi Tip > +Tip' 카테고리의 다른 글
프로그램 디버그(Debug) 메시지를 찍기 (0) | 2024.07.06 |
---|---|
폼 미러링 (Form Mirroring) (0) | 2024.06.17 |
프로그램 종료 시 모든 폼 OnClose 이벤트 발생시키기 (0) | 2024.06.11 |
메세지 다이어그램(Message Dialog) 체크박스(CheckBox) 추가 (0) | 2024.06.06 |
키보드 키입력 막기 - 화면 캡처 방지(Blocking Screen Capture) (0) | 2024.05.29 |
댓글