<p class="Head1"><help:link Id="66513">Procedury a funkce</help:link></p>
<p class="Paragraph">Toto téma se věnuje popisu procedur (procedura typu SUB) a funkcí (procedura typu FUNCTION).</p>
</help:to-be-embedded>
<p class="Paragraph">Procedury a funkce umožňují rozdělit program na jednotlivé podprogramy a tím udržují jeho kód strukturovaný a přehledný.</p>
<p class="Paragraph">Výhodou procedur typu SUB a FUNCTION je, že jakmile jednou vytvoříte kód programu obsahující součásti, které řeší jednotlivé dílčí úlohy, můžete tento kód použít i v jiných místech projektu, a také v budoucích projektech. Pro ilustraci se podívejte na následující příklad programu:</p>
<p class="TextInTable">Tento program můžete zkopírovat z nápovědy aplikace <help:productname xmlns:help="http://openoffice.org/2000/help">%PRODUCTNAME</help:productname> a vložit jej přímo do rozhraní IDE. Chcete-li zadat program ručně, klepněte v nabídce <span class="T1">Nástroje</span> na příkaz <span class="T1">Makro</span> a zadejte do pole <span class="T1">Název makra</span> název Start. Klepnutím na tlačítko <span class="T1">Nový</span> přepněte do prostředí IDE.</p>
</span></th></tr></table>
<p class="Paragraph"/>
<p class="PropText">option explicit</p>
<p class="PropText"/>
<p class="PropText">Sub Start</p>
<p class="PropText"/>
<p class="PropText"><text:tab-stop xmlns:text="http://openoffice.org/2000/text"/>Dim stext as String</p>
<p class="PropText"><text:tab-stop xmlns:text="http://openoffice.org/2000/text"/>Dim sInfoText1 as String</p>
<p class="PropText"><text:tab-stop xmlns:text="http://openoffice.org/2000/text"/>Dim sInfoText2 as String</p>
<p class="PropText"><text:tab-stop xmlns:text="http://openoffice.org/2000/text"/>Dim sInfoText3 as String</p>
<p class="PropText"><text:tab-stop xmlns:text="http://openoffice.org/2000/text"/>Dim sTitleText as String</p>
<p class="PropText"/>
<p class="PropText"><text:tab-stop xmlns:text="http://openoffice.org/2000/text"/>sInfoText1 = "Please enter your text"</p>
<p class="PropText"><text:tab-stop xmlns:text="http://openoffice.org/2000/text"/>sInfoText2 = "This text contains"</p>
<p class="Paragraph">Pokud spustíte tento program přímo z prostředí IDE, začne program příkazem SUB Start (protože je na první pozici). V průběhu procedury je uživatel vyzván k zadání textu. Tento text je potom předán funkci <span class="T1">WordCount</span>, která spočítá počet mezer a vrátí počet slov obsažených v textu.</p>
<p class="Paragraph">Používání funkcí je výhodné z toho důvodu, že název funkce, například <span class="T1">WordCount</span> (PocetSlov) označuje, která funkce bude provedena, a potřebujete-li tuto funkci ještě v jiném místě programu, jednoduše ji opět zavoláte. Kód funkce je však v programu obsažen pouze jednou, což činí program kompaktnější a přehlednější.</p>
<p class="Head2">Předání proměnných procedurám typu SUB nebo FUNCTION</p>
<p class="Paragraph">Proměnné je možné předat procedurám typu SUB i FUNCTION; za předpokladu, že volaná procedura typu SUB nebo FUNCTION očekává parametr, mohou být proměnné použity jako pevné součásti programovacího jazyka aplikace <help:productname xmlns:help="http://openoffice.org/2000/help">%PRODUCTNAME</help:productname> Basic. Deklarace je následující:</p>
<p class="PropText">SUB SubName(Parameter1 As Type, Parameter2 As Type,...)</p>
<p class="PropText"/>
<p class="PropText"/>
<p class="PropText">programov├╜ k├│d</p>
<p class="PropText"/>
<p class="PropText"/>
<p class="PropText">END SUB</p>
<p class="Paragraph">Proceduru typu SUB zavoláte následujícím příkazem:</p>
<p class="Paragraph">Ujistěte se, že parametry předávané proceduře typu SUB jsou shodné s parametry specifikovanými v deklaraci procedury typu SUB.</p>
<p class="Paragraph">Stejný postup platí také u procedur typu FUNCTION, chcete-li vrátit výsledek funkce. Tento výsledek lze definovat přímo ještě před ukončením funkce, přiřadíte-li název funkce a její parametr hodnotě, kterou má funkce vrátit. (Viz příklad.)</p>
<p class="PropText">FUNCTION FunctionName(Parameter1 As Type, Parameter2 As Type,...) As Type</p>
<p class="Head3">Určení vrácené hodnoty procedury typu FUNCTION</p>
<p class="Paragraph">Jak je uvedeno u definice procedury typu FUNCTION v příkladu výše, musí být určen typ vrácené hodnoty. Podobně jako u proměnných jednoduše zadejte znak deklarující typ za název funkce nebo označte její typ výrazem As a odpovídajícím klíčovým slovem, které uvedete na konci seznamu parametrů. Řádek definice může mít následující podobu:</p>
<p class="PropText">Function WordCount(WordText as String) as Integer</p>
<p class="Head3">Předávání proměnných jako hodnot a odkazů</p>
<p class="Paragraph">Při předávání proměnných procedurám typu FUNCTION nebo SUB je velmi důležité rozlišit <text:s text:c="" xmlns:text="http://openoffice.org/2000/text"/>proměnné předávané jako odkazy nebo jako hodnoty.</p>
<p class="Paragraph">Jestliže není určeno jinak, jsou proměnné vždy předávány proceduře typu FUNCTION nebo SUB jako odkazy. To znamená, že když upravíte proměnnou v proceduře typu SUB nebo FUNCTION, je odpovídajícím způsobem upravena proměnná volaná touto procedurou typu SUB nebo FUNCTION, která se předává v kódu programu. V příkladu uvedeném výše upravte program následovně:</p>
<p class="Paragraph">Vložte další příkazový řádek do procedury SUB Start za příkaz <span class="T1">Print</span>.</p>
<p class="PropText">PRINT stext</p>
<p class="Paragraph">Vložte další příkazový řádek do kódu funkce <span class="T1">WordCount%</span> před řádek s příkazem End Function:</p>
<p class="Paragraph">Nyní spusťte program a zadejte text. Aplikace <help:productname xmlns:help="http://openoffice.org/2000/help">%PRODUCTNAME</help:productname> Basic vrátí počet mezer a vytiskne obsah proměnné <span class="T2"><text:s text:c="" xmlns:text="http://openoffice.org/2000/text"/>WordText$</span>: Function ended. Obsah této proměnné je upraven, ne však hlavním programem, ale funkcí <span class="T1">WordCount%</span>. Proměnná byla předána přímo funkci, proto bylo možné upravit její obsah, i když byla platná pouze uvnitř hlavního programu.</p>
<p class="Paragraph">Chcete-li tomu zabránit, vložte při volání procedury typu SUB nebo FUNCTION před předáním proměnné klíčové slovo ByVal (podle hodnoty). Upravte první řádek <span class="T1">Print</span> v proceduře SUB Start následovně:</p>
<p class="PropText">Print "This text contains";WordCount%(ByVal Text$);"words"</p>
<p class="Paragraph">Nyní se po opětovném spuštění programu zobrazí text přesně ve tvaru, v jakém byl zadán. Obsah proměnné by neměl být podprogramem upraven.</p>
<p class="TextInTable">Vytvoříte-li nový modul, vloží aplikace <help:productname xmlns:help="http://openoffice.org/2000/help">%PRODUCTNAME</help:productname> Basic automaticky proceduru SUB Main. To je pouze výchozí název a nemá nic společného s pořadím nebo výchozím bodem projektu aplikace <help:productname xmlns:help="http://openoffice.org/2000/help">%PRODUCTNAME</help:productname> Basic. Tuto proceduru můžete libovolně přejmenovat.</p>
</span></th></tr></table>
<p class="Paragraph"/>
<p class="Head2">Platnost proměnných v procedurách a modulech nebo mimo moduly</p>
<p class="Paragraph">Je-li proměnná definována uvnitř procedury typu SUB nebo FUNCTION, je platná pouze během provádění procedury a při dalším volání procedury typu SUB nebo FUNCTION je znovu vytvořena. Taková proměnná je označována jako lokálně definovaná proměnná. V mnoha případech může však být nutné definovat proměnnou, která bude platná ve všech procedurách nebo dokonce ve všech modulech všech knihoven. Můžete také chtít proměnnou zachovat i po ukončení procedury typu SUB nebo FUNCTION. Tato vlastnost je řízena v deklaraci proměnné v příkazu <span class="T1">Dim</span> prostřednictvím klíčových slov.</p>
<p class="Head3">Deklarace prom─¢nn├╜ch mimo proceduru typu SUB nebo FUNCTION</p>
<p class="PropText">DIM PUBLIC VarName As TYPENAME</p>
<p class="Paragraph">Proměnná je platná ve všech modulech.</p>
<p class="PropText">DIM PRIVATE VarName As TYPENAME</p>
<p class="Paragraph">Proměnná je platná pouze v tomto modulu.</p>
<p class="PropText">DIM VarName As TYPENAME</p>
<p class="Paragraph">Viz výše.</p>
<p class="Head3">Uložení obsahu proměnné po ukončení procedury typu SUB nebo FUNCTION</p>
<p class="PropText">DIM STATIC VarName As TYPENAME</p>
<p class="Paragraph">Hodnota proměnné bude uchována až do příštího volání procedury typu FUNCTION nebo SUB. Deklarace musí existovat také uvnitř procedury typu SUB nebo FUNCTION.</p>
<p class="TextInTable">Další informace naleznete v tématu <help:link Id="66471" Eid="basicfehler" xmlns:help="http://openoffice.org/2000/help">Ladění</help:link>, které poskytuje další příklady platnosti proměnných a zvláště pak možných chyb, jež se mohou vyskytnout při jejich nesprávném použití.</p>
<p class="TextInTable"><help:key-word value="Rekurzivní volání procedur a funkcí" tag="kw66513_1" xmlns:help="http://openoffice.org/2000/help"/>Rekurzivní volání procedur typu SUB a FUNCTION není možné.</p>