Sejak mempelajari Delphi pada tahun 1999, saya terpesona dengan perkembangannya yang pesat. Saat itu, saya baru mengenal pemrograman dan saya sangat tertarik dengan pengembangan visual beberapa tahun terakhir, dari Delphi C/S hingga B/S tiga lapis, saya juga telah menulis beberapa perangkat lunak, besar dan kecil. , Saya pikir Delphi ini hanya memiliki fungsi-fungsi ini. Karena saya baru-baru ini mendapatkan buku "Com Essence" dan mempelajari kode sumber VCL, saya menemukan bahwa ini sangat kuat (saya tidak tahu kata-kata apa yang harus digunakan untuk menggambarkannya). , ada beberapa Terobosan yang dibagikan di sini kepada semua orang. Tolong beri tahu saya jika ada kesalahan.
Terus terang, komponen hanya mencakup dua jenis anggota: properti dan metode (metode yang saya bicarakan mencakup peristiwa)
Ini dibagi menjadi empat bagian:
Pribadi
terlindung
publik
diterbitkan
Arti dari keempat bagian di atas akan diperkenalkan dalam buku pengembangan visual secara umum. Berikut ini hanya gambaran singkat mengenai Delphi.
Pribadi: Semua anggota pribadi ditempatkan di sini dan hanya dapat diakses dengan metode kelas itu sendiri, bukan oleh subkelas, dan transparan terhadap subkelas. Dapat juga dikatakan hanya dapat diakses melalui metode unit itu sendiri.
dilindungi: kecuali dapat diwarisi oleh subkelas, selebihnya sama dengan privat. Tidak dapat diakses oleh orang luar.
publik: Publik, properti dan metode yang dideklarasikan di sini dapat dipanggil oleh pengguna.
diterbitkan: muncul di bilah properti lingkungan pengembangan Delphi.
Pertama, mari kita membuat kontrol yang paling sederhana. Dalam waktu kurang dari lima menit, Anda akan memahami cara pembuatan komponen pada panel komponen Delphi.
Baru->Baru->Komponen dan tekan Enter.
Kemudian pilih kelas induk yang ingin Anda warisi dalam tipe Leluhur :. Di sini kita memilih TComponent. Artinya mewarisi semua properti dan metode TComponent.
Class Name : Masukkan nama kelas dari komponen yang akan dibuat. (Kami memasukkan TShowText)
Halaman Palet: Panel mana di Delphi tempat komponen akan diinstal. (Kami memilih Sampel, Anda juga dapat memasukkan nama baru)
Saya tidak perlu mengatakan hal berikut.
Klik tombol OK, dan Delphi secara otomatis menghasilkan kontrol dasar yang diwarisi dari TComponent. Dapat juga dipahami bahwa kita telah mengembangkan kontrol yang sekuat TComponent, tapi ini bukan yang kita butuhkan.
Berikut ini penjelasan metode membaca dan menulis variabel privat dari komponen itu sendiri:
Misalnya, kami menulis paragraf pendek berikut:
pribadi
FTeks: String;
....
/*Variabel pribadi tidak diperbolehkan untuk digunakan oleh dunia luar, jadi bagaimana kita bisa mengoperasikan variabel string FText ini? */
Kita juga perlu menambahkan paragraf ini setelah Diterbitkan:
Teks properti: String baca FText tulis FText;
Artinya di sini adalah bahwa properti Teks ini akan muncul di bilah properti delphiSDK. Pengguna yang memodifikasi Teks di bilah properti sebenarnya sedang memodifikasi variabel string FText. read berarti pengguna membaca atribut Text dan benar-benar membaca FText. Write, tentu saja, berarti pengguna memberikan nilai pada Text dan menyimpannya dalam variabel string FText.
Jika Anda menyimpannya saat ini dan menginstalnya di Delphi, maka komponen paling dasar kita akan selesai. (Metode pemasangan komponen diperkenalkan di bagian akhir)
Haha, bukankah itu sangat sederhana? Hanya saja komponen kita tidak mempunyai kegunaan khusus.
Kami baru saja memperkenalkan atribut di sini, sekarang kami akan terus menambahkan fungsi untuk memperkenalkan penggunaan metode.
Kami menambahkan yang berikut ini setelah Publik:
prosedur TampilkanTeks();
Lalu tekan Ctrl + Alt +C, sistem secara otomatis menambahkan kode implementasi beberapa metode untuk Anda.
Selanjutnya kami menulis:
prosedur TShowText.ShowText();
mulai
TampilkanPesan(FTeks);
akhir;
Seperti yang Anda lihat, ShowMessage di atas menampilkan nilai variabel privat kelas. Sekarang Anda harus memahami bahwa variabel privat hanya dapat diakses dalam metode kelas itu sendiri. Di sini Anda harus menambahkan unit Dialog setelah digunakan, karena ShowMessage disertakan dalam unit Dialog, jika tidak maka tidak akan lolos.
Tentu saja event di atas hanya bisa digunakan di kontrol dan tidak bisa muncul di event bar di kotak properti. Karena metode yang dideklarasikan disini hanya Public saja, metode murni dan tidak dideklarasikan sebagai event.
Melalui pembelajaran di atas, apakah anda sudah mengetahui cara menulis dan mengatur properti serta metode kontrolnya?
Namun, kendali sebenarnya tidak dapat dipisahkan dari peristiwa, dan pemanggilan peristiwa harus didorong oleh pesan, yang akan diperkenalkan di artikel saya berikutnya.
Properti dan metode kontrol yang kuat tidaklah mudah. Hal ini membutuhkan lebih banyak latihan dan lebih banyak aplikasi.
Di bawah ini terlampir adalah kontrol DBGridToExcel yang saya tulis, yang fungsinya untuk mengekspor data di DBGrid ke Excel. Anda bisa mengambil hikmahnya dan menjadikannya sebagai referensi. Kontrol ini mencakup penggunaan properti, metode, dan "peristiwa" yang akan kita bahas di artikel berikutnya.
Lampiran 1: Cara memasang kontrol buatan sendiri:
(1). Di menu Komponen, pilih "Instal Komponen...".
(2). Klik "..." setelah nama File Unit, pilih file unit dari kontrol "*.pas", lalu klik OK. Klik "install" di jendela yang muncul, dan instalasi selesai.
Kontrol yang baru diinstal muncul di panel Anda.
Lampiran 2: Salin seluruh kode sumber kontrol TDBGridToExcel ke Notepad dan simpan sebagai file .pas.
unit DBGridToExcel;
{******************************************************* **************************}
{* *}
{* Ekspor Kontrol Grid Ke Word VCL untuk D5 & D6 *}
{* Hak Cipta(C) xiangding 2003.10.1 Semua hak dilindungi undang-undang *}
{* Laporan Bug: [email protected] *}
{* Penulis: Beruang Kecil*}
{* *}
{******************************************************* **************************}
{* *}
{* Ini adalah Versi Sederhana *}
{* *}
{******************************************************* **************************}
{* *}
{* Pasang: *}
{* Silakan Simpan sebagai file GridToExcel.pas lalu buka file tersebut *}
{* Klik item menu [Komponen] --> [Instal Komponen] *}
{* Klik tombol [Instal] pada dialog Instal Komponen *}
{* setelah instalasi, Anda dapat menemukan kontrolnya di komponen *}
{* halaman [contoh] *}
{* *}
{******************************************************* **************************}
{* *}
{* Pasang: *}
{* Simpan lampiran, lalu buka file GridToExcel.Pas dengan Delphi, *}
{* Pilih menu Delphi-->Komponen-->Instal Komponen, *}
{* Lalu pilih Instal. Setelah instalasi, pada halaman Contoh di panel kontrol, *}
{* Setelah Anda terbiasa, Anda dapat mencoba mengatur beberapa atribut kompleks dan menjelajahi sendiri atribut lainnya, *}
{******************************************************* **************************}
antarmuka
kegunaan
Windows, StdCtrls, ComCtrls, Pesan, DBGrids, Grafik, ExtCtrls,
Formulir, DB, ComObj, Kontrol, SysUtils, Kelas;
ResourceString
SPromptExport = 'Harap tunggu, data sedang diekspor...';
SConnectExcel = 'Memulai Excel, harap tunggu...';
SConnectExcelError= 'Gagal terhubung ke Excel. Excel mungkin tidak diinstal dan tidak dapat diekspor.';
SCBatal = '&Batal';
SError = 'kesalahan';
SConfirm = 'Apakah Anda benar-benar ingin menghentikan ekspor data? ';
SCaption = 'Konfirmasi';
SGridError = 'Tidak ada kumpulan data yang ditentukan, harap tentukan kontrol kumpulan data! ';
jenis
TDBGridToExcel = kelas(TKomponen)
pribadi
Formulir Kemajuan: TForm;
Kemajuan Fshow: Boolean;
ExcelApp : Varian;
FJudul: String;
Keluar: Boolean;
Kemajuan FOn: TNotifyEvent;
FGrid: TDBGrid; {Kisi Sumber}
Bilah Kemajuan: TProgressBar;
Perintah: TLabel;
FKeluar Otomatis: Boolean;
FUkuran Otomatis: Boolean;
FDBGrid: TDBGrid;
prosedur SetShowProgress(Nilai const: Boolean);
prosedur BuatProgressForm;
prosedur ButtonClick(Pengirim: TObject);
Fungsi ConnectToExcel: Boolean;
prosedur EksporDBGrid;
{Deklarasi pribadi}
terlindung
{ Deklarasi yang dilindungi }
publik
Buat Konstruktor (Pemilik: TComponent);
Penghancuran Destruktor();
Prosedur Ekspor Ke Excel; {Ekspor Grid Ke Excel}
{Pernyataan publik}
diterbitkan
{ Deklarasi yang dipublikasikan }
properti DBGrid: TDBGrid baca FDBGrid tulis FDBGrid;
Judul properti: String baca FTitle tulis FTitle;
properti ShowProgress: Boolean baca FshowProgress tulis SetShowProgress;
properti OnProgress: TNotifyEvent baca FOnProgress tulis FOnProgress;
akhir;
prosedur Daftar;
pelaksanaan
prosedur Daftar;
mulai
RegisterComponents('Sampel', [TDBGridToExcel]);
akhir;
{TDBGridToExcel}
prosedur TDBGridToExcel.ButtonClick(Pengirim: TObject);
mulai
Keluar := Kotak Pesan(ProgressForm.Handle, pchar(SConfirm), pchar(SCaption),
MB_OKCANCEL + MB_ICONINFORMATION) = IDOK;
akhir;
fungsi TDBGridToExcel.ConnectToExcel: Boolean;
mulai
Hasil := benar;
Mencoba
ExcelApp := CreateOleObject('Excel.aplikasi');
ExcelApp.Terlihat := Salah;
jika Judul<>'' maka ExcelApp.Caption := Judul;
ExcelApp.Buku Kerja.Tambahkan;
kecuali
Kotak Pesan(GetActiveWindow,PCar(SConnectExcelError),PCar(SError),Mb_OK+MB_IconError);
hasil := salah;
akhir;
akhir;
konstruktor TDBGridToExcel.Create(Pemilik: TComponent);
mulai
diwariskan;
FshowProgress := Benar; {Nilai defaultnya adalah Tunjukkan Kemajuannya}
FAutoExit := Salah;
FUkuranOtomatis := Benar;
akhir;
prosedur TDBGridToExcel.CreateProgressForm;
var
Panel: TPanel;
Tombol: Tombol T;
mulai
jika Ditugaskan(ProgressForm) lalu keluar; {Siap Buat?}
ProgressForm := TForm.Create(Pemilik);
Dengan ProgressForm lakukan
mulai
Font.Nama := '宋体';
Font.Ukuran := 10;
Gaya Perbatasan := bsTidak Ada;
Lebar := 280;
Tinggi := 120;
Lebar Batas := 1;
Warna := clLatar Belakang;
Posisi := poOwnerFormCenter;
akhir;
Panel := TPanel.Buat(ProgressForm);
dengan Panel lakukan { Buat Panel }
mulai
Induk := Formulir Kemajuan;
Sejajarkan := alClient;
BevelInner := bvNone;
BevelOuter := bvDibesarkan;
Keterangan := '';
akhir;
Perintah := TLabel.Buat(Panel);
dengan Prompt lakukan {Buat Label}
mulai
Induk := Panel;
Kiri := 20;
Atas := 25;
Keterangan := SConnectExcel;
akhir;
ProgressBar := TProgressBar.Buat(panel);
dengan ProgressBar lakukan { Buat ProgressBar }
mulai
Langkah := 1;
Induk := Panel;
Halus := benar;
Kiri := 20;
Atas := 50;
Tinggi := 18;
Lebar := 260;
akhir;
Tombol := TButton.Create(Panel);
dengan Tombol lakukan { Buat Tombol Batal }
mulai
Induk := Panel;
Kiri := 115;
Atas := 80;
Keterangan := Pindai;
OnClick := Klik Tombol;
akhir;
ProgressForm.Tampilkan;
Formulir Kemajuan.Pembaruan;
akhir;
destruktor TDBGridToExcel.Destroy;
mulai
diwariskan;
akhir;
prosedur TDBGridToExcel.ExportDBGrid;
var
Data: TDataSet;
ADBGrid: TDBGrid;
saya, j : bilangan bulat;
CurrentPoint : Penunjuk;
OldBeforeScroll, OldAfterScroll: TDataSetNotifyEvent;
mulai
Layar.Kursor := crHourGlass;
mencoba
mencoba
TForm(Pemilik).Diaktifkan := Salah;
ExcelApp.DisplayAlerts := salah;
ExcelApp.Pembaruan Layar := false;
Keluar := salah;
jika ShowProgress maka Prompt.Caption := SPromptExport;
ADBGrid := DBGrid;
Data := ADBGrid.DataSource.DataSet;
dengan ADBGrid lakukan { Sisipkan Header Tabel }
untuk i := 1 hingga Kolom.Hitungan lakukan
jika Kolom[i - 1].Terlihat kemudian
ExcelApp.Cells[1,i].Nilai :=Kolom[i - 1].Judul.Keterangan;
CurrentPoint := Data.GetBookmark; {Simpan Posisi Saat Ini}
OldBeforeScroll := Data.BeforeScroll; { Simpan Lama Sebelum Scroll Event handle }
OldAfterScroll := Data.AfterScroll; { Simpan Handle Acara AfterScroll Lama }
Data.DisableControls; { Nonaktifkan Kontrol }
Data.BeforeScroll := nihil;
Data.AfterScroll := nihil;
jika ShowProgress maka ProgressBar.Max := Data.RecordCount;
saya := 2;
Data.Pertama;
sementara bukan Data.Eof lakukan { Proses Semua catatan }
mulai
dengan ADBGrid lakukan { Memproses satu catatan }
untuk j := 1 ke Kolom.Hitungan lakukan
jika Kolom[j - 1].Terlihat kemudian
ExcelApp.Cells[i,j].Nilai := Kolom[j - 1].Field.DisplayText;
Inc(saya);
Data.Berikutnya;
jika Ditugaskan(FOnProgress) maka FOnProgress(Self);
jika ShowProgress maka { Perbarui Progress UI }
mulai
ProgressBar.StepIt;
Aplikasi.ProsesPesan;
jika Keluar maka keluar;
akhir;
akhir;
kecuali
Kotak Pesan(GetActiveWindow,PChar(SConnectExcelError),Pchar(SError),MB_OK+MB_ICONERROR);
akhir;
ExcelApp.Terlihat := Salah;
TForm(Pemilik).Diaktifkan := Benar;
Layar.Kursor := crDefault;
jika ShowProgress maka FreeAndNil(ProgressForm); { Formulir Kemajuan Gratis }
ExcelApp.DisplayAlerts := Benar;
ExcelApp.Pembaruan Layar := Benar;
Akhirnya
Data.BeforeScroll := OldBeforeScroll; { Kembalikan Event Handle Lama }
Data.AfterScroll := OldAfterScroll;
Data.GotoBookmark(CurrentPoint);
Data.FreeBookmark(CurrentPoint);
Data.EnableControls;
Layar.Kursor := crDefault;
akhir;
akhir;
prosedur TDBGridToExcel.ExportToExcel;
mulai
jika DBGrid= nil maka naikkan Exception.Create(SGridError); {Tidak Ada Sumber Data, lalu Error}
jika ShowProgress lalu CreateProgressForm {Apakah Menampilkan ProgressForm atau tidak}
jika bukan ConnectToExcel maka { Keluar ketika terjadi kesalahan }
mulai
jika ShowProgress maka FreeAndNil(ProgressForm);
KELUAR;
akhir;
EksporDBGrid; {mulai Mengekspor Data}
akhir;
prosedur TDBGridToExcel.SetShowProgress(Nilai const: Boolean);
mulai
Kemajuan Fshow := Nilai;
akhir;
akhir.