Pr∙vodce tvorbou nßpov∞dy û 4. dφl



Vß₧enφ Φtenß°i,

vφtßm vßs u dalÜφho pokraΦovßnφ naÜeho serißlu. Po minulΘ teoretickΘ studii se vrßtφme op∞t do ryzφ praxe a povφme jsi n∞co o zßkoutφch tvorby nßpov∞dnΘho systΘmu. Jak za chvφli uvidφte, dneÜnφ dφl se podobß nejvφce populßrnφ sΘrii otßzek a odpov∞dφ, kterΘ p°edstavujφ pom∞rn∞ oblφbenou formu °eÜenφ problΘm∙. Doufßm, ₧e pom∙₧e jak zaΦßteΦnφk∙m, tak i samotn²m profesionßl∙m.

 

ProblΘm: Pot°ebuji vytvo°it nßpov∞du pro svoji aplikaci. Dodr₧uji p°esn∞ stanoven² postup. Nejd°φve vytvo°φm ve Wordu 97 samotn² text a ulo₧φm jej ve formßtu RTF. Dote∩ probφhß vÜe v po°ßdku. Kdy₧ ale chci vygenerovat spustiteln² soubor nßpov∞dy, kompilßtor vypφÜe nßsledujφcφ zprßvu:

HC4002: Warning:
        RTF file ..\Nßpov∞da.rtf is corrupted at offset 945.

HC4005: Warning:
        The .\pokus.hlp help file has not been created.

Nevφm, co s tφm. D∞lßm snad n∞kde chybu?

Odpov∞∩: Ne, chybu ned∞lßte, alespo≥ co se t²Φe postupu tvorby nßpov∞dnΘho souboru. Potφ₧ je toti₧ v n∞Φem jinΘm. A sice ve verzi kompilßtoru nßpov∞dnφch soubor∙, kter² pou₧φvßte. S nejv∞tÜφ pravd∞podobnostφ jde o Help Workshop starÜφ verze jako 4.03. Je tedy nezbytnΘ zφskat nov∞jÜφ verzi kompilßtoru, nejlΘpe ji₧ vzpomφnanou verzi 4.03. Aktußlnφ verzi lze zφskat na internetovΘ adrese: http://www.helpmaster.com/hlp-developmentaids-hcw403.htm. Abyste zjistili, jakou verzi mßte nainstalovanou na vaÜem poΦφtaΦi, ud∞lejte nßsledovn∞:

- spus¥te Help Workshop
- aktivujte menu Help a vyberte polo₧ku Version...

ProblΘm nekompatibility kompilßtoru starÜφ verze se objevφ tehdy, kdy₧ vytvß°φte text nßpov∞dy ve Wordu verze vyÜÜφ ne₧ 7.0 (tedy jde o Word 97/2000/2002). Naproti tomu, s Wordem 7.0 (Word pro Windows 95) a jeho soubory RTF jsi i starÜφ kompilßtor rozumφ, a zde ke chyb∞ p°i tvorb∞ nßpov∞dnΘho souboru nedojde.

 

ProblΘm: P°i tvorb∞ grafickΘho rozhranφ pro moji nßpov∞du pou₧φvßm externφ bitovΘ mapy. Je vÜak pon∞kud pracnΘ vytvß°et p°i ka₧dΘ p°φle₧itosti obrßzky (nap°. pro odrß₧ky) a neustßle "odskakovat" od psanφ nßpov∞dy do kreslφcφho programu. Neexistuje n∞jakΘ jednoduÜÜφ °eÜenφ?

Odpov∞∩: Ano, °eÜenφ samoz°ejm∞ existuje a je velmi komfortnφ. Program Help Workshop obsahuje sadu standardnφch obrßzku, kterΘ m∙₧ete ihned pou₧φt p°i psanφ nßpov∞dnΘho textu. Tato malß galerie vypadß takto:

Pou₧itφ je vhodnΘ zejmΘna p°i odrß₧kßch nebo znaΦkßch odskok∙. Aplikace je velice snadnß:

zßpis {bmc shortcut.bmp} vytvo°φ v nßpov∞dnΘm textu obrßzek se Üipkou. Pokud chcete k obrßzku asociovat odskok, cel² v²raz v p°edchozφ v∞t∞ podtrhn∞te dvojit∞, ihned napiÜte nßzev tΘmatu, do kterΘho se mß skßkat a tento formßtujte jako skryt².

 

ProblΘm: Mßm problΘm p°i tvorb∞ neskrolujφcφ oblasti. A¥ d∞lßm co d∞lßm, kompilßtor mne v₧dy äpovzbudφô zprßvou o chyb∞:

