Delphi Tips & Tricks softsale > Delphi Tips & Tricks      

< poprzednia rada następna rada >

Obsługa DBGrida za pomocą klawiszy skrótów

Niekiedy należy zapewnić obsługę grida bez użycia myszki, tylko za pomocą klawiatury, korzystając z klawiszy skrótów.

Jak to zrobić? Wykorzystamy do tego celu komponent TMenu oraz metodę BTnClick DBNavigatora. Utwórzmy menu Rekord zawierające pozycje odpowiadające przyciskom w jakie standardowo wyposażony jest DBNavigator. Przypiszmy kolejnym elementom menu odpowiednie klawisze skrótu. Stwórzmy handler obsługi zdarzenia OnClick dla pierwszego elementu menu a następnie przypiszmy ten handler obsługi do wszystkich pozycji menu. Nasz handler obsługi zdarzenia OnClick zawiera wywołanie procedury NawigatorMenu.

procedure TForm1.Pierwszy1Click(Sender: TObject);
begin
   nawigatorMenu( Aktywny_Nawigator, Sender );
end;

Nasza procedura ma dwa parametry: pierwszy to Nawigator, drugi to Sender, który w tym wypadku odpowiada wybranemu elementowi menu.

procedure NawigatorMenu(var Nawigator: TDBNavigator;
                               var Sender: TObject);

W procedurze NawigatorMenu określany jest wybrany element menu w oparciu o jego nazwę, a następnie wywoływana jest metoda BtnClick z odpowiednim parametrem. Dodatkowo sprawdzane jest jeszcze, czy odpowiedni przycisk jest widoczny w DBNavigatorze.

procedure NawigatorMenu(var Nawigator: TDBNavigator;
                               var Sender: TObject);
var
   menu_wybrane: String;
begin
   menu_wybrane := TMenuItem(Sender).Caption;
   // usunięcie znaku '&' (jeśli istnieje), pozwala na zmianę
   // "gorącego klawisza" bez zmiany kodu
   Delete(menu_wybrane, Pos('&', menu_wybrane), 1);
   with Nawigator do
   begin
     if (menu_wybrane = 'Pierwszy') and
            (nbFirst in Navigator.VisibleButtons) then
        BtnClick(nbFirst)
     else if (menu_wybrane = 'Poprzedni') and
            (nbPrior in Navigator.VisibleButtons) then
        BtnClick(nbPrior)
     else if (menu_wybrane = 'Następny') and
            (nbNext in Navigator.VisibleButtons) then
        BtnClick(nbNext)
     else if (menu_wybrane = 'Ostatni') and
            (nbLast in Navigator.VisibleButtons) then
        BtnClick(nbLast)
     else if (menu_wybrane = 'Wstaw') and
            (nbInsert in Navigator.VisibleButtons) then
        BtnClick(nbInsert)
     else if (menu_wybrane = 'Usuń') and
            (nbDelete in Navigator.VisibleButtons) then
        BtnClick(nbDelete)
     else if (menu_wybrane = 'Edytuj') and
            (nbDelete in Navigator.VisibleButtons) then
        BtnClick(nbEdit)
     else if (menu_wybrane = 'Zapisz') and
            (nbPost in Navigator.VisibleButtons) then
        BtnClick(nbPost)
     else if (menu_wybrane = 'Anuluj') and
            (nbCancel in Navigator.VisibleButtons) then
        BtnClick(nbCancel)
     else if (menu_wybrane = 'Odśwież') and
            (nbRefresh in Navigator.VisibleButtons) then
        BtnClick(nbRefresh);
   end; 
end;

Jak obsłużyć za pomocą takiego menu poruszanie się po wielu tablicach. Załóżmy, że korzystamy z komponentu TabbedNotebook i na każdej jego zakładce umieszczamy inną tablicę. Jeżeli używamy oddzielnych DBNavigatorów dla każdej tablicy, to można to zrealizować w następujący sposób:

procedure TForm1.TabbedNotebook1Change(Sender: TObject;
            NewTab: Integer; var AllowChange: Boolean);
begin
   if newTab=0 then Aktywny_Nawigator:=dbnavigator1;
   if newTab=1 then Aktywny_Nawigator:=dbnavigator2;
end;

Jeżeli używamy tylko jednego DBNavigatora dla wszystkich tablic to oczywiście należałoby odpowiednio przypisać wartość do własności DataSource DBNavigatora:

procedure TForm1.TabbedNotebook1Change(Sender: TObject;
            NewTab: Integer; var AllowChange: Boolean);
begin
   if newTab=0 then dbnavigator1.DataSource:=DataSource1;
   if newTab=1 then dbnavigator1.DataSource:=DataSource2;
   Aktywny_Nawigator:=dbnavigator1;
end;

W obu przypadkach należy jeszcze przypisać parametrowi Nawigator Aktywny_Nawigator np. w procedurze obsługi zdarzenia OnCreate formy.

procedure TForm1.FormCreate(Sender: TObject);
begin
   // tylko wtedy, jeśli mamy jeden DBNavigator
   // dla kilku tablic
   dbnavigator1.DataSource:=DataSource1;
   Aktywny_Nawigator := dbnavigator1;
end;

Należy pamiętać o deklaracji:

var Aktywny_Nawigator: TDBNavigator;

SOFTSALE - Oprogramowanie i Szkolenia
softsale@softsale.com.pl

03-565 Warszawa , ul. Borzymowska 43 lok. 301C
tel/fax:4084840,GSM:0607612428