Delphi Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
델파이 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
FreePascal/Lazarus
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

델파이 팁&트릭
Delphi Programming Tip&Tricks
[359] 스킨을 이용하여 폼의 모양 바꾸기 - 1
첫눈 [hadugo] 3832 읽음    2017-01-03 18:38
윈엠이라는 프로그램을 보면 다양한 모양의 스킨을 이용하여 폼의 디자인 자체를 바꾸는 기능이 있습니다.

델파이에도 언젠가 부터 스킨을 적용할 수 있도록 지원하긴 하지만 델파이의 메뉴에도 나와 있듯이 스킨이 아니고 테마를 바꾸는 기능입니다.
다시 말해 폼과 각종 컨트롤들의 모양과 색상만 바꿔줄 뿐 전체적인 디자인 자체를 바꿔주지는 못합니다.

온라인상에서 찾아보면 다양한 스킨지원 도구들이 판매되고 있고 그 중 몇가지를 테스트 해 봤지만
3가지를 다운 받아 테스트를 해 보니 고작해야 델파이에서 지원하는 테마에 몇가지 기능만 추가하여 돈 받아먹는 것으로 밖에는 보이지 않습니다.

윈엠과 같이 전체적인 디자인을 바꿔주는 도구가 있긴 한데 워낙 오류가 많아 과연 그것을 돈주고 살 사람이 있을까 의심스러웠구요.

결국 제가 원하는 기능을 이용하기 위해서는 고작해야 델파이 기초문법 밖에 모르는 제가 직접 만들수 밖에 없었고
그렇고 마음을 먹고 방법을 찾아보니 몇가지 방법이 있긴 합니다.

1.
폼을 DLL 또는 BPL에 저장하여 DLL파일이나 BPL을 배포하는 방법

이 방법은 다른 개발도구에서도 흔히 사용되는 방법이라 가장 합리적인 방법으로 보입니다.
소스코드를 대충 훓어보면 다음과 같습니다.

Var
  PackageModule : HMODULE;
  AClass : TPersistentClass;
  Form1Class : TForm1Class;
  Button1 : TButton;
Begin
  PackageModule := LoadPackage('Skin.bpl');
  if PackageModule = 0 then Exit;

  AClass := GetClass('TForm1');
  Form1Class := TForm1Class(AClass);
  Application.CreateForm(Form1Class, Form1);
  Button1 := TButton(Form1.FindComponent('Button1'));
  Button1.OnClick := Button1Click;
End;


대충 이런 식으로 사용하고 가장 고급져 보이는데 사실 이방식은 에러로 인해 실무에서는 사용자들에게 비난을 감수해야 합니다.

에러는 "rtl160.bpl 어쩌고 저쩌고..."하는 에러로
정상적인 환경에서 약 500번 정도 반복하여 재실행 하면 에러가 발생하고
윈도우상에 각종 보안프로그램이나 엑티브엑스 또는 유틸리티등이 많이 설치되고 윈도우 시작시 많은 프로그램들이 로딩되어 있으면
약 20번 재실행하면 한 두번 정도 에러가 발생합니다.

아주 간단하게 폼위에 몇가지 컨트롤을 올려놓고 테스트해 봐도 에러가 발생합니다.

이렇게 불규칙하게 에러가 발생하기 때문에 에러의 원인을 찾다가 포기하고
의심스러운 코드를 수정했다 하더라도
문제가 해결되었는지 확인하기 위해서는 500번 이상을 재실행해 봐야 하기 때문에
이 방법은 이론상 존재하는 쓸모없는 방법입니다.

2.
파일스트림에 폼을 저장하는 방법
소스코드를 보면

  FileStream := TFileStream.Create('Skin.bin', fmCreate);
  for I := 0 to Form1.ComponentCount - 1 do
  Begin
    FileStream.WriteComponent(Form1.Components[I]);
  End;
  FreeAndNil(FileStream)

이렇게 폼을 파일에 저장하고
  FileStream := TFileStream.Create('Skin.bin', fmOpenRead);
  For i := 0 To Form1.ComponentCount - 1 Do
  Begin
    FileStream.ReadComponent(Form1.Components[i]);
  End;
  FreeAndNil(FileStream);

이렇게 폼을 불러와 보여주는 방법입니다.

사용방법이 간단하여 첫번째 방법에 비하면 상당히 하수들이 사용하는 방법 처럼 보이기도 하지만
사실은 첫번째 방법에 비해 상당히 안정적인 방법이고 추천하는 방법입니다.

하지만 이 방법에는 아주 치명적인 문제가 있습니다.
기본으로 폼을 하나 불러오고 그 폼에 스킨을 불러오는 방법인 만큼
기본으로 불러들이는 폼과 스킨에 저장된 폼의 객체들의 갯수가 같아야 하고
같은 순서로 저장되어 있어야 합니다.

즉, 아주 좋은 방법이지만 쓸모가 없다는 겁니다.

그래서 또 다른 방법을 찾아봤습니다.

글이 너무 길어지니 다음 글로 연재해야 겠네요.

 

+ -

관련 글 리스트
359 스킨을 이용하여 폼의 모양 바꾸기 - 1 첫눈 3832 2017/01/03
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.