Průvodce tvorbou nápovědy - 5. díl

Vážení přátelé,

vítám vás u již pátého výletu do virtuálního světa počítačové nápovědy. Dnešní a budoucí díl budou poněkud netradiční, no pevně věřím, že stejně zajímavé. Povíme jsi totiž něco o jedné z mnoha forem nápovědy, o asistentovi (pomocníkovi) Office.

Představení pomocníka
Příprava prostředí editoru VBA
Aktivace pomocníka
Vytvoření nápovědného okna
Identifikace činností uživatele
Některé vlastnosti pomocníka
Zobrazení pomocníka po otevření dokumentu
Aktivace pomocníka prostřednictvím VB

Jak jistě mnozí z vás vědí, pomocník je součástí softwarového balíku Microsoft Office. Počítačový asistent byl poprvé implementován ve verzi Office 97 a následně se objevil ve všech vyšších verzích, tedy Office 2000 a XP. Jelikož je pomocník součástí sady Office, nelze jej použít samostatně, to znamená, že je potřebné, abyste měli vy a vaši uživatelé nainstalovaný již vzpomínaný softwarový balík. Proto se malinko ponoříme i do prostředí VBA (Visual Basic for Applications), který představuje programovací jazyk kolekce Office. Ukážeme jsi, jak je možné naprogramovat pomocníka a jak využít jeho základní možnosti. Jenom jedna poznámka: uvedené příklady byly vyvinuty s nejnovější verzí balíku (Office XP).

K dispozici máte následující typy virtuálních asistentů:

 

Standardně je pro vás připravena známa kancelářská sponka, samozřejmě za předpokladu, že aktivaci pomocníka povolíte. Je pochopitelně na vás, kterého průvodce si vyberete, naprogramovat můžete kteréhokoliv z nich.

Z programátorského hlediska je důležité, že existuje samostatný objekt s názvem Assistant, metody a vlastnosti kterého jsou vám plně k dispozici. Interakce s objektem Assistant se uskutečňuje z prostředí VBA, které můžete spustit z jedné z aplikací Office (třeba z Wordu, jak je vidět na spodním obrázku)

Na začátek si ukážeme jednoduchý příklad, který "zviditelní" pomocníka na obrazovce. Abyste mohli zapsat níže uvedený segment kódu do editoru VBA, je nevyhnutné toto prostředí z Wordu spustit (klávesovou zkratkou ALT+F11, nebo pomocí sekvence kroků: nabídka Tools>Macro>Visual Basic Editor). Dále přidejte standardní formulář (Insert>UserForm) a na formulář umístěte tlačítko, které pojmenujte.

Pro nováčky ve VBA je zde schématické znázornění postupu:

1) klávesová zkratka pro aktivaci prostředí VBA (ALT+F11)
2) přidání formuláře

3) Výběr tlačítka z panelu nástrojů a jeho umístění na formulář.

Pro vyvolání pomocníka zapište do obsluhy události Click vytvořeného tlačítka tento kód:

With Assistant
    If .On = True Then
      .Visible = True
    Else
      .On = True
    End If
End With

Nastavením vlastností On a Visible se aktivuje a zviditelní pomocník. Zde se na chvíli zastavíme. Obě vlastnosti jsou totiž jistým způsobem přepojeny. Když je vlastnost On nastavena na False, Visible je rovněž automaticky nastavena na False. V případě, že On=True, záleží jenom na hodnotě vlastnosti Visible, zda je pomocník viditelný (True), nebo skrytý (False).

 Jestli je hodnota vlastnosti On změněna z False na True, vlastnost Visible je automaticky nastavena na True. Jinými slovy to znamená, že když je asistent vypnutý (On=False) a vy jej zapnete (On=True), již není nutné explicitně nastavovat vlastnost Visible na True, aby byl viditelný.

Právě tuto situaci řeší i výše uvedený zdrojový kód. Ze všeho nejdříve testujeme hodnotu vlastnosti On asistenta. Když má uživatel zapnutého pomocníka (On=True), zobrazíme jej (Visible=True). Naopak, jestli je pomocník vypnutý, nastavíme vlastnost On na True, čímž asistenta zobrazíme.