HC3048: Warning: topic #1 of C:\Nßpov∞da.rtf:
        Nonscrolling region defined after scrolling region.

Jak lze situaci vy°eÜit?

Odpov∞∩: Je z°ejmΘ, proΦ se kompilßtor ästavφ na hlavuô. P°i vytvß°enφ statickΘ oblasti musφte pamatovat na to, ₧e neskrolujφcφ text musφ b²t v₧dy na zaΦßtku samotnΘho nßpov∞dnΘho tΘmatu. Jestli tedy aplikujete formßtovßnφ neskrolujφcφ oblasti na text n∞kde uvnit° nßpov∞dnΘho tΘmatu, kompilßtor vypφÜe v²Üe uvedenou chybu.

 

ProblΘm: Rßd bych do nßpov∞dnφho tΘmatu umφstil tlaΦφtko, kterΘ by poskytovalo u₧ivateli informace o p°φbuzn²ch tΘmatech. Jakmile by u₧ivatel klepnul na toto tlaΦφtko, objevilo by se okno se seznamem tΘmat, kterΘ poskytujφ souvisejφcφ relevantnφ informace. Za odpov∞∩ d∞kuji.

Odpov∞∩: Uvedenou problematiku lze spolehliv∞ zvlßdnout pomocφ dvou maker ALINK a KLINK. Ob∞ makra jsou si podobnß, rozdφl je ovÜem v tom, ₧e makro ALINK prochßzφ tΘmata, kterß obsahujφ znak A jako poznßmku pod Φarou, zatφmco makro KLINK prochßzφ tΘmata s pφsmenem K v poznßmce pod Φarou. Celß problematika je pon∞kud rozsßhlejÜφ, uvedu proto co mo₧nß nejjednoduÜÜφ a nejsrozumiteln∞jÜφ postup, jak dosßhnout stanoven² cφl s co nejmenÜφ nßmahou.

Uva₧ujme nynφ, ₧e mßte u vÜech tΘmat s relevantnφmi informacemi, pou₧it² znak K s textem v poznßmce pod Φarou. Kdy₧ chcete, aby po klepnutφ na odkaz äDalÜφ informaceô Winhelp prohledal vÜechny tΘmata a naÜel ty, kterΘ obsahujφ jako klφΦovΘ slovo v poznßmce pod Φarou t°eba slovo äSouborô, uskuteΦnφte uveden² zßpis makra:

Pokud bude nalezeno v∞tÜφ mno₧stvφ tΘmat, standardn∞ bude zobrazeno dialogovΘ okno, kterΘ u₧ivateli umo₧nφ vybrat to tΘma, o kterΘ mß zßjem.

Podobn∞ pracuje i makro ALINK, ovÜem klφΦovß slova specifikovßna v poznßmce pod Φarou za znakem A nejsou nikde v nßpov∞dnΘm souboru viditelnß. KlφΦovΘ slova K se naproti tomu objevujφ v indexu klφΦov²ch slov.

 

ProblΘm: Nevφte o jednoduÜÜφ cest∞ pro dvojitΘ podtr₧enφ textu a jeho skrytφ? P°i psanφ textu je krajn∞ nepohodlnΘ pou₧φvat myÜ jenom pro zm∞nu formßtu textu.

Odpov∞∩: ╚astΘ u₧φvßnφ myÜi p°i psanφ je opravdu nejenom nepraktickΘ, ale i namßhavΘ. NicmΘn∞, Word poskytuje klßvesovΘ zkratky, kterΘ tuto Φinnost zabezpeΦφ omnoho rychleji a hlavn∞ s vyÜÜφ efektivitou. Tady jsou:

- pro dvojitΘ podtr₧enφ vyberte po₧adovan² text do bloku a stiskn∞te CTRL+SHIFT+D
- pro skrytφ textu pak aplikujte CTRL+SHIFT+H

 

ProblΘm: Programuji ve Visual Basicu a cht∞l bych vytvo°it nßpov∞du pro jednotlivΘ polo₧ky menu. Nap°φklad mßm menu äSouborô, kterΘ obsahuje mnoho polo₧ek. Pro n∞kterΘ z nich bych rßd implementoval nßpov∞du. Dß se to v∙bec ud∞lat a kdy₧ ano tak jak?

