Buat dan Kustomisasi Tombol Dengan DBNavigator

"Oke, DBNavigator melakukan tugasnya menavigasi data dan mengelola catatan. Sayangnya, pelanggan saya menginginkan pengalaman yang lebih ramah pengguna, seperti grafik tombol khusus dan teks,... "

Pertanyaan ini datang dari a Pengembang delphi mencari cara untuk meningkatkan kekuatan komponen DBNavigator.

DBNavigator adalah komponen yang hebat — ia menyediakan antarmuka seperti VCR untuk menavigasi data dan mengelola catatan dalam aplikasi basis data. Navigasi rekam disediakan oleh tombol Pertama, Selanjutnya, Sebelum, dan Terakhir. Manajemen rekaman disediakan oleh tombol Edit, Posting, Batal, Hapus, Sisipkan, dan Refresh. Dalam satu komponen, Delphi menyediakan semua yang Anda butuhkan, untuk beroperasi pada data Anda.

Namun, seperti yang dinyatakan oleh penulis pertanyaan e-mail, DBNavigator tidak memiliki beberapa fitur seperti mesin terbang kustom, keterangan tombol, dan lainnya.

DBNavigator yang Lebih Kuat

Banyak komponen Delphi memiliki properti dan metode yang berguna yang ditandai tidak terlihat ("dilindungi") oleh pengembang Delphi. Mudah-mudahan, untuk mengakses anggota komponen yang dilindungi tersebut, teknik sederhana yang disebut "retasan terproteksi" dapat digunakan.

instagram viewer

Pertama, Anda akan menambahkan judul untuk setiap tombol DBNavigator, kemudian Anda akan menambahkan grafik khusus, dan akhirnya, Anda akan OnMouseUp-aktifkan setiap tombol.

Dari DBNavigator "membosankan" ke salah satu dari:

  • Gambar standar dan teks khusus
  • Hanya keterangan
  • Grafik khusus dan teks khusus

Ayo Rock 'n Roll

DBNavigator memiliki properti Buttons yang dilindungi. Anggota ini adalah array dari TNavButton, turunan dari TSpeedButton.

Karena setiap tombol di properti yang dilindungi ini mewarisi dari TSpeedButton, jika Anda mendapatkannya, Anda akan dapat bekerja dengan properti TSpeedButton "standar" seperti: Keterangan (string yang mengidentifikasi kontrol ke pengguna), Mesin Terbang (bitmap yang muncul pada tombol), Tata Letak (menentukan di mana gambar atau teks muncul pada tombol)...

Dari unit DBCtrls (di mana DBNavigator didefinisikan) Anda "membaca" bahwa properti Buttons yang dilindungi dinyatakan sebagai:

Tombol: Himpunan[TNavigateBtn] dari TNavButton;

Di mana TNavButton mewarisi dari TSpeedButton dan TNavigateBtn adalah enumerasi, didefinisikan sebagai:

TNavigateBtn = 
(nbFirst, nbPrior, nbNext, nbLast, nbInsert,
nbDelete, nbEdit, nbPost, nbCancel, nbRefresh);

Perhatikan bahwa TNavigateBtn memiliki 10 nilai, masing-masing mengidentifikasi tombol yang berbeda pada objek TDBNavigator. Sekarang, mari kita lihat cara meretas DBNavigator:

DBNavigator yang disempurnakan

Pertama, atur formulir pengeditan data Delphi sederhana dengan menempatkan setidaknya DBNavigator, a DBGrid, DataSoure, dan a Objek dataset pilihan Anda (ADO, BDE, dbExpres, ...). Pastikan semua komponen "terhubung".

Kedua, retas DBNavigator dengan mendefinisikan kelas "dummy" yang diwarisi, di atas deklarasi Formulir, seperti:

Tipe THackDBNavigator = kelas(TDBNavigator);
Tipe
TForm1 = kelas(TForm)
...

Selanjutnya, untuk dapat menampilkan teks dan gambar khusus pada setiap tombol DBNavigator, Anda harus menyiapkan beberapa mesin terbang. Anda dapat menggunakan komponen TImageList dan menetapkan 10 gambar (.bmp atau .ico), masing-masing mewakili aksi tombol tertentu dari DBNavigator.

