1999년에 델파이를 배운 이후로 그 빠른 발전에 매료되었습니다. 당시에는 프로그래밍을 막 접한 상태였는데, 특히 시각적인 개발에 관심이 많았던 이유는 C보다 빠르게 구현할 수 있기 때문입니다. 지난 몇 년 동안 저는 delphi C/S에서 3계층 B/S까지 크고 작은 소프트웨어를 작성했습니다. , 이 델파이에는 이런 기능만 있는 것 같아요. 최근에 "Com Essence"라는 책을 받고 VCL 소스 코드를 연구한 이후로 정말 강력하다는 걸 알게 됐어요. , 일부 획기적인 내용이 여기에서 모두와 공유됩니다. 실수가 있으면 알려주십시오.
직설적으로 말하면 구성 요소에는 속성과 메서드라는 두 가지 유형의 멤버만 포함됩니다(내가 말하는 메서드에는 이벤트가 포함됩니다).
이는 네 부분으로 나누어져 있습니다:
사적인
보호됨
공공의
출판됨
위의 네 부분의 의미는 일반적인 시각적 개발 서적에서 소개될 것입니다. 여기서는 델파이와 관련된 간략한 개요만 소개합니다.
Private: 모든 private 멤버는 여기에 배치되며 하위 클래스가 아닌 클래스 자체 메서드를 통해서만 액세스할 수 있으며 하위 클래스에 투명합니다. 유닛 자체의 메소드를 통해서만 접근할 수 있다고도 말할 수 있습니다.
protected: 서브클래스에서 상속될 수 있다는 점을 제외하면 나머지는 private과 동일합니다. 외부인은 접근할 수 없습니다.
public: 공개, 여기에 선언된 속성과 메서드를 사용자가 호출할 수 있습니다.
게시됨: Delphi 개발 환경의 속성 표시줄에 나타납니다.
먼저, 가장 간단한 컨트롤을 만들어 보겠습니다. 5분 안에 델파이의 컴포넌트 패널에 있는 컴포넌트들이 어떻게 만들어지는지 이해하게 될 것입니다.
새로 만들기->새로 만들기->구성 요소를 선택하고 Enter 키를 누릅니다.
그런 다음 Ancestor 유형에서 상속하려는 상위 클래스를 선택합니다. 여기서는 TComponent를 선택합니다. 이는 TComponent의 모든 속성과 메서드를 상속한다는 의미입니다.
클래스명 : 제작할 컴포넌트의 클래스명을 입력합니다. (TShowText를 입력합니다)
팔레트 페이지: Delphi에서 구성 요소가 설치될 패널입니다. (샘플을 선택하면 새 이름을 입력할 수도 있습니다)
다음은 말할 필요가 없습니다.
확인 버튼을 클릭하면 Delphi는 TComponent에서 상속된 기본 컨트롤을 자동으로 생성합니다. TComponent만큼 강력한 컨트롤을 개발했다는 것도 이해할 수 있지만 이것이 우리에게 필요한 것은 아닙니다.
다음은 컴포넌트 자체의 프라이빗 변수를 읽고 쓰는 방법을 설명합니다.
예를 들어, 우리는 다음과 같은 짧은 단락을 작성했습니다.
사적인
FText: 문자열;
....
/*개인 변수는 외부 세계에서 사용이 허용되지 않는데, 이 FText 문자열 변수를 어떻게 작동시킬 수 있습니까? */
또한 게시 후에 다음 단락을 추가해야 합니다.
속성 Text: 문자열 읽기 FText 쓰기 FText;
이것이 의미하는 바는 이 Text 속성이 delphiSDK의 속성 표시줄에 나타난다는 것입니다. 속성 표시줄에서 Text를 수정하는 사용자는 실제로 FText 문자열 변수를 수정하는 것입니다. read 는 사용자가 Text 속성을 읽고 실제로 FText 를 읽는다는 뜻입니다. 물론 Write 는 사용자가 Text 에 값을 할당하고 이를 FText 문자열 변수에 저장한다는 뜻입니다.
이때 저장하고 델파이에 설치하면 가장 기본적인 컴포넌트가 완성됩니다. (구성요소 설치방법은 마지막에 소개합니다)
하하, 정말 간단하지 않나요? 단지 우리 구성 요소가 특별한 용도로 사용되지 않는다는 것뿐입니다.
여기서는 속성을 소개했습니다. 이제 메소드 사용을 소개하는 함수를 계속 추가하겠습니다.
Public 뒤에 다음을 추가합니다.
절차 ShowText();
그런 다음 Ctrl + Alt + C를 누르면 시스템이 일부 메소드의 구현 코드를 자동으로 추가합니다.
다음으로 우리는 다음을 작성합니다:
절차 TShowText.ShowText();
시작하다
ShowMessage(FText);
끝;
보시다시피 위의 ShowMessage는 클래스의 전용 변수 값을 표시합니다. 이제 전용 변수는 클래스 자체의 메서드에서만 액세스할 수 있다는 점을 이해해야 합니다. 여기서는 ShowMessage가 Dialogs 유닛에 포함되어 있으므로 사용 후 Dialogs 유닛을 추가해야 합니다. 그렇지 않으면 통과하지 못합니다.
물론 위 이벤트는 컨트롤에서만 사용할 수 있으며 속성 상자의 이벤트 표시줄에는 표시되지 않습니다. 여기서 선언한 메소드는 순수 메소드인 Public만 있고 이벤트로 선언되지 않기 때문입니다.
위의 연구를 통해 컨트롤의 속성과 방법을 작성하고 조정하는 방법을 이미 알고 계셨습니까?
그러나 실제 제어는 이벤트와 분리될 수 없으며 이벤트 호출은 다음 기사에서 소개할 메시지에 의해 구동되어야 합니다.
강력한 컨트롤의 속성과 방법은 그리 쉽지 않습니다. 더 많은 연습과 더 많은 적용이 필요합니다.
아래 첨부된 것은 제가 작성한 DBGridToExcel 컨트롤입니다. 이 컨트롤의 기능은 DBGrid의 데이터를 Excel로 내보내는 것입니다. 학습하고 참고 자료로 사용할 수 있습니다. 이 컨트롤에는 다음 기사에서 설명할 속성, 메서드 및 "이벤트"의 사용이 포함됩니다.
부록 1: 자체 제작 컨트롤을 설치하는 방법:
(1) 구성 요소 메뉴에서 "구성 요소 설치..."를 선택합니다.
(2) 유닛 파일 이름 뒤의 "..."를 클릭하고 "*.pas" 컨트롤의 유닛 파일을 선택한 후 확인을 클릭합니다. 나타나는 창에서 "설치"를 클릭하면 설치가 완료됩니다.
새로 설치된 컨트롤이 패널에 나타납니다.
첨부 2: TDBGridToExcel 컨트롤의 전체 소스 코드를 메모장에 복사하고 .pas 파일로 저장합니다.
단위 DBGridToExcel;
{************************************************ * ***********************}
{* *}
{* D5 및 D6용 Word VCL 컨트롤로 그리드 내보내기 *}
{* Copyright(C) xiangding 2003.10.1 All Rights Reserved *}
{* 버그 신고: [email protected] *}
{* 저자: 리틀 베어*}
{* *}
{************************************************ * ***********************}
{* *}
{* 이것은 간단한 버전입니다 *}
{* *}
{************************************************ * ***********************}
{* *}
{* 설치하다: *}
{* GridToExcel.pas 파일로 저장한 후 파일을 열어주세요 *}
{* 메뉴 항목 [컴포넌트] --> [컴포넌트 설치]를 클릭합니다. *}
{* 구성요소 설치 대화상자에서 [설치] 버튼을 클릭하세요 *}
{* 설치 후 구성 요소에서 컨트롤을 찾을 수 있습니다 *}
{* 페이지 [샘플] *}
{* *}
{************************************************ * ***********************}
{* *}
{* 설치하다: *}
{* 첨부파일을 저장한 후 Delphi로 GridToExcel.Pas 파일을 엽니다. *}
{* Delphi 메뉴-->구성요소-->구성요소 설치를 선택합니다. *}
{* 그런 다음 설치를 선택합니다. 설치 후 제어판의 샘플 페이지에서 *}
{* 익숙해지면 몇 가지 복잡한 속성을 설정하고 다른 속성을 직접 탐색해 볼 수 있습니다. *}
{************************************************ * ***********************}
인터페이스
용도
Windows, StdCtrls, ComCtrls, 메시지, DBGrids, 그래픽, ExtCtrls,
양식, DB, ComObj, 컨트롤, SysUtils, 클래스;
ResourceString
SPromptExport = '잠시 기다려 주십시오. 데이터를 내보내는 중입니다...';
SConnectExcel = 'Excel을 시작하는 중입니다. 잠시 기다려 주십시오...';
SConnectExcelError= 'Excel에 연결하지 못했습니다. Excel이 설치되지 않아 내보낼 수 없습니다.';
SCancel = '&취소';
SError = '오류';
SConfirm = '정말로 데이터 내보내기를 종료하시겠습니까? ';
SCaption = '확인';
SGridError = '지정된 데이터 세트가 없습니다. 데이터 세트 컨트롤을 지정하십시오! ';
유형
TDBGridToExcel = 클래스(TComponent)
사적인
ProgressForm: TForm;
FShowProgress: 부울;
ExcelApp: 변형;
FTitle: 문자열;
종료: 부울;
FOnProgress: TNotifyEvent;
FGrid: TDBGrid; {소스 그리드}
ProgressBar: TProgressBar;
프롬프트: TLabel;
FAutoExit: 부울;
FAutoSize: 부울;
FDBGrid: TDBGrid;
절차 SetShowProgress(const Value: Boolean);
프로시저 CreateProgressForm;
절차 ButtonClick(보내는 사람: TObject);
함수 ConnectToExcel: 부울;
프로시저 내보내기DBGrid;
{비공개 선언}
보호됨
{ 보호된 선언 }
공공의
생성자 Create(AOwner: TComponent);
소멸자 파괴();
프로시저 내보내기ToExcel; 그리드를 Excel로 내보내기;
{공개 선언}
출판됨
{ 게시된 선언 }
속성 DBGrid: TDBGrid 읽기 FDBGrid 쓰기 FDBGrid;
속성 제목: 문자열 읽기 FTitle 쓰기 FTitle;
속성 ShowProgress: 부울 읽기 FShowProgress 쓰기 SetShowProgress;
속성 OnProgress: TNotifyEvent 읽기 FOnProgress 쓰기 FOnProgress;
끝;
절차 등록;
구현
절차 등록;
시작하다
RegisterComponents('샘플', [TDBGridToExcel]);
끝;
{TDBGridToExcel}
절차 TDBGridToExcel.ButtonClick(Sender: TObject);
시작하다
종료 := MessageBox(ProgressForm.Handle, pchar(SConfirm), pchar(SCaption),
MB_OKCANCEL + MB_ICONINFORMATION) = IDOK;
끝;
함수 TDBGridToExcel.ConnectToExcel: 부울;
시작하다
결과 := 참;
노력하다
ExcelApp := CreateOleObject('Excel.application');
ExcelApp.Visible := 거짓;
if Title<>'' then ExcelApp.Caption := 제목;
ExcelApp.WorkBooks.Add;
제외하고
MessageBox(GetActiveWindow,PChar(SConnectExcelError),PChar(SError),Mb_OK+MB_IconError);
결과 := 거짓;
끝;
끝;
생성자 TDBGridToExcel.Create(AOwner: TComponent);
시작하다
상속됨;
FShowProgress := True; {기본값은 진행률 표시입니다.}
FAutoExit := 거짓;
FAutoSize := 참;
끝;
절차 TDBGridToExcel.CreateProgressForm;
var
패널: TPanel;
버튼: TButton;
시작하다
할당된(ProgressForm) 경우 {만들 준비가 완료되었습니까?}
ProgressForm := TForm.Create(소유자);
ProgressForm을 사용하면
시작하다
Font.Name := '宋体';
글꼴.크기 := 10;
테두리 스타일 := bsNone;
너비 := 280;
높이 := 120;
테두리 너비 := 1;
색상 := cl배경;
위치 := poOwnerFormCenter;
끝;
패널 := TPanel.Create(ProgressForm);
패널을 사용하여 { 패널 만들기 }
시작하다
상위 := ProgressForm;
정렬 := alClient;
BevelInner := bvNone;
BevelOuter := bvRaised;
캡션 := '';
끝;
프롬프트 := TLabel.Create(Panel);
{라벨 생성}을 수행하라는 메시지를 표시합니다.
시작하다
상위 := 패널;
왼쪽 := 20;
상단 := 25;
캡션 := SConnectExcel;
끝;
ProgressBar := TProgressBar.Create(패널);
ProgressBar do { ProgressBar 만들기 }
시작하다
단계 := 1;
상위 := 패널;
부드러움 := 사실;
왼쪽 := 20;
상단 := 50;
높이 := 18;
너비 := 260;
끝;
버튼 := TButton.Create(Panel);
버튼 do { 취소 버튼 만들기 }
시작하다
상위 := 패널;
왼쪽 := 115;
상단 := 80;
캡션 := 취소;
OnClick := 버튼클릭;
끝;
ProgressForm.Show;
ProgressForm.업데이트;
끝;
소멸자 TDBGridToExcel.Destroy;
시작하다
상속됨;
끝;
절차 TDBGridToExcel.ExportDBGrid;
var
데이터: TDataSet;
ADBGrid: TDBGrid;
i, j : 정수;
CurrentPoint : 포인터;
OldBeforeScroll, OldAfterScroll: TDataSetNotifyEvent;
시작하다
Screen.Cursor := crHourGlass;
노력하다
노력하다
TForm(Owner).Enabled := False;
ExcelApp.DisplayAlerts := false;
ExcelApp.ScreenUpdating := false;
종료 := false;
ShowProgress이면 Prompt.Caption := SPromptExport;
ADBGrid := DBGrid;
데이터 := ADBGrid.DataSource.DataSet;
ADBGrid do { 테이블 헤더 삽입 }
for i := 1 ~ Columns.Count do
if Columns[i - 1].Visible then
ExcelApp.Cells[1,i].Value :=Columns[i - 1].Title.Caption;
CurrentPoint := Data.GetBookmark {현재 위치 저장}
OldBeforeScroll := Data.BeforeScroll { 이전 스크롤 이벤트 핸들 저장 }
OldAfterScroll := Data.AfterScroll { 기존 AfterScroll 이벤트 핸들 저장 }
Data.DisableControls; { 제어 비활성화 }
Data.BeforeScroll := nil;
Data.AfterScroll := nil;
ShowProgress이면 ProgressBar.Max := Data.RecordCount;
나는 := 2;
데이터.먼저;
while not Data.Eof do { 모든 레코드 처리 }
시작하다
ADBGrid do { 하나의 레코드 처리 }
for j := 1 ~ Columns.Count do
Columns[j - 1].Visible이면
ExcelApp.Cells[i,j].Value := 열[j - 1].Field.DisplayText;
Inc(i);
데이터.다음;
할당된 경우(FOnProgress) 그러면 FOnProgress(Self);
if ShowProgress then { 진행률 UI 업데이트 }
시작하다
ProgressBar.StepIt;
애플리케이션.프로세스메시지;
종료하면 종료합니다.
끝;
끝;
제외하고
MessageBox(GetActiveWindow,PChar(SConnectExcelError),Pchar(SError),MB_OK+MB_ICONERROR);
끝;
ExcelApp.Visible := 거짓;
TForm(Owner).Enabled := True;
Screen.Cursor := crDefault;
if ShowProgress then FreeAndNil(ProgressForm) { 무료 진행 양식 }
ExcelApp.DisplayAlerts := True;
ExcelApp.ScreenUpdating := True;
마지막으로
Data.BeforeScroll := OldBeforeScroll { 이전 이벤트 핸들 복원 }
Data.AfterScroll := OldAfterScroll;
Data.GotoBookmark(CurrentPoint);
Data.FreeBookmark(CurrentPoint);
Data.EnableControls;
Screen.Cursor := crDefault;
끝;
끝;
절차 TDBGridToExcel.ExportToExcel;
시작하다
DBGrid= nil이면 Exception.Create(SGridError)를 발생시킵니다. {No DataSource, then Error}
if ShowProgress then CreateProgressForm {ProgressForm 표시 여부}
ConnectToExcel이 아닌 경우 { 오류 발생 시 종료 }
시작하다
If ShowProgress then FreeAndNil(ProgressForm);
출구;
끝;
내보내기DBGrid; {데이터 내보내기 시작}
끝;
절차 TDBGridToExcel.SetShowProgress(const Value: Boolean);
시작하다
FShowProgress := 값;
끝;
끝.