Pro zjednodušení ve všech následujících případech předpokládejme, že asistent je zapnutý, a tedy pro jeho zviditelnění budeme nastavovat jenom vlastnost Visible na True.

Dobrá, pomocníka jsme zobrazili, no co s ním dál? Nejspíš budete chtít zobrazit bublinové okno s nápovědním textem. Nuže, směle do toho.

Na vytvoření a zobrazení okna s nápovědou poslouží vlastnost NewBalloon objektu Assistant, která vrací objekt Balloon. Ten představuje bublinové okno asistenta, ve kterém se objevují všechny potřebné informace. Doplňte kód následovně:

With Assistant.NewBalloon
    .Heading = "Co chcete udělat?" 'text v záhlaví
    .Text = "Vyberte jednu položku:" 'hlavní text
    .Labels(1).Text = "Spustit moji nápovědu" 'vytvoření první položky
     Labels(2).Text = "Spustit program" 'vytvoření druhé položky
    .Show  'zobrazení bublinového okna
End With

Poznámka: Každá položka představuje objekt BalloonLabel. Kolekce těchto objektů, označovaná jako BalloonLabels může obsahovat až 5 jednotlivých položek (členů).

Výsledkem by měla být takováhle podoba asistenta.

Aby bylo možné po klepnutí na jednotlivé položky opravdu vykonat nějakou akci, je potřebné nejdříve zjistit, kterou položku uživatel aktivoval. Vytvoříme tedy proměnnou, do které uložíme číselnou identifikaci aktivované položky a dále, za pomoci strukturovaného příkazu Select Case, budeme řídit spuštění samotných akcí. Modifikace kódu je znázorněna níže.

Dim hodnota As Integer  'vytvoření proměnné
With Assistant.NewBalloon
    .Heading = "Co chcete udělat?"
    .Text = "Vyberte jednu položku:"
    .Labels(1).Text = "Spustit moji nápovědu"
    .Labels(2).Text = "Spustit program"
    hodnota = .Show  'přiřazení číselné hodnoty do proměnné
End With

Select Case hodnota
Case 1
    With cdl1  'nastavení ovládacího prvku Common Dialog
        .HelpFile = "c:\pokus.hlp"
        .HelpCommand = cdlHelpContents
        .ShowHelp
    End With
Case 2
    Dim program As Double
    program = Shell("notepad.exe",vbNormalFocus)
End Select

Jak jste si po prostudování kódu mohli všimnout, nápovědný soubor je volán pomoci ovládacího prvku Common Dialog. Pokud tento prvek nemáte na panelu nástrojů (Toolbox), musíte jej do projektu přidat (Tools>Additional Controls).

Uvedený kód zabezpečí, že po klepnutí na první položku se zobrazí nápovědný soubor "pokus.hlp" a aktivace druhé položky pak spustí program notepad.

Pozici okna pomocníka můžete měnit pomocí vlastností Left a Top. Další, neméně zajímavou možností je nastavení animace asistenta. Animace může být aplikována na objekt Assistant, kdy je zobrazena okamžitě po tom, co je asistent zapnutý a viditelný. Animaci lze aplikovat i na objekt Balloon, pomocník je pak animován ve chvíli zobrazení nápovědného okna. Praktickou vlastností je MoveWhenInTheWay, která automaticky mění pozici okna asistenta, když se ten nachází v "cestě" uživateli. Praktický příklad může nabýt následující podobu.

With Assistant
    .Left = 200
    .Top = 200
    .MoveWhenInTheWay = True
    .Visible = True
    .Animation = msoAnimationLookDown
End With

Pokud jde o bublinové okno s nápovědou, můžete jej doplnit ikonou nebo obrázkem (cestu k vašemu obrázku upravte dle potřeby). Jak to udělat uvidíte dál.