Ketiga, di Acara OnCreate untuk Form1, tambahkan panggilan seperti:

prosedur TForm1.FormCreate (Pengirim: TObject);
SetupHackedNavigator (DBNavigator1, ImageList1);
akhir;

Pastikan Anda menambahkan deklarasi prosedur ini di bagian pribadi dari deklarasi formulir, seperti:

Tipe
TForm1 = kelas(TForm)
...
prosedur privat SetupHackedNavigator (const Navigator: Navigasi TDBN;
const Mesin Terbang: TImageList);
...

Keempat, tambahkan prosedur SetupHackedNavigator. Prosedur SetupHackedNavigator menambahkan grafik khusus ke setiap tombol dan memberikan judul khusus untuk setiap tombol.

menggunakan Tombol; //!!! jangan lupa
prosedur TForm1.SetupHackedNavigator
(const Navigator: Navigasi TDBN;
const Mesin Terbang: TImageList);
const
Keterangan: Himpunan[TNavigateBtn] string =
('Initial', 'Previous', 'Later', 'Final', 'Add',
'Hapus', 'Benar', 'Kirim', 'Tarik', 'Bangkit');
(*
Keterangan: array [TNavigateBtn] dari string =
('Pertama', 'Sebelum', 'Selanjutnya', 'Terakhir', 'Sisipkan',
'Hapus', 'Edit', 'Posting', 'Batal', 'Refresh');

di Kroasia (dilokalkan):
Keterangan: array [TNavigateBtn] dari string =
('Prvi', 'Prethodni', 'Slijedeci', 'Zadnji', 'Dodaj',
'Obrisi', 'Promjeni', 'Spremi', 'Odustani', 'Osvjezi');
*)
var
btn: TNavigateBtn;
mulai untuk btn: = Rendah (TNavigateBtn) untuk Tinggi (TNavigateBtn) lakukan dengan THackDBNavigator (Navigator). Tombol [btn] dobegin// dari array const Teks
Keterangan: = Keterangan [btn];
// jumlah gambar di properti Glyph
NumGlyphs: = 1;
// Hapus mesin terbang tua.
Mesin terbang: = nol;
// Tetapkan yang khusus
Mesin terbang. GetBitmap (Integer (btn), Glyph);
// gylph teks di atas
Layout: = blGlyphTop;
// dijelaskan nanti
OnMouseUp: = HackNavMouseUp;
akhir;
akhir; (* SetupHackedNavigator *)

Ok, mari kita jelaskan. Anda beralih melalui semua tombol di DBNavigator. Ingatlah bahwa setiap tombol dapat diakses dari properti Buttons array yang dilindungi — oleh karena itu diperlukan kelas THackDBNavigator. Karena jenis array Buttons adalah TNavigateBtn, Anda beralih dari "pertama" (menggunakan Rendah tombol) ke tombol "terakhir" (menggunakan tombol Tinggi fungsi) satu. Untuk setiap tombol, Anda cukup menghapus mesin terbang "lama", menetapkan yang baru (dari parameter Glyphs), menambahkan keterangan dari susunan teks dan menandai tata letak mesin terbang.

Perhatikan bahwa Anda dapat mengontrol tombol mana yang ditampilkan oleh DBNavigator (bukan yang diretas) melalui properti VisibleButtons. Properti lain yang nilai defaultnya mungkin ingin Anda ubah adalah Petunjuk — gunakan untuk memasok Petunjuk Bantuan pilihan Anda untuk tombol navigator individual. Anda dapat mengontrol tampilan Petunjuk dengan mengedit properti ShowHints.

Itu dia. Inilah sebabnya mengapa Anda memilih Delphi!

Beri aku lebih!

Kenapa berhenti di sini? Anda tahu bahwa ketika Anda mengklik tombol 'nbNext' posisi dataset saat ini maju ke catatan berikutnya. Bagaimana jika Anda ingin pindah, katakanlah, 5 catatan ke depan jika pengguna memegang kunci CTRL sambil menekan tombol? Bagaimana tentang itu?

DBNavigator "standar" tidak memiliki acara OnMouseUp — yang membawa parameter Shift dari TShiftState — memungkinkan Anda untuk menguji keadaan tombol Alt, Ctrl, dan Shift. DBNavigator hanya menyediakan acara OnClick untuk Anda tangani.

