DBNavigator ile Düğmeler Oluşturun ve Özelleştirin

"Tamam, DBNavigator, verileri gezinme ve kayıtları yönetme işini yapıyor. Maalesef, müşterilerim özel düğme grafikleri ve resim yazıları gibi daha kullanıcı dostu bir deneyim istiyorlar... "

Bu soruşturma bir Delphi geliştiricisi DBNavigator bileşeninin gücünü artırmanın bir yolunu arıyor.

DBNavigator mükemmel bir bileşendir - veri uygulamalarında gezinmek ve veritabanı uygulamalarındaki kayıtları yönetmek için VCR benzeri bir arayüz sağlar. Kayıt navigasyonu İlk, Sonraki, Önceki ve Son düğmeleri tarafından sağlanır. Kayıt yönetimi Düzenle, Gönder, İptal, Sil, Ekle ve Yenile düğmeleri tarafından sağlanır. Delphi, tek bir bileşende verileriniz üzerinde çalışmak için ihtiyacınız olan her şeyi sağlar.

Ancak, e-posta sorgusunun yazarının da belirttiği gibi, DBNavigator özel glifler, düğme başlıkları ve diğerleri gibi bazı özelliklerden yoksundur.

Daha Güçlü Bir DBNavigator

Birçok Delphi bileşeni, bir Delphi geliştiricisi tarafından görünmez ("korumalı") olarak işaretlenmiş kullanışlı özelliklere ve yöntemlere sahiptir. Umarım, bir bileşenin bu tür korunan üyelerine erişmek için "korumalı kesmek" adı verilen basit bir teknik kullanılabilir.

instagram viewer

İlk olarak, her DBNavigator düğmesine bir başlık ekleyeceksiniz, ardından özel grafikler ekleyeceksiniz ve son olarak, her düğmeyi OnMouseUp'ı etkinleştireceksiniz.

"Sıkıcı" DBNavigator'dan şunlardan birine:

  • Standart grafikler ve özel altyazılar
  • Yalnızca altyazılar
  • Özel grafikler ve özel altyazılar

Rock yapalım hadi

DBNavigator korumalı bir Buttons özelliğine sahiptir. Bu üye, TSpeedButton'un soyundan gelen bir TNavButton dizisidir.

Bu korumalı mülkteki her düğme TSpeedButton'dan miras aldığından, üzerine elimizi alırsanız, aşağıdaki gibi standart "TSpeedButton özellikleriyle çalışabilirsiniz: Altyazı (kontrolü kullanıcıya tanımlayan bir dize), Glif (düğmede görünen bitmap), Düzen (görüntünün veya metnin buton)...