Dim x as Integer
With Assistant.NewBalloon
    .Heading = "Informace"
    .Text = "{bmp c:\obrázek1.bmp}"& " Pokud chcete"amp; _
    " umístit do nápovědného okna ikonu," & _
    " použijte vlastnost {cf 252}Icon{cf 0}" & _
    " objektu {cf 252}Balloon{cf 0}."
    .Icon = msoIconAlertInfo
    x = .Show
End With

Text zapsaný mezi formátovacími příkazy {cf 252} a {cf 0} je zabarven namodro. První příkaz barvu textu zapíná a druhý ji vrací opět do standardní podoby. Na text je možné aplikovat i jednoduché podtržení pomocí příkazů {ul 1} a {ul 0}.

Zdrojový kód vykreslí pomocníka v obdobní podobě.

Pokud budete chtít, aby okno s asistentem po stisknutí tlačítka OK zmizelo, přidejte ještě malý segment kódu:

If x = -1 Then Assistant.Visible = False

Pro reálné použití by bylo na samém začátku nejlepší zjistit, zda uživatel používá pomocníka, nebo jej deaktivoval a pracuje výlučně s nápovědním textem. Když potom aktivujete pomocníka a vykonáte to, co bylo vaším záměrem, měli byste uvést pomocníka do takového stavu, v jakém byl před spuštěním kódu vaší aplikace. Řečeno jinými slovy, když uživatel standardně nepoužívá asistenta, i po skončení činnosti vašeho programu by měla být výchozí vlastnost On nastavena na False a naopak.

Předpokládejme, že vyvíjíte aplikaci ve VBA a chcete, aby se asistent objevil jenom jednou, a sice při prvním otevření dokumentu. Jakmile uživatel otevře dokument Wordu, objeví se pomocník. Pro vyřešení úlohy přidejte od obsluhy události Open objektu Document tento kód:

Dim aktivace As Integer
aktivace = GetSetting("Pokus", "Asistent", "Aktivace", 0)

If aktivace = 0 Then
    Assistant.Visible = True
    SaveSetting "Pokus","Asistent", "Aktivace", 1
Else
    Assistant.Visible = False
End If

Za pomoci jednoduché testovací podmínky a zápisu hodnoty do registru (do sekce HKEY_CURRENT_USER\SOFTWARE\VB and VBA Program Settings\Pokus\Asistent) lze poměrně snadno určit, zda uživatel otevřel dokument prvně (proměnná aktivace = 0), nebo jde o druhou aktivaci (aktivace = 1).

Ve všech znázorněných příkladech jsme používali přímo prostředí VBA Wordu.Samozřejmě, že lze uplatnit i jiný způsob, i když se nedá docela říci, že jde o postup standardní. Jednoduše můžeme "zavolat" asistenta pomocí ryzího Visual Basicu, za předpokladu, že uživatel má na svém počítači nainstalovaný balík Office (nebo některou z integrovaných aplikací, např. Word, jak uvidíte za chvíli). Ještě před zahájením psaní kódu je nutné přidat do projektu VB příslušné odkazy na knihovny Office. Aktivujte nabídku Project>References a zaškrtněte položky Microsoft Office 10.0 Object Library a Microsoft Word 10.0 Object Library.

Aktivaci aplikace Word lze docílit dvěma odlišnými způsoby:

1. zjistíme, zdali je Word spuštěný a jestli ano, začneme s ním komunikovat
2. vytvoříme novou instanci aplikace Word

Zmíněná problematika spadá do oblasti OLE Automation. Zkušenější programátoři již jistě vědí, o čem mluvím, pro ty méně zkušené poskytnu jenom stručné vysvětlení pojmu, protože středem našeho zájmu není prozkoumávání celé mašinérie OLE, nýbrž jenom asistent Office. Nuže, technologie OLE Automation je pouze jednou částí podstatně širšího pojmu, kterým je OLE (Object Linking and Embedding). Jak je ze samotného názvu patrné, jedná se o sdílení objektů mezi aplikacemi. Lze tedy poměrně snadno pracovat s objekty jiných aplikací, používat jejich metody a vlastnosti. Implementace OLE využívá principu tzv. komponentového software, kdy je aplikace chápana jako kolekce objektů, které mají svoje vlastnosti a metody. Pokud tedy komponenta aplikace podporuje OLE, je možné "vypůjčit" si její vlastnosti nebo metody pro zpracování konkrétního úkolu. Uvedená skutečnost má mnoho výhod, které oceníte zejména v situacích, kdy potřebujete vykonat určitý specifický úkol, např. vypočítat hodnotu mediánu. Vtip je v tom, že nemusíte celý algoritmus výčtu mediánu programovat samy, ale "zavoláte" Excel, kterému poskytnete vstupní údaje, použijete statistickou funkci a máte během několika vteřin po ruce výsledek.

