Delphi 구성 요소 및 속성 편집기
(1) 서문
이 문서에서는 예제를 사용하여 구성 요소 개발 및 속성 편집기를 설명합니다.
예제(TdsWaitDialogEx)는 show 메소드를 호출한 후 Dialog를 표시하는 시각적 구성 요소입니다.
여기에는 TAnimate, 두 개의 프롬프트 메시지(예: TLabel) 및 진행률 표시줄(TGauge)이 포함되어 있습니다.
열거형 속성: DialogStyle, AViposition
레코드 속성: 옵션
속성 컬렉션 개체는 TPersistant에서 상속됩니다. 이 예에서 AVISource 속성 컬렉션에는 TAnimate가 포함되어 있습니다.
애니메이션 속성 CommonAVI, FileName
속성 편집기는 AVISource의 FileName 속성을 적용하여 편집 시 String FileName이 팝업됩니다.
TOpenDialog의 필터링 필터는 *.avi입니다.
(2) 컴포넌트 패키지 dsDlgPack.dpk
게시, 설치 등을 용이하게 하려면 구성 요소 패키지 .dpk를 사용해야 합니다.
Delphi6 이후 버전(D5 이전 버전은 모르겠습니다)에는 PRoxies와 같이 Delphi가 출시하지 않은 여러 파일이 있습니다.
구성 요소를 설치할 때 이러한 파일을 사용하는 경우 해당 파일을 무시하고 해당 파일이 포함된 패키지를 사용할 수 있습니다.
이 예에서 속성 편집기는 DesignEditors 파일을 사용하고 DesignEditors에는 Proxies 파일이 필요하므로 이 구성 요소가 게시됩니다.
패키지(.dpk)에는 프록시가 존재하지 않는 문제를 해결하는 designide가 포함되어 있어 구성 요소 설치가 성공합니다.
패키지 dsDlgPack;
...
필요하다
rtl,
vcl,
VclSmp,
설계;
포함
'dsDlgWaitEx.pas' {DlgWaitEx}의 dsDlgWaitEx,
'dsDlgWaitExReg.pas'의 dsDlgWaitExReg;
끝.
(3) 컴포넌트 등록 파일 dsDlgWaitExReg.pas
질문: 왜 그러한 파일을 더 자주 사용해야 합니까?
dsDlgWaitExReg.pas의 코드가 dsDlgWaitEx.pas로 병합되었지만 dsDlgPack.dpk에 designide가 포함되어 있는 경우
구성 요소를 설치할 때 프록시가 존재하지 않는 문제를 해결했지만 응용 프로그램이 이 구성 요소를 호출할 때 여전히 프록시가 존재하지 않는 문제가 발생합니다.
DesignEditors에는 프록시 파일이 필요하므로 다음 코드는 별도의 파일로 구성되고 응용 프로그램은 이 그룹을 호출합니다.
파일은 dsDlgWaitExReg.pas를 사용할 필요가 없으며 문제 없이 프록시를 우회할 수 있습니다.
단위 dsDlgWaitExReg;
인터페이스
클래스, 대화 상자, 양식, dsDlgWaitEx, DesignIntf, DesignEditors를 사용합니다.
유형
TdsAVIFileNameProperty = class(TStringProperty) //속성 편집기는 DesignEditors 파일을 사용합니다.
공공의
function GetAttributes:TPropertyAttributes;override; //메소드 재정의;
프로시저 편집;재정의; //메서드 재정의
끝;
절차 등록;
구현
절차 등록;
시작하다
//이 구성요소를 Delisoft 구성요소 페이지에 등록합니다.
RegisterComponents('Delisoft', [TdsWaitDialogEx]);
//이 속성 편집기를 등록합니다.
RegisterPropertyEditor(TypeInfo(string), TdsAVISource, 'FileName', TdsAVIFileNameProperty);
끝;
{TdsAVI파일이름속성}
함수 TdsAVIFileNameProperty.GetAttributes:TPropertyAttributes;
시작하다
결과:=[paDialog];
끝;
절차 TdsAVIFileNameProperty.Edit;
시작하다
TOpenDialog.Create(application)을 사용하여 수행
노력하다
필터:='AVI 파일(*.avi)|*.avi|모든 파일(*.*)|*.*';
실행하면 SetStrValue(FileName);
마지막으로
무료;
끝;
끝;
끝.
(4) 컴포넌트 파일 dsDlgWaitEx.pas
단위 dsDlgWaitEx;
{이 구성 요소의 모든 속성과 메서드를 정의합니다. TDlgWaitEx 형식의 BorderStyle 속성은 bsDialog입니다. 이 예에서 구성 요소 TdsDlgWaitEx는 TDlgWaitEx 형식을 사용하고, 속성 개체 AVISource는 TPersistant에서 직접 상속된 TdsAVISource를 사용합니다. (DialogStyle, AVIPosition) 및 레코드 속성(옵션) 등이 사용됩니다.
}
인터페이스
용도
Windows, 메시지, SysUtils, 변형, 클래스, 그래픽, 컨트롤, 양식,
대화 상자, StdCtrls, 게이지, ComCtrls;
유형
TDialogStyle = (dlgNormal, dlgStayOnTop);
TAVIPosition = (aviLeft, aviTop, aviBottom);
TDlgOptions = (showAVI,showCaption,showMessage1,showMessage2,showProgress,ShowProgressText) 집합;
TDlgWaitEx = 클래스(TForm)
애니메이트1: T애니메이트;
게이지1: TGauge;
라벨1: TLabel;
라벨2: TLabel;
절차 FormClose(Sender: TObject; var Action: TCloseAction);
사적인
FCloseAfter: DWord;
FUserFormClose: TCloseEvent;
공공의
UserFormClose 속성: TCloseEvent FUserFormClose 읽기 FUserFormClose 쓰기;
속성 CloseAfter: DWORD 읽기 FCloseAfter 쓰기 FCloseAfter;
끝;
TdsAVISource = 클래스(TP지속성)
사적인
FCommonAVI: TCommonAVI;
FFileName: 문자열;
절차 SetCommonAVI(const 값: TCommonAVI);
프로시저 SetFileName(const 값: 문자열);
보호됨
공공의
출판됨
속성 CommonAVI: TCommonAVI 읽기 FCommonAVI 쓰기 SetCommonAVI 기본 aviNone;
속성 FileName: 문자열 읽기 FfileName 쓰기 SetFileName;
끝;
TdsWaitDialogEx=class(TComponent)
사적인
//형태
FDlgForm:TDlgWaitEx;
FMessage1: 문자열;
FMessage2: 문자열;
FMessage1Font:TFont;
FMessage2Font:TFont;
F캡션: 문자열;
FDislogStyle:TDialogStyle;
FwordWrap:부울;
FOptions:TDlg옵션;
FShowMessage1,FShowMessage2:부울;
//AVI
FaviPosition: TAVIPosition;
FAviActive:부울;
FshowAVI:부울;
FAVI소스 : TdsAVI소스;
//진전
FProgressMax:정수;
FProgressMin:정수;
FProgressPos:정수;
FProgressStep:정수;
FShowProgress: 부울;
FShowProgressText: 부울;
//이벤트
FOnPosChange: TNotifyEvent;
FOnShow: TNotifyEvent;
FOnFormHide: TCloseEvent;
절차 SetProgressMax(const 값: 정수);
절차 SetProgressMin(const 값: 정수);
절차 SetProgressPos(const 값: 정수);
절차 SetProgressStep(const 값: 정수);
절차 DrawForm;
함수 setLableHeight(sCaption:string):integer;
절차 setOptions(const value:TDlgOptions);
프로시저 setMessage1(const 값:문자열);
프로시저 setMessage2(const 값:문자열);
프로시저 setCaption(const 값:문자열);
절차 SetMessage1Font(const 값:TFont);
절차 SetMessage2Font(const 값:TFont);
함수 IsMessage1FontStored: 부울;
함수 IsMessage2FontStored: 부울;
절차 setAVIPosition(const 값: TAVIPosition);
절차 SetAVISource(const 값: TdsAVISource);
절차 SetOnFormHide(const Value: TCloseEvent);
보호됨
절차 DoPosChange 가상;
절차 DoShow 가상;
공공의
생성자 Create(AOwner: TComponent);
소멸자 재정의;
절차 FormShow;
절차 FormHide;
절차 FormUpdate;
절차 ProgressStepIt;
출판됨
//형태
속성 Message1: 문자열 읽기 FMessage1 쓰기 setMessage1;
속성 Message2: 문자열 읽기 FMessage2 쓰기 setMessage2;
속성 Message1Font: TFont 읽기 FMessage1Font 쓰기 SetMessage1Font 저장 IsMessage1FontStored;
속성 Message2Font: TFont 읽기 FMessage2Font 쓰기 SetMessage2Font 저장 IsMessage2FontStored;
속성 캡션: 문자열 읽기 FCaption 쓰기 setCaption;
속성 DislogStyle:TDialogStyle FDislogStyle 읽기 FDislogStyle 쓰기;
wordWrap 속성 :boolean 읽기 FwordWrap 쓰기 FwordWrap;
속성 옵션:TDlgOptions 읽기 FOptions 쓰기 setOptions;
//AVI
속성 AviActive: 부울 읽기 FAviActive 쓰기 FAviActive;
속성 AviPosition: TAVIPosition 읽기 FaviPosition 쓰기 setAVIPosition;
속성 AviSource: TdsAVISource 읽기 FAVISource 쓰기 SetAVISource;
//진전
속성 ProgressMax: 정수 읽기 FProgressMax 쓰기 SetProgressMax;
속성 ProgressMin: 정수 읽기 FProgressMin 쓰기 SetProgressMin;
속성 ProgressPos: 정수 읽기 FProgressPos 쓰기 SetProgressPos;
속성 ProgressStep:정수 읽기 FProgressStep 쓰기 SetProgressStep;
//이벤트
속성 OnPosChange: TNotifyEvent 읽기 FOnPosChange 쓰기 FOnPosChange;
속성 OnShow: TNotifyEvent 읽기 FOnShow 쓰기 FOnShow;
속성 OnHide: TCloseEvent 읽기 FOnFormHide 쓰기 SetOnFormHide;
끝;
구현
{$R *.DFM}
{TdsAVI소스}
절차 TdsAVISource.SetCommonAVI(const 값: TCommonAVI);
시작하다
Value = FCommonAVI이면 종료합니다.
FCommonAVI := 값;
파일이름:='';
끝;
절차 TdsAVISource.SetFileName(const 값: 문자열);
시작하다
Value = FfileName이면 종료합니다.
F파일이름:=값;
FCommonAVI:=aviNone;
끝;
{TdsWaitDialogEx}
절차 TdsWaitDialogEx.DoShow;
시작하다
할당된 경우(FOnShow) 그러면 FOnShow(Self);
끝;
절차 TdsWaitDialogEx.DoPosChange;
시작하다
if Assigned(FOnPosChange) 그러면 FOnPosChange(Self);
끝;
절차 TdsWaitDialogEx.SetAVISource(const 값: TdsAVISource);
시작하다
FAVISource=value이면 종료합니다.
FAVISource.Assign(값);
if (FAVISource.FFileName='')and(FAVISource.FCommonAVI=aviNone) then FshowAVI:=false;
할당된 경우(FDlgForm)
시작하다
FDlgForm.Animate1.Active:=false;
FDlgForm.Animate1.FileName := '';
FDlgForm.Animate1.CommonAVI := aviNone;
FshowAVI라면
시작하다
FAVISource.FfileName=''인 경우
FDlgForm.Animate1.CommonAVI := FAVISource.FCommonAVI
또 다른
FDlgForm.Animate1.FileName := FAVISource.FfileName;
FDlgForm.Animate1.Active:=true;
끝;
DrawForm; //Animate1->AVI 변경 후 Animate1의 크기가 변경될 수 있습니다. ==> DrawForm
FDlgForm.업데이트;
끝;
끝;
함수 TdsWaitDialogEx.IsMessage1FontStored: 부울;
시작하다
FMessage1Font를 사용하면
결과 :=
(이름 <> 'MS Sans Serif') 또는
(스타일 <> []) 또는
(크기 <> 8) 또는
(색상 <> clWindowText) 또는
(문자 집합 <> DEFAULT_CHARSET) 또는
(피치 <> fpDefault);
끝;
함수 TdsWaitDialogEx.IsMessage2FontStored: 부울;
시작하다
FMessage2Font를 사용하면
결과 :=
(이름 <> 'MS Sans Serif') 또는
(스타일 <> []) 또는
(크기 <> 8) 또는
(색상 <> clWindowText) 또는
(문자 집합 <> DEFAULT_CHARSET) 또는
(피치 <> fpDefault);
끝;
절차 TdsWaitDialogEx.SetMessage1Font(const 값: TFont);
시작하다
FMessage1Font.Assign(값);
할당된 경우(FDlgForm)
시작하다
FDlgForm.Label1.Font.Assign(값);
FDlgForm.업데이트;
끝;
끝;
절차 TdsWaitDialogEx.SetMessage2Font(const 값: TFont);
시작하다
FMessage2Font.Assign(값);
할당된 경우(FDlgForm)
시작하다
FDlgForm.Label2.Font.Assign(값);
FDlgForm.업데이트;
끝;
끝;
프로시저 TdsWaitDialogEx.setCaption(const value:string);
시작하다
value=FCaption이면 종료합니다.
F캡션:=값;
그렇지 않은 경우(FOptions의 showCaption)
시작하다
FCaption:='';
출구;
끝;
할당된 경우(FDlgForm)
시작하다
FDlgForm.Caption := 값;
FDlgForm.update;
끝;
끝;
절차 TdsWaitDialogEx.setMessage1(const 값:문자열);
var i:정수;
시작하다
value=FMessage1이면 종료합니다.
FMessage1:=값;
할당된 경우(FDlgForm)
시작하다
그렇지 않은 경우(FOptions의 showMessage1) 종료합니다.
FDlgForm.Label1.Caption := 값;
i:=setLableHeight(FMessage1)+13;
i<>FDlgForm.Label1.Height이면 DrawForm;
FDlgForm.update;
끝;
끝;
절차 TdsWaitDialogEx.setMessage2(const 값:문자열);
var i:정수;
시작하다
value=FMessage2이면 종료합니다.
FMessage2:=값;
할당된 경우(FDlgForm)
시작하다
그렇지 않은 경우(FOptions의 showMessage2) 종료합니다.
FDlgForm.Label2.Caption := 값;
i:=setLableHeight(FMessage2)+13;
i<>FDlgForm.Label2.Height이면 DrawForm;
FDlgForm.update;
끝;
끝;