Odpov∞∩: Aktivovat nßpov∞du pro polo₧ky menu lze mnoha zp∙soby. Jednφm z nich je pou₧itφ nßpov∞dnΘho textu ve statusbaru. V tomto p°φpad∞ se text vysv∞tlujφcφ jednotlivΘ polo₧ky menu objevuje ve vzpomφnanΘm ovlßdacφm prvku ihned jak u₧ivatel umφstφ kurzor myÜi änadô samotnou polo₧ku. Druhou mo₧nostφ je zobrazenφ nßpov∞dnΘho okna stisknutφm klßvesy F1. Zobrazenφ textu ve statusbaru je velmi struΦnΘ a obvykle poz∙stßvß jenom z n∞kolika slov, je tedy vhodnΘ pro jasnou a p°esnou nßpov∞du. Pokud vÜak pot°ebujete u₧ivateli sd∞lit v∞tÜφ mno₧stvφ informacφ, rad∞jiá vyzkouÜejte druhou mo₧nost.

Aby bylo v∙bec mo₧nΘ p°em²Ület o zobrazenφ nßpov∞dnΘho okna s k²₧en²mi informacemi, musφ b²t spln∞ny tyto podmφnky:

- sepsanΘ nßpov∞dnΘ tΘma
- tΘmatu musφ b²t p°i°azena jedineΦnß identifikaΦnφ Φφselnß hodnota
- ve Visual Basicu je nutnΘ vybrat vytvo°en² nßpov∞dn² soubor (Project>Properties>karta General>Help File Name)

Aktivujte p°φkaz Menu Editor... z nabφdky Tools nebo stiskn∞te CTRL+E. Vyberte po₧adovanou polo₧ku a v textovΘm poli vedle nßzvu HelpContextID zadejte Φφselnou hodnotu, pod kterou je namapovßno nßpov∞dnΘ tΘma pro aktußlnφ polo₧ku menu. Jakmile spustφte aplikaci, umφstφte kurzor myÜi änadô polo₧ku menu a stiskn∞te klßvesu F1, objevφ se nßpov∞da.

 

ProblΘm: Jak lze dosßhnout toho, aby odskok sm∞roval do jinΘho tΘmatu jinΘho nßpov∞dnΘho souboru?

Odpov∞∩: Pro "skßkßnφ" do jinΘho tΘmatu cizφho nßpov∞dnΘho souboru se pou₧φvß zßpis:     kde n1 je nßzev tΘmatu v souboru Nßpov∞da.hlp. VÜimn∞te si prosφm, ₧e jedin∞ text "Skok" je formßtovßn dvojit²m podtr₧enφm, ostatnφ text je skryt². (Znak zavinßΦe napφÜete lehce pomocφ kombinace pravΘ klßvesy ALT a pφsmena V.)

 

ProblΘm: Cht∞l bych do nßpov∞dy umφstit multimedißlnφ data ve form∞ videa. Jde to v∙bec s klasickou nßpov∞dou uskuteΦnit, nebo pot°ebuji vytvo°it HTML nßpov∞du?

Odpov∞∩: Mo₧nß budete p°ekvapeni, ale "klasickß" nßpov∞da dokß₧e opravdu obdivuhodnΘ v∞ci. Jednou z nich je i p°ehrßvßnφ multimedißlnφch souboru. Pro vlo₧enφ .avi souboru do nßpov∞dy je nutnΘ pou₧φt p°φkaz {mci}. Jeho syntaxe je uvedena nφ₧e.

{mci[_left| _right] [options,] filename}

Sekce [options] specifikuje hodnoty pro prohrßvßnφ multimedißlnφho souboru. P°ipomenu, ₧e pokud chcete uvΘst vφce hodnot, odd∞lujte je mezerami nikoliv Φßrkami.

HodnotyPopis
EXTERNALP°ehrßvßnφ souboru se uskuteΦnφ mimo okno nßpov∞dy.
NOPLAYBARNebude zobrazen ₧ßdn² ukazatel pr∙b∞hu prohrßvßnφ.
NOMENUJestli je zobrazen ukazatel pr∙b∞hu, nejsou p°φstupnΘ tlaΦφtka menu.
REPEATPo dokonΦenφ p°ehrßvßnφ se snφmek automaticky p°evine a pokraΦuje v p°ehrßvßnφ op∞t od zaΦßtku.
PLAYP°ehrßvßnφ zaΦφnß okam₧it∞ po otev°enφ souboru.

Filename p°edstavuje jmΘno souboru s multimedißlnφm obsahem.

P°φklad pou₧itφ: {mci external, video1.avi}

