Jak ScrollBox k fokusu přišel - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



C/C++

Jak ScrollBox k fokusu přišel

5. března 2001, 00.00 | Jednoduchý trik jak obsluhovat ScrollBox pomocí klávesnice. Vše je předvedeno na praktické ukázce jednoduchého programu pro zobrazování obrázků..

Každý jistě zná komponentu TScrollBox, která dokáže pomocí scrollování zpřístupnit i objekty přesahující plochu formuláře. Klikáním na lišty u krajů se dostanete, kam potřebujete. Obtížnější situace ovšem nastane, když chcete do svého programu přidat možnost scrollování obsahu boxu i pomocí klávesnice.

Pouhým pohledem na seznam událostí, které umí ScrollBox obsloužit, zjistíte, že mezi nimi nejsou žádné typu OnKeyPress, OnKeyDown apod. Tato komponenta prostě klávesnici ignoruje, nemůže dokonce ani dostat fokus (nelze se tedy do ní přepnout klávesami Tab a Shift+Tab). Pokusím se představit metodu, jak tento nedostatek poměrně jednoduchým trikem obejít.

Celý postup si vysvětlíme na jednoduché aplikaci - prohlížeči obrázků typu BMP, ICO a WMF/EMF (spokojíme se tedy s typy nativně podporovanými Delphi a Windows). Prohlížeč by měl určitě umožnit zobrazení obrázků větších než je velikost okna a pohodlné narolování na jejich části i pomocí klávesnice. Nejdříve naprogramujeme základní verzi a pak k ní přidáme právě možnost posouvání se po obrázku pomocí klávesnice.

Vytvoříme nyní novou aplikaci a na hlavní formulář vložíme jeden TPanel a jeden TScrollBox. Panel nám poslouží jako toolbar, takže smažeme jeho Caption, vhodně nastavíme okraje (BevelInner na bvRaised, BevelOuter na bvLowered) a nakonec mu nastavíme vlastnost Align na hodnotu alTop; zatímco ScrollBox roztáhneme na zbylou plochu okna pomocí hodnoty alClient. Také se vyplatí u jeho lišt (vlastnosti HorzScrollBar a VertScrollBar) nastavit Tracking na True - rolování se tak bude při tažení táhla odehrávat okamžitě, bez čekání "kam myší dojedete".

Tak, na našem toolbaru by se hodilo alespoň tlačítko pro otevření souboru, což zařídíme pomocí TButtonu s textem "Otevřít...". Ještě přidáme komponentu TOpenPictureDlg (abychom obrázek mohli nalistovat v dialogu) a do ScrollBoxu umístíme to hlavní - TImage určený k zobrazování vlastního obrázku. Tomu nastavíme vlastnost AutoSize na True, abychom se nemuseli starat o jeho velikost. Celé okno aplikace by tedy mělo vypadat asi takto:

Okno prohlížeče

Teď napíšeme obslužnou proceduru pro kliknutí na tlačítku:

procedure TForm1.Button1Click(Sender: TObject);
begin
  if OpenPictureDialog1.Execute then
    Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
end;

Pokud nyní aplikaci spustíte, můžete pomocí tlačítka otevírat obrázky, které se budou zobrazovat. Ve ScrollBoxu by se měly automaticky zobrazit lišty, pokud to bude nezbytné. Nyní dodáme slibované posouvání klávesnicí, které zařídíme (jak už jsem předeslal) pomocí malého triku: Do ScrollBoxu umístíme (nejlépe na souřadnice [0,0]) TEdit - pojmenovaný třeba DummyEdit - kterému nastavíme šířku a výšku na 0 bodů. Celý vtip je v tom, že DummyEdit bude přebírat fokus místo ScrollBoxu. Díky svým rozměrům je pro uživatele neviditelný a ten tak nic nepozná. Zbývá jen zachytit stisky kláves v DummyEditu pomocí následující procedury "visící" na události OnKeyDown:

procedure TForm1.DummyEditKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  case Key of
    VK_UP:
      with ScrollBox1.VertScrollBar do
        Position := Position - Increment;
    VK_DOWN:
      with ScrollBox1.VertScrollBar do
        Position := Position + Increment;
    VK_LEFT:
      with ScrollBox1.HorzScrollBar do
        Position := Position - Increment;
    VK_RIGHT:
      with ScrollBox1.HorzScrollBar do
        Position := Position + Increment;
  end;
end;

Nakonec ještě upravíme proceduru Button1Click, aby se po otevření obrázku fokus přesměroval do DummyEditu. Tím pádem může uživatel hned po otevření posouvat obrázkem. a není nutné se do ScrollBoxu (resp. do DummyEditu) dostávat klávesou Tab:

procedure TForm1.Button1Click(Sender: TObject);
begin
  if OpenPictureDialog1.Execute then
  begin
    Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
    ActiveControl := DummyEdit;
  end;
end;

Když spustíte takto upravenou aplikaci, ovládání klávesnicí by mělo bezchybně fungovat. Možná by tento problém šel částečně řešit pomocí odchycení události OnKeyDown na formuláři, ale to by neumožňovalo dát ScrollBoxu fokus, a navíc by to komplikovalo případy, kdy jsou na formuláři další komponenty používající kurzorové klávesy (vyvstaly by otázky typu: Má se ta šipka dolů interpretovat jako posun v právě aktivním TListu nebo jako posun ve ScrollBoxu?). Řešení pomocí DummyEditu přináší oproti ostatním asi nejméně komplikací, což je jeho největší výhodou.

Tématické zařazení:

 » Rubriky  » C/C++  

 » Rubriky  » Delphi  

 » Rubriky  » Windows  

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: