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:
Teď napíšeme obslužnou proceduru pro kliknutí na tlačítku:
|
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:
|
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:
|
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.
-
25. listopadu 2012
-
30. srpna 2002
-
10. října 2002
-
4. listopadu 2002
-
12. září 2002
-
25. listopadu 2012
-
28. července 1998
-
31. července 1998
-
28. srpna 1998
-
6. prosince 2000
-
27. prosince 2007
-
4. května 2007