V našem příkladu budeme pracovat s aplikací Word. Word je robustní aplikace, která obsahuje velké množství různých objektů, přičemž přistupuje i k objektu Assistant, který je sdílený všemi aplikacemi Office. Pro potřeby našeho "technologického dema" nebudeme brát v potaz alternativu kontaktování již spuštěné aplikace pomocí funkce GetObject, místo toho vytvoříme rovnou novou instanci aplikace použitím funkce CreateObject. Naše aplikace bude netradiční v tom smyslu, že nebudeme pracovat se žádnýma formuláři ani tlačítky, ale vytvoříme spouštěcí proceduru Main, pomocí které spustíme program a navážeme komunikaci s Wordem.

Nejprve přidejte do projektu VB modul a do jeho deklarační časti přidejte deklaraci objektové proměnné s časnou vazbou:

Public objWord As Word.Application  'deklarace proměnné s časnou vazbou

Dále vložte do modulu proceduru Main (Tools>Add Procedure) a zaplňte ji uvedeným kódem:

Set objWord = CreateObject("Word.Application")
    With objWord
        .Documents.Add  'vytvoření nového dokumentu
        .Visible = True 'zviditelnění aplikace
        .Activate  'aktivace okna aplikace
    End With

Nyní vložte do modulu proceduru s názvem "pomocnik" a zapište do ní tento kód:

Dim hodnota As Integer
Assistant.Visible = True

With Assistant.NewBalloon
    .Heading = "Co chcete udělat?"
    .Text = "Vyberte jednu položku:"
    .Labels(1).Text = "Spustit moji nápovědu"
    .Labels(2).Text = "Spustit program"
    .Icon = msoIconTip
    hodnota = .Show
End With

Select Case hodnota
Case 1
    Dim nap As Long
    nap = WinHelp(Form1.hwnd,"c:\pokus.hlp", _
    HELP_CONTENTS, 0)
    Assistant.Visible = False
    objWord.Quit  'ukončení instance Wordu
    Set objWord = Nothing 'uvolnění objektové reference
    End
Case 2
    Dim program As Double
    program = Shell("notepad.exe",vbNormalFocus)
    Assistant.Visible = False
    objWord.Quit
    Set objWord = Nothing
    End
Case -1 'uživatel stisknul tlačítko OK
    Assistant.Visible = False
    objWord.Quit
    Set objWord = Nothing
    End
End Select

Deklaraci API funkce Winhelp a konstanty přidejte rovněž do modulu:

Public Const HELP_CONTENTS = &H3&
Public Declare Function WinHelp Lib _
"user32"Alias "WinHelpA" _
(ByVal hwnd As Long, _
ByVal lpHelpFile As String, _
ByVal wCommand As Long, _
ByVal dwData As Long) As Long

Na závěr musíte Visual Basicu říct, aby program začínal vytvořenou procedurou Main. Aktivujte nabídku Project Properties a na kartě General nastavte jako Startup Object proceduru Sub Main.

Po spuštění projektu se nastartuje Word a zobrazí se pomocník s nápovědním oknem. Po vybrání položky se provede patřičná akce, ukončí se spuštěná instance Wordu, "vyčistí" se objektová proměnná a náš program se ukončí.

Právě jsme si ukázali komplexní příklad aktivace pomocníka za použití VB. Jak vidíte, je možné poměrně snadno spojit možnosti pomocníka a standardního nápovědného souboru.

Na shledanou u dalšího pokračování našeho seriálu.

Ján Hanák