DBCtrls biriminden (DBNavigator'ın tanımlandığı yerde), korunan Buttons özelliğinin şu şekilde bildirildiğini "okudunuz":

Düğmeler: dizi[TNavigateBtn] nın-nin TNavButton;

TNavButton, TSpeedButton ve TNavigateBtn'den devralındığında, şu şekilde tanımlanan bir numaralandırmadır:

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

TNavigateBtn öğesinin her biri bir TDBNavigator nesnesinde farklı bir düğme tanımlayan 10 değer içerdiğini unutmayın. Şimdi bir DBNavigator'u nasıl hackleyeceğimize bakalım:

Geliştirilmiş DBNavigator

İlk olarak, en az bir DBNavigator, DBGrid, bir DataSoure ve bir Veri kümesi nesnesi seçtiğiniz (ADO, BDE, dbExpres, ...). Tüm bileşenlerin "bağlı" olduğundan emin olun.

İkinci olarak, bir DBNavigator, Form bildirimi üzerinde, devralınan bir "kukla" sınıfı tanımlayarak kesmek:

tip THackDBNavigator = sınıf(TDBNavigator);
tip
TForm1 = sınıf(TForm)
...

Ardından, her DBNavigator düğmesinde özel resim yazıları ve grafikler görüntüleyebilmek için bazı başlıklar ayarlamanız gerekir. glifleri. TImageList bileşenini kullanabilir ve her biri bir DBNavigator'un belirli bir düğmesinin eylemini temsil eden 10 resim (.bmp veya .ico) atayabilirsiniz.

Üçüncü olarak, OnCreate etkinliği Form1 için aşağıdaki gibi bir çağrı ekleyin:

prosedür TForm1.FormCreate (Gönderen: TObject);
SetupHackedNavigator (DBNavigator1, ImageList1);
son;

Bu yordamın bildirimini, form bildiriminin özel bölümüne ekleyin, örneğin:

tip
TForm1 = sınıf(TForm)
...
privateprocedure SetupHackedNavigator (const Gezgin: TDBNavigator;
const Glifler: TImageList);
...

Dördüncü olarak, SetupHackedNavigator yordamını ekleyin. SetupHackedNavigator yordamı, her düğmeye özel grafikler ekler ve her düğmeye özel bir resim yazısı atar.

kullanımları Düğmeler; //!!! unutma
prosedür TForm1.SetupHackedNavigator
(const Gezgin: TDBNavigator;
const Glifler: TImageList);
const
Başlıklar: dizi[TNavigateBtn] dizenin =
('İlk', 'Önceki', 'Daha Sonra', 'Son', 'Ekle',
'Sil', 'Doğru', 'Gönder', 'Çek', 'Canlandır');
(*
Altyazılar: string = dizisinin [TNavigateBtn]
('İlk', 'Önceki', 'Sonraki', 'Son', 'Ekle',
'Sil', 'Düzenle', 'Gönder', 'İptal', 'Yenile');

Hırvatistan'da (yerelleştirilmiş):
Altyazılar: string = dizisinin [TNavigateBtn]
('Prvi', 'Prethodni', 'Slijedeci', 'Zadnji', 'Dodaj',
'Obrisi', 'Promjeni', 'Spremi', 'Odustani', 'Osvjezi');
*)
var
btn: TNavigateBtn;
beginfor btn: = Düşük (TNavigateBtn) için Yüksek (TNavigateBtn) ile yapmak THackDBNavigator (Gezgin) .Düğmeler [btn] dobegin// Altyazılar const dizisinden
Altyazı: = Altyazı [btn];
// Glif özelliğindeki görüntü sayısı
NumGlifler: = 1;
// Eski glifi kaldırın.
Glif: = sıfır;
// Özel olanı atayın
Glifler. GetBitmap (Tamsayı (btn), Glif);
// metnin üzerindeki gylph
Düzen: = blGlyphTop;
// daha sonra açıkladı
OnMouseUp: = HackNavMouseUp;
son;
son; (* SetupHackedNavigator *)

Tamam, açıklayalım. DBNavigator'daki tüm düğmeler arasında yineleme yaparsınız. Her düğmeye korumalı Buttons dizi özelliğinden erişilebildiğini hatırlayın; bu nedenle THackDBNavigator sınıfına olan ihtiyaç. Buttons dizisinin türü TNavigateBtn olduğundan, "ilk" den ( Düşük işlevi) düğmesine "son" Yüksek işlev) bir. Her düğme için, basitçe "eski" glifi kaldırır, yenisini atar (Glifler parametresinden), resim yazılarını Captions dizisinden ekler ve glifin düzenini işaretlersiniz.

VisibleButtons özelliği aracılığıyla bir DBNavigator (saldırıya uğramış değil) tarafından hangi düğmelerin görüntüleneceğini denetleyebileceğinizi unutmayın. Varsayılan değerini değiştirmek isteyebileceğiniz başka bir özellik İpuçları'dır — tek tek gezgin düğmesi için seçtiğiniz Yardım İpuçlarını sağlamak için kullanın. ShowHints özelliğini düzenleyerek İpuçları ekranını kontrol edebilirsiniz.

Bu kadar. Bu yüzden Delphi'yi seçtin!

Daha fazla ver!

Neden burada dursun? 'NbNext' düğmesine tıkladığınızda, veri kümesinin geçerli konumunun bir sonraki kayda ilerletildiğini bilirsiniz. Diyelim ki, kullanıcı düğmeye basarken CTRL tuşunu basılı tutuyorsa, 5 kayıt ilerleyelim? Peki ya bu?

"Standart" DBNavigator'da, Alt, Ctrl ve Shift tuşlarının durumunu test etmenizi sağlayan OnMouseUp olayı (TShiftState öğesinin Shift parametresini taşıyan olay) yoktur. DBNavigator yalnızca işlemek için OnClick olayını sağlar.

Ancak, THackDBNavigator basitçe OnMouseUp olayını açığa çıkarabilir ve kontrol tuşlarının durumunu ve hatta tıklandığında imlecin belirli düğmenin üzerindeki konumunu "görmenizi" sağlar!

Ctrl + Tıklama: = 5 Satır Önde

OnMouseUp'ı ortaya çıkarmak için, saldırıya uğrayan DBNavigator düğmesinin OnMouseUp olayına özel olay işleme prosedürünüzü atamanız yeterlidir. Bu tam olarak SetupHackedNavigator prosedüründe yapılır:
OnMouseUp: = HackNavMouseUp;

Şimdi, HackNavMouseUp prosedürü şöyle görünebilir:

prosedür TForm1.HackNavMouseUp
(Gönderen: TObject; Düğme: TMouseButton;
Shift: TShiftState; X, Y: Tam sayı);
const MoveBy: tamsayı = 5;
beginifDEĞİL (Gönderen TNavButton'dur) sonra Çıkış;
durum TNavDüğmesi (Gönderen) .Deks nın-nin
nbPrior:
Eğer (Üst Karakter'de ssCtrl) sonra
TDBNavigator (TNavButton (Gönderen).
Veri kaynağı. DataSet. MoveBy (-MoveBy);
nbNext:
Eğer (Üst Karakter'de ssCtrl) sonra
TDBNavigator (TNavButton (Gönderen).
Veri kaynağı. DataSet. MoveBy (MoveBy);
son;
son(* HackNavMouseUp *)

HackNavMouseUp yordamının imzasını form bildiriminin özel kısmına (SetupHackedNavigator yordamının bildiriminin yakınında) eklemeniz gerektiğini unutmayın:

tip
TForm1 = sınıf(TForm)
...
privateprocedure SetupHackedNavigator (const Gezgin: TDBNavigator;
const Glifler: TImageList);
prosedür HackNavMouseUp (Gönderen: TObject; Düğme: TMouseButton;
Shift: TShiftState; X, Y: Tam sayı);
...

Tamam, bir kez daha açıklayalım. HackNavMouseUp prosedürü, her DBNavigator düğmesi için OnMouseUp olayını işler. Kullanıcı nbNext düğmesini tıklarken CTRL tuşunu basılı tutarsa, bağlı veri kümesinin geçerli kaydı "MoveBy" (5 değeriyle sabit olarak tanımlanır) kayıtları ilerletilir.

Ne? Overcomplicated?

Evet. Yalnızca düğme tıklatıldığında kontrol tuşlarının durumunu kontrol etmeniz gerekiyorsa, tüm bunlarla uğraşmanıza gerek yoktur. "Sıradan" da aynısını nasıl yapacağınız aşağıda açıklanmıştır OnClick etkinliği "sıradan" DBNavigator:

prosedür TForm1.DBNavigator1Click
(Gönderen: TObject; Düğme: TNavigateBtn);
fonksiyon CtrlDown: Boolean;
var
Durum: TKeyboardState;
başla
GetKeyboardState (Eyalet);
Sonuç: = ((Durum [vk_Control] Ve 128) 0);
son;
const MoveBy: tamsayı = 5;
begincase Buton nın-nin
nbPrior:
Eğer CtrlDown sonra
DBNavigator1.DataSource. DataSet. MoveBy (-MoveBy);
nbNext:
Eğer CtrlDown sonra
DBNavigator1.DataSource. DataSet. MoveBy (MoveBy);
son; //case
son(* DBNavigator2Click *)

Hepsi Bu Kadar

Ve son olarak, proje bitti. Veya devam edebilirsiniz. İşte sizin için bir senaryo / görev / fikir:

Diyelim ki nbFirst, nbPrevious, nbNext ve nbLast düğmelerini değiştirmek için yalnızca bir düğme istiyorsunuz. Düğme bırakıldığında imlecin konumunu bulmak için HackNavMouseUp yordamı içindeki X ve Y parametrelerini kullanabilirsiniz. Şimdi, bu tek düğmeye ("hepsini yönetmek için") 4 alana sahip bir resim ekleyebilirsiniz, her alanın değiştirdiğiniz düğmelerden birini taklit ettiği varsayılır... anladın mı?

instagram story viewer