Na zßv∞r bych jeÜt∞ upozornil na zßvislost mezi velikostφ souboru videa a rychlosti p°ekreslovßnφ okna nßpov∞dnΘho tΘmatu. Kdy₧ je video p°φliÜ objemnΘ, zpomalφ se znaΦn∞ i prßce s nßpov∞dnφm tΘmatem a naopak.

 

ProblΘm: Jak docφlit toho, aby bylo mo₧nΘ z prost°edφ aplikace ve VB spouÜt∞t makra Winhelpu?

Odpov∞∩: Tento dotaz pat°φ do oblasti "vyÜÜφ matematiky" problematiky interakce aplikace a nßpov∞dnΘho systΘmu. Jak mo₧nß vφte, standardnφ deklarace funkce Winhelp je nßsledovnφ:

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

Po peΦliv∞jÜφm prostudovßnφ funkce zjistφte, ₧e poslednφ parametr je celΘ Φφslo (Long). P°edpoklßdejme, ₧e budete chtφt zavolat makro PopupID, kterΘ mß dva parametry. V tomto p°φpad∞ parametr wCommand funkce Winhelp nabude p°φznak HELP_COMMAND (&H102&). SamotnΘ makro bude pot°ebnΘ zapsat v jeho krßtkΘm tvaru (jako PI), proto₧e Winhelp je schopen akceptovat jen krßtk² tvar makra (pokud existuje). Za druhΘ, zßpis makra musφ b²t v uvozovkßch, proto₧e jde o textov² °et∞zec. ProblΘmem ale je, ₧e poslednφ parametr oΦekßvß celoΦφselnou hodnotu, zatφmco zßpis makra je prost² text.á

Kdybyste nynφ zkusili zavolat makro v nφ₧e uvedenΘm zßpise, VB by oznßmil v²skyt chyby za b∞hu programu Φφslo 13 - nesoulad datov²ch typ∙.

Dim nap As Boolean
nap = WinHelp(Form1.hwnd, "c:\pokus.hlp", _
HELP_COMMAND, "PI(`c:\pokus.hlp', `n1')")

Z hlediska logiky VB je vÜe p°irozenΘ û poslednφ parametr funkce Winhelp oΦekßvß Φφslo, zatφmco mu byl nabφdnut text, co₧ vyvolß chybu. Vy°eÜit tuto situaci lze pom∞rn∞ jednoduÜe mal²m trikem. Vytvo°te jeÜt∞ jednu deklaraci funkce Winhelp (resp. zkopφrujte tu souΦasnou), oznaΦte ji jako Winhelp2 a datov² typ poslednφho parametru zm∞≥te na String. V²sledek by m∞l vypadat jako v nßsledujφcφm p°φklad∞:

Public Declare Function WinHelp2 _
Lib "user32" Alias "WinHelpA" ( _
    ByVal hwnd As Long, _
    ByVal lpHelpFile As String, _
    ByVal wCommand As Long, _
    ByVal dwData As String _
) As Long

Pro spuÜt∞nφ makra je nevyhnutn² tento segment zdrojovΘho k≤du:

Dim nap As Boolean
nap = WinHelp2(Form1.hwnd, "c:\pokus.hlp", _
HELP_COMMAND, "PI(`c:\pokus.hlp', `n1')")

K≤d zobrazφ v popup okn∞ tΘma än1ô nßpov∞dnΘho souboru äpokus.hlpô.

Poslednφm problΘmem je ukonΦenφ spuÜt∞nΘ instance Winhelpu. V tomto p°φpad∞ nenφ mo₧nΘ pou₧φt p°φznak HELP_QUIT, proto₧e operujeme s novou instancφ funkce Winhelp (oznaΦenou jako Winhelp2). Aby bylo mo₧nΘ funkci opravdu ukonΦit, umφst∞te tento k≤d do obsluhy udßlosti Unload formulß°e Form1.

Dim konec As Boolean
konec = WinHelp2(Form1.hwnd, "c:\pokus.hlp", _
HELP_COMMAND, "Exit()")

Poslednφ parametr "Exit()" zabezpeΦφ ukonΦenφ Winhelpu, tak₧e ten ji₧ nealokuje pam∞¥ poΦφtaΦe.

Uveden² postup vzeÜel z dφlny autora, proto₧e ₧ßdn² konkrΘtnφ zp∙sob pou₧itφ nßpov∞dnφch maker prost°ednictvφm Visual Basicu nenφ v dostupnΘ literatu°e dokumentovßn ani jakkoli vzpomφnßn. Jde o pom∞rn∞ slo₧itou problematiku, ale uveden² algoritmus je opravdu funkΦnφ.

Na shledanou op∞t za m∞sφc.

Jßn Hanßk