Komponen Delphi dan Editor Properti
(1) Kata Pengantar
Artikel ini akan menggunakan contoh untuk menjelaskan pengembangan komponen dan editor properti.
Contohnya (TdsWaitDialogEx) adalah komponen visual yang menampilkan Dialog setelah memanggil metode show-nya.
Ini berisi TAnimate, dua pesan cepat (yaitu TLabel), dan bilah kemajuan (TGauge).
Properti enumerasi: DialogStyle, AViposition
Rekam properti: Opsi
Objek kumpulan properti mewarisi dari TPersistent. Dalam contoh ini, kumpulan properti AVISource berisi TAnimate
Properti animasi CommonAVI, Nama File
Editor properti diterapkan dengan properti FileName dari AVISource, yaitu String FileName muncul saat mengedit.
TOpenDialog, Filter penyaringannya adalah *.avi
(2) Paket komponen dsDlgPack.dpk
Untuk memfasilitasi penerbitan, instalasi, dll., paket komponen .dpk harus digunakan.
Pada versi setelah Delphi6 (saya tidak tahu tentang versi sebelum D5), ada beberapa file yang belum dirilis Delphi, seperti PROxies.
Jika file-file ini digunakan saat menginstal komponen, Anda dapat melewati file-file ini dan menggunakan paket yang berisi file-file tersebut.
Dalam contoh ini, editor properti menggunakan file DesignEditors, dan file Proxy diperlukan di DesignEditors, sehingga komponen ini dipublikasikan
Paket (.dpk) berisi designide, yang menyelesaikan masalah tidak adanya Proxy, sehingga instalasi komponen akan berhasil.
paket dsDlgPack;
...
memerlukan
rtl,
vcl,
VclSmp,
desain;
berisi
dsDlgWaitEx di 'dsDlgWaitEx.pas' {DlgWaitEx},
dsDlgWaitExReg di 'dsDlgWaitExReg.pas';
akhir.
(3) File registrasi komponen dsDlgWaitExReg.pas
Pertanyaan: Mengapa kita perlu menggunakan file seperti itu lebih sering? Karena:
Jika kode di dsDlgWaitExReg.pas digabungkan menjadi dsDlgWaitEx.pas, meskipun designide disertakan dalam dsDlgPack.dpk
Mengatasi masalah Proxy tidak ada pada saat instalasi komponen, namun masalah Proxy tidak ada tetap terjadi pada saat aplikasi memanggil komponen ini.
Karena file Proxy diperlukan di DesignEditors, kode berikut dibentuk menjadi file terpisah, dan aplikasi memanggil grup ini;
File tersebut tidak perlu menggunakan dsDlgWaitExReg.pas dan dapat melewati Proxy tanpa masalah apa pun.
satuan dsDlgWaitExReg;
antarmuka
menggunakan Kelas, Dialog, Formulir, dsDlgWaitEx, DesignIntf, DesignEditors;
jenis
TdsAVIFileNameProperty = class(TStringProperty) //Editor properti menggunakan file DesignEditors
publik
fungsi GetAttributes:TPropertyAttributes;override; //Metode override
prosedur Sunting;timpa; //penggantian metode
akhir;
prosedur Daftar;
pelaksanaan
prosedur Daftar;
mulai
//Daftarkan komponen ini ke halaman komponen Delisoft
RegisterComponents('Delisoft', [TdsWaitDialogEx]);
//Daftarkan editor properti ini
RegisterPropertyEditor(TypeInfo(string), TdsAVISource, 'NamaFile', TdsAVIFileNameProperty);
akhir;
{TdsAVIFileNameProperti}
fungsi TdsAVIFileNameProperty.GetAttributes:TPropertyAttributes;
mulai
hasil:=[paDialog];
akhir;
prosedur TdsAVIFileNameProperty.Edit;
mulai
dengan TOpenDialog.Create(aplikasi) lakukan
mencoba
Filter:='File AVI(*.avi)|*.avi|Semua File(*.*)|*.*';
jika Jalankan maka SetStrValue(NamaFile);
Akhirnya
bebas;
akhir;
akhir;
akhir.
(4) File komponen dsDlgWaitEx.pas
satuan dsDlgWaitEx;
{Tentukan semua properti dan metode komponen ini; di antaranya, properti BorderStyle dari formulir TDlgWaitEx adalah bsDialog. Dalam contoh ini, komponen TdsDlgWaitEx menggunakan formulir TDlgWaitEx, objek properti AVISource menggunakan TdsAVISource, yang diwarisi langsung dari TPersistent, dan properti enumerasi digunakan (DialogStyle, AVIPosition) dan properti rekaman (Options), dll.
}
antarmuka
kegunaan
Windows, Pesan, SysUtils, Varian, Kelas, Grafik, Kontrol, Formulir,
Dialog, StdCtrls, Pengukur, ComCtrls;
jenis
TDialogStyle = (dlgNormal, dlgStayOnTop);
TAVIPosition = (aviLeft, aviTop, aviBottom);
TDlgOptions = kumpulan (showAVI,showCaption,showMessage1,showMessage2,showProgress,ShowProgressText);
TDlgWaitEx = kelas(TForm)
Animate1: ANimate;
Pengukur1: Pengukur T;
Label1: Label;
Label2: TLabel;
procedure FormClose(Pengirim: TObject; var Action: TCloseAction);
pribadi
FCloseAfter: DWord;
FUserFormClose: TCloseEvent;
publik
properti UserFormClose: TCloseEvent baca FUserFormClose tulis FUserFormClose;
properti CloseAfter: DWORD baca FCloseAfter tulis FCloseAfter;
akhir;
TdsAVISource = kelas(TPersisten)
pribadi
FCommonAVI: TCommonAVI;
Nama File F: string;
prosedur SetCommonAVI(Nilai const: TCommonAVI);
prosedur SetFileName(Nilai const: string);
terlindung
publik
diterbitkan
properti CommonAVI: TCommonAVI baca FCommonAVI tulis SetCommonAVI default aviNone;
properti Nama File: string baca FfileName tulis SetFileName;
akhir;
TdsWaitDialogEx=kelas(TKomponen)
pribadi
//Membentuk
FDlgForm:TDlgWaitEx;
Pesan FM1: string;
Pesan FM2: string;
Pesan FM1Font:TFont;
Pesan FM2Font:TFont;
FCaption: string;
FDislogStyle:TDialogStyle;
FwordWrap:boolean;
Opsi FO: Opsi TDlg;
FShowMessage1,FShowMessage2:boolean;
//AVI
Posisi Favi: Posisi TAVI;
FAviAktif:boolean;
FshowAVI:boolean;
Sumber FAVIS : Sumber TdsAVIS;
//kemajuan
FProgressMax: bilangan bulat;
FProgressMin: bilangan bulat;
FProgressPos: bilangan bulat;
FProgressStep: bilangan bulat;
Kemajuan Fshow: Boolean;
FshowProgressTeks: Boolean;
//Peristiwa
FOnPosChange: TNotifyEvent;
FOnShow: TNotifyEvent;
FOnFormHide: TCloseEvent;
prosedur SetProgressMax(Nilai const: integer);
prosedur SetProgressMin(Nilai const: integer);
prosedur SetProgressPos(Nilai const: integer);
prosedur SetProgressStep(Nilai const: integer);
prosedur DrawForm;
fungsi setLableHeight(sCaption:string):integer;
prosedur setOptions(nilai const:TDlgOptions);
prosedur setMessage1(nilai const:string);
prosedur setMessage2(nilai const:string);
prosedur setCaption(nilai konstan:string);
prosedur SetMessage1Font(nilai const:TFont);
prosedur SetMessage2Font(nilai const:TFont);
fungsi IsMessage1FontStored: Boolean;
fungsi IsMessage2FontStored: Boolean;
set prosedurAVIPosition(Nilai const: TAVIPosition);
prosedur SetAVISource(Nilai const: TdsAVISource);
prosedur SetOnFormHide(Nilai const: TCloseEvent);
terlindung
prosedur DoPosChange;
prosedur DoShow;
publik
Buat konstruktor (Pemilik: TComponent);
destruktor Hancurkan;
Formulir prosedurTampilkan;
prosedur FormulirSembunyikan;
prosedur Pembaruan Formulir;
prosedur KemajuanStepIt;
diterbitkan
//Membentuk
properti Message1: string baca FMessage1 tulis setMessage1;
properti Message2: string baca FMessage2 tulis setMessage2;
properti Message1Font: TFont baca FMessage1Font tulis SetMessage1Font disimpan IsMessage1FontStored;
properti Message2Font: TFont baca FMessage2Font tulis SetMessage2Font disimpan IsMessage2FontStored;
properti Keterangan: string baca FCaption tulis setCaption;
properti DislogStyle:TDialogStyle baca FDislogStyle tulis FDislogStyle;
properti wordWrap :boolean baca FwordWrap tulis FwordWrap;
Opsi properti:TDlgOptions baca FOptions tulis setOptions;
//AVI
properti AviActive: boolean baca FAviActive tulis FAviActive;
properti AviPosition: TAVIPosition baca FaviPosition tulis setAVIPosition;
properti AviSource: TdsAVISource baca FAVISource tulis SetAVISource;
//Kemajuan
properti ProgressMax: bilangan bulat baca FProgressMax tulis SetProgressMax;
properti ProgressMin: bilangan bulat baca FProgressMin tulis SetProgressMin;
properti ProgressPos: bilangan bulat baca FProgressPos tulis SetProgressPos;
properti ProgressStep: bilangan bulat baca FProgressStep tulis SetProgressStep;
//Peristiwa
properti OnPosChange: TNotifyEvent baca FOnPosChange tulis FOnPosChange;
properti OnShow: TNotifyEvent baca FOnShow tulis FOnShow;
properti OnHide: TCloseEvent baca FOnFormHide tulis SetOnFormHide;
akhir;
pelaksanaan
{$R *.DFM}
{TdsAVISource}
prosedur TdsAVISource.SetCommonAVI(Nilai const: TCommonAVI);
mulai
jika Value = FCommonAVI lalu keluar;
FCommonAVI := Nilai;
NamaFile:='';
akhir;
prosedur TdsAVISource.SetFileName(Nilai const: string);
mulai
jika Nilai = FfileName lalu keluar;
NamaFile:=nilai;
FCommonAVI:=aviNone;
akhir;
{TdsWaitDialogEx}
prosedur TdsWaitDialogEx.DoShow;
mulai
jika Ditugaskan(FOnShow) maka FOnShow(Self);
akhir;
prosedur TdsWaitDialogEx.DoPosChange;
mulai
jika Ditugaskan(FOnPosChange) maka FOnPosChange(Self);
akhir;
prosedur TdsWaitDialogEx.SetAVISource(Nilai const: TdsAVISource);
mulai
jika FAVISource=nilai lalu keluar;
FAVISource.Assign(Nilai);
jika (FAVISource.FFileName='')dan(FAVISource.FCommonAVI=aviNone) maka FshowAVI:=false;
jika ditugaskan (FDlgForm) lalu
mulai
FDlgForm.Animate1.Aktif:=salah;
FDlgForm.Animate1.Nama File := '';
FDlgForm.Animate1.CommonAVI := aviNone;
jika FshowAVI lalu
mulai
jika FAVISource.FfileName='' lalu
FDlgForm.Animate1.CommonAVI := FAVISource.FCommonAVI
kalau tidak
FDlgForm.Animate1.FileName := FAVISource.FfileName;
FDlgForm.Animate1.Active:=true;
akhir;
DrawForm; //Animate1->Setelah AVI berubah, ukuran Animate1 dapat berubah ==> DrawForm
FDlgForm.Perbarui;
akhir;
akhir;
fungsi TdsWaitDialogEx.IsMessage1FontStored: Boolean;
mulai
dengan FMessage1Font lakukan
Hasil :=
(Nama <> 'MS Sans Serif') atau
(Gaya <> []) atau
(Ukuran <> 8) atau
(Warna <> clWindowText) atau
(Set Karakter <> DEFAULT_CHARSET) atau
(Pitch <> fpDefault);
akhir;
fungsi TdsWaitDialogEx.IsMessage2FontStored: Boolean;
mulai
dengan FMessage2Font lakukan
Hasil :=
(Nama <> 'MS Sans Serif') atau
(Gaya <> []) atau
(Ukuran <> 8) atau
(Warna <> clWindowText) atau
(Set Karakter <> DEFAULT_CHARSET) atau
(Pitch <> fpDefault);
akhir;
prosedur TdsWaitDialogEx.SetMessage1Font(Nilai const: TFont);
mulai
FMessage1Font.Assign(Nilai);
jika ditugaskan (FDlgForm) lalu
mulai
FDlgForm.Label1.Font.Assign(Nilai);
FDlgForm.Perbarui;
akhir;
akhir;
prosedur TdsWaitDialogEx.SetMessage2Font(Nilai const: TFont);
mulai
FMessage2Font.Assign(Nilai);
jika ditugaskan (FDlgForm) lalu
mulai
FDlgForm.Label2.Font.Assign(Nilai);
FDlgForm.Perbarui;
akhir;
akhir;
prosedur TdsWaitDialogEx.setCaption(nilai const:string);
mulai
jika value=FCaption lalu keluar;
FCaption:=nilai;
jika tidak (showCaption di FOptions) maka
mulai
Keterangan FC:='';
KELUAR;
akhir;
jika ditugaskan (FDlgForm) lalu
mulai
FDlgForm.Caption := nilai;
FDlgForm.perbarui;
akhir;
akhir;
prosedur TdsWaitDialogEx.setMessage1(nilai const:string);
var i: bilangan bulat;
mulai
jika value=FMessage1 lalu keluar;
Pesan FM1:=nilai;
jika ditugaskan (FDlgForm) lalu
mulai
jika tidak (showMessage1 di FOptions) maka keluar;
FDlgForm.Label1.Caption := nilai;
i:=setLableHeight(FMessage1)+13;
jika saya<>FDlgForm.Label1.Height lalu DrawForm;
FDlgForm.perbarui;
akhir;
akhir;
prosedur TdsWaitDialogEx.setMessage2(nilai const:string);
var i: bilangan bulat;
mulai
jika value=FMessage2 lalu keluar;
Pesan FM2:=nilai;
jika ditugaskan (FDlgForm) lalu
mulai
jika tidak (showMessage2 di FOptions) maka keluar;
FDlgForm.Label2.Caption := nilai;
i:=setLableHeight(FMessage2)+13;
jika saya<>FDlgForm.Label2.Height lalu DrawForm;
FDlgForm.perbarui;
akhir;
akhir;