Namun, THackDBNavigator dapat dengan mudah mengekspos acara OnMouseUp dan memungkinkan Anda untuk "melihat" keadaan tombol kontrol dan bahkan posisi kursor di atas tombol tertentu ketika diklik!

Ctrl + Click: = 5 Baris Di Depan

Untuk mengekspos OnMouseUp, Anda cukup menetapkan prosedur penanganan acara khusus untuk acara OnMouseUp untuk tombol DBNavigator yang diretas. Ini sebenarnya sudah dilakukan dalam prosedur SetupHackedNavigator:
OnMouseUp: = HackNavMouseUp;

Sekarang, prosedur HackNavMouseUp dapat terlihat seperti:

prosedur TForm1.HackNavMouseUp
(Pengirim: TObject; Tombol: TMouseButton;
Shift: TShiftState; X, Y: Integer);
const MoveBy: integer = 5;
mulai jikaTIDAK (Pengirim adalah TNavButton) kemudian Keluar;
kasus TNavButton (Pengirim) .Index dari
nbPrior:
jika (ssCtrl dalam Shift) kemudian
TDBNavigator (TNavButton (Pengirim) .Parent).
Sumber data. Himpunan data. MoveBy (-MoveBy);
nbNext:
jika (ssCtrl dalam Shift) kemudian
TDBNavigator (TNavButton (Pengirim) .Parent).
Sumber data. Himpunan data. MoveBy (MoveBy);
akhir;
akhir; (* HackNavMouseUp *)

Perhatikan bahwa Anda perlu menambahkan tanda tangan dari prosedur HackNavMouseUp di dalam bagian pribadi dari deklarasi formulir (dekat deklarasi prosedur SetupHackedNavigator):

Tipe
TForm1 = kelas(TForm)
...
prosedur privat SetupHackedNavigator (const Navigator: Navigasi TDBN;
const Mesin Terbang: TImageList);
prosedur HackNavMouseUp (Pengirim: TObject; Tombol: TMouseButton;
Shift: TShiftState; X, Y: Integer);
...

Ok, mari kita jelaskan, sekali lagi. Prosedur HackNavMouseUp menangani acara OnMouseUp untuk setiap tombol DBNavigator. Jika pengguna memegang kunci CTRL sambil mengklik tombol nbNext, catatan saat ini untuk dataset yang ditautkan dipindahkan "MoveBy" (didefinisikan sebagai konstan dengan nilai 5) ke depan.

Apa? Berlebihan?

Ya. Anda tidak perlu dipusingkan dengan semua ini jika Anda hanya perlu memeriksa status tombol kontrol ketika tombol diklik. Inilah cara melakukan hal yang sama di "biasa" Acara OnClick dari DBNavigator "biasa":

prosedur TForm1.DBNavigator1Klik
(Pengirim: TObject; Tombol: TNavigateBtn);
fungsi CtrlDown: Boolean;
var
Negara: TKeyboardState;
mulai
GetKeyboardState (Negara Bagian);
Hasil: = ((Status [vk_Control] Dan 128) 0);
akhir;
const MoveBy: integer = 5;
begincase Tombol dari
nbPrior:
jika CtrlDown kemudian
DBNavigator1.DataSource. Himpunan data. MoveBy (-MoveBy);
nbNext:
jika CtrlDown kemudian
DBNavigator1.DataSource. Himpunan data. MoveBy (MoveBy);
akhir; //case
akhir; (* DBNavigator2Klik *)

Itu Semua Orang

Dan akhirnya, proyek selesai. Atau Anda bisa terus berjalan. Inilah skenario / tugas / ide untuk Anda:

Katakanlah Anda hanya ingin satu tombol untuk menggantikan tombol nbFirst, nbPrevious, nbNext, dan nbLast. Anda dapat menggunakan parameter X, dan Y di dalam prosedur HackNavMouseUp untuk menemukan posisi kursor ketika tombol dilepaskan. Sekarang, untuk tombol yang satu ini ("untuk mengatur semuanya") Anda dapat melampirkan gambar yang memiliki 4 area, masing-masing area seharusnya meniru salah satu tombol yang Anda ganti... mengerti maksudnya?

instagram story viewer