Delphi -- eksplorasi keterampilan:
{Tidak. 1}
Kalimat untuk membuat bentuk modal:
prosedur kelas TMyForm.RunForm(AObj1, AObj2: TObject);
var
vForm: TMyForm;
mulai
vForm := TMyForm.Create(aplikasi);
dengan vForm lakukan
Mencoba
InitForm(AObj1, AObj2);
TampilkanModal;
Akhirnya
Bebas;
akhir;
akhir;
//*menjelaskan:
Fungsi yang dideklarasikan melalui kelas mirip dengan fungsi statis di VC; gunakan pernyataan: TMyForm.RunForm(vObj1, vObj2);
Untuk informasi spesifik lainnya, silakan merujuk ke: deskripsi kelas di Bantuan Delphi.
Tujuan penekanan idiom ini adalah untuk:
1. Jika formulir ini digunakan di banyak tempat, Anda dapat memastikan bahwa kode ini dipanggil secara seragam;
2. Jika fungsinya diubah, misalnya: pemrosesan berdasarkan nilai kembalian ShowModal, maka ubah saja fungsi ini.
3. Program ini memiliki enkapsulasi yang baik dan mudah dirawat serta serah terima pekerjaan. *//
{No.2}//Penggunaan Tag
Respon terhadap peristiwa tombol toolbar formulir
prosedur TMyForm.RunOperate(ATag: Integer);
mulai
Kasus ATag dari
1: Tombol Saya.Warna := clMerah;
2: MyButton.Color := clHijau;
3: Tombol Saya.Warna := clHitam;
akhir;
akhir;
prosedur TMyForm.ToolBtnClick(Pengirim: TObject);
mulai
RunOperate(TControl(Pengirim).Tag);
akhir;
Jika Anda berada di menu drop-down dan perlu melakukan fungsi serupa,
procedure TMyForm.MenuItemClick(Pengirim: TObject);
mulai
RunOperate(TMenuItem(Pengirim).Tag);
akhir;
//*menjelaskan:
1. Struktur yang jelas
2. Informasi yang relevan dikonsentrasikan, sehingga lebih mudah untuk diperiksa, dimodifikasi dan dipelihara.
3. Meningkatkan kemampuan beradaptasi dan skalabilitas program; misalnya, jika persyaratan tidak diterapkan pada tombol toolbar, tetapi diterapkan pada tombol yang berbeda, maka akan mudah untuk dimodifikasi.
Saran: Setiap kategori hanya diikuti oleh satu baris atau beberapa baris kode. Jika kodenya banyak, gunakan fungsi proses saja.
Menariknya lagi saya sering menulis seperti berikut:
Kasus btnMyButton.Terlihat dari
{tunjukkan} Benar: ...
{Jangan tampilkan} Salah: ...
akhir; *//
{ No. 3 }//Penunjuk peristiwa sebagai parameter
//Gunakan penunjuk acara untuk membaca daftar, dll.
jenis
TDataSetEvent = prosedur (DataSet: TDataSet; AIndex, ACount: Integer) dari Objek;
//Kelas turunan dari TADOQuery
prosedur TMyADOQuery.EnumRecord(AWhereStr: String; APro: TDataSetEvent);
mulai
Menutup;
SQL.Hapus;
SQL.Add('Pilih * Dari Tabel1');
jika AWhereStr <> '' maka
SQL.Tambahkan('Dimana ' + AWhereStr);
Membuka;
Meskipun Tidak Eof Do
mulai
jika Ditugaskan(APro) maka APro(Self, RecNo, RecordCount);
Berikutnya;
akhir;
Menutup;
akhir;
//*menjelaskan:
Metode ini berasal dari fungsi API di Window untuk menghitung semua jendela anak saat ini, EnumChildWindow
1. Prinsip: Cobalah untuk memisahkan pembacaan data dari tampilan data, pemrosesan data, dll. Seperti: MVC, dll. Semuanya untuk tujuan ini.
2. Skalabilitas program telah ditingkatkan. Jika awalnya Anda ingin menampilkan atau memproses kolom informasi tertentu dalam daftar, tetapi kemudian diubah menggunakan ComboBox, saat memodifikasi program, Anda tidak perlu membaca bagian pembacaan data. , Anda hanya perlu mengubah tampilan informasi, dll. Contoh lainnya, Anda sekarang diharuskan menggunakan bilah kemajuan untuk menampilkan kemajuan membaca saat membaca catatan.
*//
{ No.4 } //Array konstan
{Di No.2, konten berikut diterapkan
prosedur TMyForm.RunOperate(ATag: Integer);
mulai
Kasus ATag dari
1: Tombol Saya.Warna := clMerah;
2: MyButton.Color := clHijau;
3: Tombol Saya.Warna := clHitam;
akhir;
akhir;
}
//Maka idealnya mengimplementasikannya menggunakan array.
prosedur TMyForm.RunOperate(ATag: Integer);
konstanta
MyButtonColorMax := 3;
MyButtonColor: array [1..MyButtonColorMax] dari TColor = (clRed, clGreen, clBlack);
mulai
Kasus ATag dari
1..MyButtonColorMax: MyButton.Color := MyButtonColor[ATag];
101:....
akhir;
akhir;
//*menjelaskan:
Untuk digunakan dalam mode array, perhatikan saja bahwa batas atas atau bawah array diimplementasikan menggunakan konstanta, dan kemudian coba gunakan konstanta ini untuk pembacaan loop array di penggunaan selanjutnya.
*//
{No. 5}Mekanisme pesan mengurangi fungsi publik kelas
//Cara meminimalkan definisi fungsi publik dalam suatu formulir;
{Misalnya: Jika Anda ingin mengimplementasikan formulir daftar properti dari kontrol formulir saat ini, ketika Anda perlu menyegarkan formulir properti; mengubah nilai properti tertentu; menambahkan properti baru, dll.; yang perlu diajak berinteraksi. Jika kita menggunakan fungsi publik kelas, kita perlu mendefinisikan banyak fungsi publik. Pada saat yang sama, jika konversi tipe formulir diperlukan, fungsi publik hanya dapat digunakan setelah mengonversi ke tipe formulir target. Oleh karena itu, akan ada situasi di mana dua unit harus saling menyertakan}
//Larutan:
TfrmMyForm = kelas(TForm)
Properti Ffrm: TForm;
akhir;
...
FfrmProperty := TfrmProperty.MyCreate(Aplikasi, Mandiri);
...
//Ketika jendela properti perlu disegarkan
FfrmProperty.Perform(WD_REFRESHPROPERTYLIST, 0, 0);
TfrmProperti = kelas(TForm)
pribadi
Formulir FMy: Formulir T;
prosedur WDREFRESHPROPERTYLIST(var Pesan: TMessage); pesan WD_REFRESHPROPERTYLIST;
publik
konstruktor MyCreate(Pemilik: TComponent; AForm: TForm);
akhir;
konstruktor TfrmProperty.MyCreate(Pemilik: TComponent; AForm: TForm);
mulai
warisan Buat(Pemilik);
FMyForm := Formulir;
akhir;
//* Untuk cara penggunaan pesan, definisi fungsi publik dari form dapat dikurangi. Pada saat yang sama, ini meningkatkan skalabilitas program. Jika Anda menggunakan formulirnya, itu dapat dikonversi dengan mudah, karena paling banyak itu adalah formulir Anda dan tidak memproses pesan saat ini*)//
{No. 6}Gunakan daftar pendaftaran untuk mengelola kemungkinan modul perluasan
//Proyek: Anda diharuskan mendukung beberapa metode tampilan keluaran untuk kumpulan data
...Contoh akan diberikan nanti
//* ilustrasikan:
1. "Beberapa metode keluaran" berarti bahwa metode keluaran mungkin sering diperluas dalam aplikasi masa depan, sehingga skalabilitas metode keluaran yang mudah harus dipertimbangkan selama perancangan program.
2. Mengacu pada mekanisme registrasi kontrol (RegisterComponents) di VCL, Anda dapat menemukan bahwa sejumlah besar mekanisme registrasi digunakan di VCL; yang lebih klasik adalah registrasi editor properti kontrol.
*//
{No.7}Gunakan versi program kontrol yang telah ditentukan sebelumnya
//Jika Anda melakukan program platform pengembangan sekunder, Anda harus melibatkan masalah kontrol versi produk dan kontrol versi proyek
//Biasanya dikontrol menggunakan metode yang telah ditentukan sebelumnya
//Pernyataannya relatif sederhana:
{$DEFINISIKAN JOYYUAN97}
{$IFDEF JOYYUAN97} {ELSE} {ENDIF}
{$UNDEF JOYYUAN97}
*menjelaskan:
1. Bagilah predefinisi menjadi beberapa file terpisah.
2. Di awal setiap unit tetapi setelah Unit, gunakan {$I ...} untuk memasukkan file ke dalam unit saat ini.
3. Mengontrol file unit yang dapat ditampung oleh unit saat ini berdasarkan kondisi yang telah ditentukan sebelumnya
4. Cobalah untuk memisahkan file yang telah ditentukan sebelumnya untuk proyek tersebut. Setelah memasukkan semua file yang telah ditentukan sebelumnya, sertakan file ini, beberapa file yang telah ditentukan sebelumnya dapat dibatalkan sesuai dengan kebutuhan proyek.
*//
{No. 8}Gunakan penunjuk fungsi untuk mengurangi penyertaan proyek unit
//Saya sering berpikir bahwa mengurangi inklusi unit adalah langkah awal dalam menjadikan unit publik, lalu bagaimana cara mengurangi inklusi unit sebanyak mungkin
//Artinya, upaya yang lebih besar harus dilakukan untuk mengurangi penggabungan unit-unit program.
{Deskripsi skenario:
TMyFormManager: Kelas manajemen formulir
TMyForm: Kelas dasar formulir data
TMyFormaccess: Formulir penyimpanan informasi dan kelas membaca. Simpan informasi formulir ke database atau jenis struktur lainnya
menganalisa:
1. Kelas dasar formulir (TMyForm) dan kelas manajemen formulir (TMyFormManager) perlu diimplementasikan di unit uManagers.
2. Unit kelas implementasi khusus formulir (TMyImageForm) fMyImange perlu menyertakan unit uManagers untuk pewarisan formulir dan manajemen formulir.
3. Unit kelas membaca data formulir (TMyFormAccess) uMyAccess perlu menyertakan unit uManagers dan unit fMyImange
pertanyaan:
Jika saya ingin menyimpan formulir, itu harus dilakukan di tombol acara formulir. Jika menyangkut unit formulir, maka harus berisi unit kelas akses data formulir, dan jika ditempatkan di kelas dasar formulir, unit uManager harus berisi unit uMyAccess.
Inklusi sel merupakan bahaya ketika akses data, yaitu format penyimpanan data, berubah berdasarkan kebutuhan dan memerlukan skalabilitas.
Solusi: Gunakan variabel penunjuk fungsi.
1. Tentukan variabel penunjuk fungsi di unit uManagers untuk menyimpan informasi data.
2. Tetapkan nilai pada variabel penunjuk fungsi ini saat aplikasi diinisialisasi.
3. Jika informasi formulir perlu disimpan, tentukan apakah penunjuknya tidak kosong, lalu jalankan fungsi untuk menyimpan informasi formulir.
{No. 9}Konstanta, pahami konstanta, gunakan konstanta
Ada banyak buku yang memperkenalkan pentingnya definisi konstanta, dan saya sering memikirkannya, tetapi ketika saya melihat kode sumber VCL, saya menyadari bahwa saya telah mengabaikan penggunaan konstanta oleh orang lain.
1. Definisi pesan yang sering kita gunakan adalah: mendeklarasikan sebuah konstanta dan kemudian menggunakannya pada waktu yang tepat.
Secara umum didefinisikan dan digunakan:
konstanta
WD_Pesan Saya = WM_Pengguna + 101;
jenis
TMyForm = kelas(TForm)
...
prosedur WDMyMessage(var pesan: TMessage); pesan WD_MyMessage; {posisi pesan respons}
akhir;
Namun, jika Anda menulis ulang pernyataan {response message position} sebagai:
prosedur WDMyMessage(var pesan: TMessage); pesan WM_User + 101;
Demikian pula kompilasi bisa berhasil dan penggunaannya normal. Oleh karena itu, definisi konstanta sangat umum digunakan dalam pemrosesan dan antarmuka sistem Window.
2. Di Delphi, kami telah mendefinisikan variabel warna, clRed, clGreen, dll., yang juga merupakan konstanta untuk memfasilitasi penggunaan di masa mendatang. Melalui pengamatan ini, saya menemukan bahwa definisi konstanta harus dapat digunakan kembali sebagian dalam proyek. Oleh karena itu, satuan konstanta standar dapat ditentukan sehingga konstanta yang ditentukan dapat digunakan kembali di setiap proyek.
{No. 10}Array yang umum digunakan di Delphi
Ada implementasi yang relatif lengkap di Delphi untuk definisi dan penggunaan array tipe TidentMapEntryd.
TIdentMapEntry = catatan
Nilai: Bilangan Bulat;
Nama: Tali;
akhir;
1. Definisi array: array[0..ArrMax] dari TidentMapEntry
Silakan merujuk ke: Unit kontrol:
Kursor: array[0..21] dari TidentMapEntry = (
...
);
2. Dua fungsi yang saling mengevaluasi: IntToIdent (menemukan Nama dari Nilai) dan IdentToInt (menemukan Nilai dari Nama);
Untuk aplikasi spesifik, silakan merujuk ke: IdentToCursor dan CursorToIdent.
3. Aplikasi: a. Langsung menerapkan metode definisi grup pohon dan fungsi manipulasi array; b. Pelajari cara mengakses dan memanipulasi array dalam fungsi. c. Pelajari definisi fungsi akses informasi standar: function IntToIdent(Int: Longint; var Ident: string; const Map: array of TidentMapEntry): Boolean; Informasi spesifik yang dikembalikan dikembalikan oleh parameter dilewatkan melalui fungsi Nilai pengembalian Boolean dinilai.
{No. 11}Dari kasus khusus hingga penemuan umum
Saya menemukan melalui menelusuri definisi dan fungsi operasi Kursor:
1. Seperti yang diperkenalkan di {No. 10}, generalisasikan definisi dan operasi umum Kursor.
2. Menyediakan fungsi untuk konversi antara Int dan Ident.
3. Menyediakan fungsi untuk membaca informasi daftar array secara siklis: GetCursorValues; di antaranya, metode "event pointer sebagai parameter" yang diperkenalkan di {No. 3} digunakan untuk membaca informasi daftar.
Tambahan untuk {No. 6}:
contoh:
prosedur RegisterComponents(Halaman const: string;
ComponentClasses: array dari TComponentClass);
mulai
jika Ditugaskan(RegisterComponentsProc) lalu
RegisterComponentsProc (Halaman, Kelas Komponen)
kalau tidak
naikkan EComponentError.CreateRes(@SRegisterError);
akhir;
Interpretasi:
1. Gunakan metode registrasi untuk mencatat jenis kontrol yang dapat digunakan, dll.
3. Untuk RegisterComponentsProc, metode "menggunakan penunjuk fungsi untuk mengurangi penyertaan proyek unit" di {No. 8} digunakan untuk memfasilitasi perluasan program di masa mendatang, peningkatan versi, dll.
{No. 11}Hanya tentukan satu fungsi publik
//Deskripsi proyek: Sekarang kita perlu mengimplementasikan gambar CAD atau sistem Visio, yang memerlukan skalabilitas yang baik dan perawatan yang mudah;
//Dan hal ini memerlukan kopling rendah, sehingga bagian dari sistem atau sistem yang diperluas dapat dikemas dan digunakan secara langsung dalam proyek mendatang.
desain:
1. Rancang kelas abstrak objek grafis. Di kelas ini, tentukan fungsi abstrak CadPerform. Parameter fungsi mengacu pada fungsi TControl.Perform(Pesan: Cardinal; WParam, LParam: Longint): Longint;
2. Di kelas manajemen grafik, terapkan pengelolaan daftar objek grafik. Yang disimpan dalam daftar adalah penunjuk objek abstrak.
3. Saat Anda ingin mengontrol objek kelas tertentu, Anda hanya perlu menggunakan fungsi CanPerform, lalu meneruskan Msg sesuai dengan kategori operasi saat ini, dan meneruskan informasi parameter yang sesuai.
Implementasi: TCad adalah kelas kontrol tingkat pertama yang diwarisi dari kelas abstrak
fungsi TCad.CadPerform(Pesan: Kardinal; WParam, LParam: Longint): Longint;
mulai
Kasus Msg
Pesan_Saya1: Hasil := Pesan Saya1(WParam, LParam);
Pesan_Saya2: Hasil := Pesan Saya2(WParam, LParam);
akhir;
akhir;
Sebab, TPoint mewarisi dari TCad, fungsi CadPerform diimplementasikan sebagai berikut.
fungsi TPoint.CadPerform(Pesan: Kardinal; WParam, LParam: Longint): Longint;
mulai
Kasus Msg
My_Message1: Hasil := MyMessage1(WParam, LParam); //Pemrosesan jenis operasi ini di TCad diblokir
My_Message3: Hasil := MyMessage3(WParam, LParam);
else Hasil := warisan CadPerform(Msg, WParam, LParam);
akhir;
akhir;
*menjelaskan:
Karena kami sangat sering mengoperasikan objek grafis, kami mendefinisikan fungsi antarmuka publik dan terbuka untuk mencapai enkapsulasi kelas yang tinggi serta pemeliharaan dan perluasan program yang mudah.
*//
{Tidak.12}
Berikut ini adalah persyaratan pemrograman saya: (Beberapa informasi tidak memiliki batasan bahasa)
//Hampir semua solusi berikut dapat ditemukan pada metode di atas.
1. Mengurangi kompleksitas program. a. Kurangi jumlah fungsi, gunakan metode Case dan Tag, dan pelajari cara mendefinisikan Perform b. Kurangi hubungan unit yang bertumpuk, gunakan metode penyampaian pesan, dan kurangi penyertaan unit formulir secara timbal balik;
2. Kurangi
{No. 13} Gunakan penyiaran untuk mengimplementasikan notifikasi dari kelas manajemen ke objek daftar manajemen
//Untuk deskripsi proyek {No. 12}, ketika properti atau status kontrol formulir gambar berubah, sering kali perlu memberi tahu semua objek grafik dan membuat perubahan terkait.
//Jika hanya satu fungsi siaran yang ditentukan, pemberitahuan orang tua-anak dapat direalisasikan, yang juga akan meningkatkan kegunaan kembali, skalabilitas, kemudahan pemeliharaan, dll. dari program dan membuat struktur kelas menjadi jelas.
//Misalnya: 1. Di Visio dan MapInfo, jika skala (rasio zoom) dari bentuk saat ini berubah, semua objek grafik yang sedang ditampilkan perlu digambar ulang dengan skala baru. 2. Ketika font formulir default dari formulir saat ini diubah, font teks objek grafik yang menggunakan font formulir secara default untuk menampilkan informasi teks juga harus diubah.
//Solusi, lihat mekanisme pemrosesan di TWinControl yang memberi tahu semua sub-Kontrol ketika atribut atau status berubah:
prosedur TWinControl.NotifyControls(Pesan: Word);
var
Pesan: Pesan;
mulai
Pesan.Pesan := Pesan;
Pesan.WParam := 0;
Pesan.LParam := 0;
Pesan.Hasil := 0;
Siaran(Pesan);//Siarkan pesan perubahan saat ini
akhir;
di dalam:
prosedur TwinControl.Broadcast(var Pesan);
var
Saya: Bilangan Bulat;
mulai
untuk I := 0 hingga ControlCount - 1 lakukan
mulai
Kontrol[I].WindowProc(TMessage(Pesan));
//Ubah ke: dengan TMessage(Message) do Cads[I].CadPerform(msg, WParam, LParam);
jika TPessage(Pesan).Hasil <> 0 lalu Keluar;
akhir;
akhir;
Namun, ketika kita berurusan dengan objek grafis, kita dapat langsung memanggil fungsi publik CanPerform dari Cads.
{No. 14}Buat objek Anda secara dinamis bila diperlukan
Misalnya: http://www.delphibbs.com/keylife/iblog_show.asp?xid=824
//************Opsi 2: Buat formulir properti bila diperlukan
kegunaan
...
fProperti;
jenis
TfrmMyMap = kelas
...
prosedur OnfrmMyMapDestroy(Pengirim: TObject);
prosedur OnMapGeoSelected(AGEo: TGeometry);
pribadi
Properti Ffrm: Properti Tfrm;
procedure ShowPropertyForm(aVisible: Boolean);
publik
akhir;
procedure TfrmMyMap.ShowPropertyForm(aVisible: Boolean);
mulai
jika Tidak Ditugaskan(FfrmProperty) maka FfrmProperty := TfrmProperty.Create(Application);
FfrmProperty.Visible := aVisible;
akhir;
prosedur TfrmMyMap.OnfrmMyMapDestroy(Pengirim: TObject);
mulai
jika Ditugaskan(FfrmProperty) maka FfrmProperty.Free;
akhir;
prosedur TfrmMyMap.OnMapGeoSelected(AGEo: TGeometry);
mulai
jika Ditugaskan(FfrmProperty) maka FfrmProperty.MyRefresh(AGEo);
akhir;
Di sini dijelaskan:
1. Buat objek FfrmProperty Anda secara dinamis bila diperlukan
2. Saat objek saat ini dilepaskan, tentukan legalitas objek Anda, lalu lepaskan objek yang dibuat secara dinamis.
{No. 15}Buat antarmuka atau buat struktur
//Deskripsi proyek: Saat saya mengembangkan kontrol tabel, jika saya menyetel sel ke Com, jika ada terlalu banyak informasi di tabel, kecepatan pemuatan tidak dapat dijamin, dan bahkan ada kemungkinan crash. Alasan saya menggunakan Com adalah agar pemrosesan dan informasi setiap sel dapat diperluas di luar kendali di masa mendatang.
Solusi saya adalah: membuat instance untuk setiap kontrol yang berasal dari Sel, dan secara dinamis membuat beberapa objek struktur Rekam untuk mencatat informasi setiap sel, tetapkan penunjuk objek struktur ke komponen Sel, hasil pengujiannya adalah sangat memuaskan.
Oleh karena itu, jika Anda perlu menggunakan instance Com dalam jumlah besar, cobalah untuk mengelola dan memelihara satu instance, dan data di dalamnya dapat dibuat dan dikelola secara dinamis, yang akan berdampak baik dalam hal kecepatan.
Selain itu, coba deklarasikan penunjuk antarmuka pMyInterface = ^IMyInterface. Saat meneruskan atau menggunakan parameter, gunakan penunjuk antarmuka secara langsung. Hal ini dapat mengurangi jumlah panggilan ke fungsi penghitungan _AddInft, dll., dan juga dapat meningkatkan kecepatan jika pengoperasiannya biasa saja.