Fórum pro uživatele kancelářského balíku OpenOffice | LibreOffice
 

#1 15. 4. 2016 15:49:30

Marrtt
Člen
Registrace: 25. 2. 2015
Příspěvků: 115

problém s podprocedurou

Dobrý den
objevil se mi následující šotek, se kterým si nevím rady: při prvním spuštění makra se mi objeví (někdy!, ne pokaždé) hláška "podprocedura nebo funkční procedura není definována" a vysvítí se mi buď řádek s voláním procedury "numform(numberformatstring,numberformatid)", někdy ale řádek volající proceduru "line_manager". Přitom obě procedury existují. Když otevřu příslušný modul s touto procedurou a zase ho zavřu (bez jakékoliv úpravy), program můžu normálně spustit bez chybového hlášení.
Obě problémové procedury jsou v jedné společné knihovně, každá v samostatném modulu. Nepomohlo ani přejmenování, přemístění do jiné knihovny ani pokus použít "sub" místo "function"

deklarace:
Dim numberformatstring As string (jako společná proměnná před procedurou Main)

volání(z procedury Main, knihovna Libr_Start, modul Start):
arrea = Strana_2.getcellrangebyname("o1")
numberformatstring = "# ##0,0000"
numform(numberformatstring,numberformatid)
arrea.NumberFormat = numberformatid
                                                            
procedura (knihovna Libr_Helps, modul D_Num_form_1, 0,45 kB):
function numform(numberformatstring,numberformatid)
    Fondy = thisComponent
    Dim numberformatid As long
    Dim NumberFormats As Object
    Dim LocalSettings As New com.sun.star.lang.Locale

    NumberFormats = Fondy.getNumberFormats()
    numberformatid = Fondy.NumberFormats.queryKey(NumberFormatString,LocalSettings,true)
    If numberformatid = -1 Then
        numberformatid = NumberFormats.addNew(numberformatstring,LocalSettings)
    End If
End function

stejně tak havaruje při prvním spuštění procedura "line_manager" (ale jen někdy!)

volání(z procedury Main, knihovna Libr_Start, modul Start, 10,3 kB):
line_manager

procedura (knihovna Libre_Helps, modul A_Line_man, 0,9kB):
sub line_manager
    Fondy = thisComponent
    Strana_2 = fondy.sheets(2)

    buy_first_insert = Strana_2.getcellrangebyname("e1")
    buy_last_insert  = Strana_2.getcellrangebyname("f1")
    acc_last_insert  = Strana_2.getcellrangebyname("b1")
    fund_first_insert= Strana_2.getcellrangebyname("c1")
    fund_last_insert = Strana_2.getcellrangebyname("d1")
    acc_num_total = Strana_2.getcellrangebyname("b2")
    fund_num_total = Strana_2.getcellrangebyname("b3")
    buy_num_total = Strana_2.getcellrangebyname("b5")

    if     acc_num_total.value = 0 then
        acc_last_insert.value = 7
    else
        acc_last_insert.value = 6+acc_num_total.value
    endif

    fund_first_insert.value = acc_last_insert.value+7
    fund_last_insert.value = fund_first_insert.value+fund_num_total.value*4
    buy_first_insert.value = fund_last_insert.value + 11
    buy_last_insert.value = buy_first_insert.value + buy_num_total.value * 4
end sub

jesli někoho napadá, co by mohlo být špatně, prosím o radu. Děkuji

Offline

#2 15. 4. 2016 18:00:51

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 2,581

Re: problém s podprocedurou

Jestli se nepletu tak jde o mnoho poměrně složitě svázaných modulů s dialogy. Tam se dá čekat ledacos. Já vidím například nesprávně zadeklarovanou funkci :
------------------------------------------------
function numform(numberformatstring,numberformatid)
    Fondy = thisComponent
    Dim numberformatid As long - tohle má smysl jen když to není předávaný parametr
    Dim NumberFormats As Object
    Dim LocalSettings As New com.sun.star.lang.Locale

    NumberFormats = Fondy.getNumberFormats()
    numberformatid = Fondy.NumberFormats.queryKey(NumberFormatString,LocalSettings,true
    If numberformatid = -1 Then
        numberformatid = NumberFormats.addNew(numberformatstring,LocalSettings)
    End If
End function
------------------------------------------------
     Konkrétně první proměnná je deklarovaná takto
Dim numberformatstring As string.
     Ta bude vidět jen v daném modulu. Nevidím odkud berete numberformatid ale také bude někde blbě deklarovaný. Vy ho deklarujete znovu ve funkci a současně ho funkce dostává jako přenesený parametr - to je nesmysl - buď to - nebo tamto. Pokud je to podobně deklarované jako numberformatstring tak by funkce mohla deklaraci aktivivat (v podstatě nabíjet). Jenže vy ji přenášíte parametrem, znovu ji deklarujete a pak ji přiřadíte nějakou vlastnost.


     Funkce numform(numberformatstring,numberformatid) nepotřebuje přenos parametrem který je definovaný lokálně v modulu. Ten se jednoduše zavolá přímo ve funkci. Předávaný parametr - to co je v závorece za názvem funkce nemá smysl když jde o vnější promennou (ať už Dim, Global, static a podobně.)

function numform
    Fondy = thisComponent
    Dim numberformatid As long 'pokud je deklarovaná už jinde tak tohle může být chyba
    Dim NumberFormats As Object
    Dim LocalSettings As New com.sun.star.lang.Locale

    NumberFormats = Fondy.getNumberFormats()
    numberformatid = Fondy.NumberFormats.queryKey(NumberFormatString,LocalSettings,true)
    If numberformatid = -1 Then
        numberformatid = NumberFormats.addNew(numberformatstring,LocalSettings)
    End If
End function

     Podstata neporozumění celé záležitosti je v tom jak fungují proměnné. Když deklarujete proměnnou někde mimo proceduru - například jako DIM tak tato proměnné má poplatnost (viditelnost) jen v tom určitém modulu. Běžně se takto deklaruje jen uvnitř procedury a proměnná je vidět jen v proceduře nebo funkci. Mimo proceduru - vně by se mělo deklarovat jako Private (Sub, nebo function ap.). Pokud zadeklarujete Global je to vidět ve všech modulech i knihovnách.
     Problém je v tom, že takto deklarované vnější proměnné (nejen Sub a function) se musí na začátku aktivovat. Například mějme proměnnou sVar :
Global sVar as string (na začátku listu nejlépe v prvním modulu před první procedurou - podívejte se do knihovny LibreOffice, nebo Apeche OpenOffice).
     Proměnnou musíte aktivovat například zavoláním
Sub aktivace
svar = ""
End sub
     Do té doby je neviditelná a dělá přesně to co popisujete - makra ji nemohou načíst. Ovšem Vy tam máte podobných chyb asi nepočítaně. Když máte například vnější deklaraci sVar a uděláte deklaraci duplicitní lokálně v makru tak tuto proměnnou makro nepozná vůbec.
     Například mnoho proměnných se ani deklarovat nemusí a systém přiřadí sám správný formát. Pak stačí zavolat nejdříve tu automaticky deklarovanou proměnnou a následně to explicitní vnější a je to chyba která se někdy objeví a jindy ne. Přesně tohle popisujete.


     Doporučuji si prostudovat v nápovědě používání proměnných a funkcí, předávání hodnot a parametrů, deklarace proměnných a podívat se do knihovny systému.
Další věc - co je tohle numform(numberformatstring,numberformatid) z druhého odstavce pře stejnojmennou funkcí?


Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte tak orientaci na fóru při vyhledávání řešení problémů
JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#3 16. 4. 2016 09:20:07

Marrtt
Člen
Registrace: 25. 2. 2015
Příspěvků: 115

Re: problém s podprocedurou

OK, podívám se na systém deklarací, tušil jsem, že to bude v tom, ale nevěděl jsem jak to udělat.

...Další věc - co je tohle numform(numberformatstring,numberformatid) z druhého odstavce pře stejnojmennou funkcí?
jestli myslíte tohle:
volání(z procedury Main, knihovna Libr_Start, modul Start):
arrea = Strana_2.getcellrangebyname("o1")
numberformatstring = "# ##0,0000"
numform(numberformatstring,numberformatid)
arrea.NumberFormat = numberformatid

tak je to výpis řádků z makra, které volá tuto proceduru. Proměnnou "NUMBERFORMATID" jsem uvažoval jako výstupní z procedury "numform", která by jí teprve měla dát hodnotu.
...
Měl bych tedy proměnnou NUMBERFORMATID deklarovat pře makry jako GLOBAL  a neuvádět ji v parametrech volané funkce? Nebo deklarovat až v makru, které jí dává hodnotu a předávat jako parametr funkce zpět do volající procedury? A proměnnou NUMBEFORMATSTRING pak deklarovat v modulu nebo v makru, kde se jí dává hodnota a předávat jako parametr funkce nebo deklarovat jako GLOBAL a nepředávat ji jako parametr?

Offline

#4 16. 4. 2016 09:30:37

Marrtt
Člen
Registrace: 25. 2. 2015
Příspěvků: 115

Re: problém s podprocedurou

Ještě jeden dotaz:
deklarace GLOBAL patří před před první spouštěnou proceduru nebo před makro, které je fyzicky první v seznamu knihoven a modulů?? Např. jako první spouštím makro MAIN v modulu START (knihovna Libr_Start), ale fyzicky je první v seznamu makro acc_DB_manager v modulu A_Accounts (knihovna Libr_Accounts).

Offline

#5 16. 4. 2016 09:51:24

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 2,581

Re: problém s podprocedurou

O tom jak deklarovat proměnnou by měla rozhodnout skutečnost zda stejnou hodnotu (proměnnou) využívá více jinak nezávislých Subroutine (function). Pokud jde jenom o přenos mezi určitou rutinou a funkcí tak se proměnná zadává jen jako parametr.

příklad : Máme Sub TEST které volá funkci FUNKCE. Funkce má spočítat například druhou odmocninu z "X".

Sub TEST
Dim iVar, odmocneno as integer
Odmocneno = FUNKCE(iVar) 'Takhle se volá funkce a předává se jí parametr iVar
Print Odmocneno
End Sub

Function FUNKCE(ByVal i as integer) 'takhle to do stane funkce
FUNKCE = SQR(i) 'tohle je výstupní sekvence - jméno vlastní funkce
End Function


    V takovém případě je to jen čenč zadání a jeho výsledku - používá se pro odlehčení a zrychlení procesu. Vše je také značně přehlednější.


    Když máte vnější deklarace tak první zavolání je aktivuje. Druhé už přímo nosí obsah tam kde se objevuje volání. To je však už bez deklarací. Chceme například součin proměnné Global s názvem GlobProm a buňky která obsahuje nějaké číslo. GlobProm je deklarována někde úplně jinde a je aktivována. Stačí ji jen zavolat do operace :
Cell.Velue = Cell.Value * GlobProm


-  Takže ji v tom kterém makru ani nedeklarujeme a ani ji nepředáváme jako parametr. Jednoduše ji zavoláme protože systém ji zná iá když je v úplně jiném modulu.


Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte tak orientaci na fóru při vyhledávání řešení problémů
JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#6 16. 4. 2016 09:57:18

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 2,581

Re: problém s podprocedurou

Já osobně deklaruji global v místech kde je normálně při startu nového modulu REM..... a Sub Main. To smažu a zadeklaruji Global - na začátku modulu. Ale jak jsem uváděl jde to nejlépe před všemi ostatními scripty - tedy tam kde se startuje protože načtení a aktivace se musí udělat většinou hned na začátku. Když se podíváte do systému LO (AOO) tak jsou tam deklarace na samostatných listech na začátku knihovny a mívají tam je symbolické makro aby byl list vidět.
    Takže když necháte první modul tak jak je s makrem Main tak před něj dejte všechny proměnné. Vlastní Main by mělo být startovní makro, ale stačí prázdné - aby modul byl viditelný (když je úplně prázdný tak není vidět).

Editoval neutr (16. 4. 2016 09:58:27)


Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte tak orientaci na fóru při vyhledávání řešení problémů
JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#7 16. 4. 2016 12:28:30

Marrtt
Člen
Registrace: 25. 2. 2015
Příspěvků: 115

Re: problém s podprocedurou

Udělal jsem ještě jeden pokus:
odstranil jsem (rem) z problémové procedury všechny příkazy (tedy i závislost na jakékoliv deklaraci) a nahradil jsem je jednoduchou sekvencí (c=5, msgbox c), a proceduru i její volání jsem i přejmenoval (a je bez parametrů). I přesto se tento problém zopakoval. To mi napovídá, že problém může být jinde než v deklaracích proměnných - jakoby tuto proceduru vůbec nemohl najít v knihovnách - přitom je všude vidět, vč. organizátoru. Navíc jsem si uvědomil, že kód je postaven tak, že její volání je ve skupině příkazů, které se provádí pouze v prvním spuštění programu (zavedení vzorců a naformátování polí). Takže to bezchybné spuštění probíhalo tím, že se program proceduře prostě vyhnul. Jakmile odstraním indikátor, že tato první iniciace proběhla, program se jí pokusí obnovit a znovu zhavaruje na stejné chybě.

Offline

#8 16. 4. 2016 14:21:24

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 2,581

Re: problém s podprocedurou

Teď asi nejsem v obraze cituji : odstranil jsem (rem) z problémové procedury všechny příkazy
     REM je funkce která označuje komentáře. Lze ji nahradit pomocí jednoduché uvozovky ('), nebo také pomocí /// a i jinak. Když byste odstranil z nějaké procedury všechny příkazy tak zůstanou deklarace a nejvýš ještě funkce (existují funkce například DAY, ERR, FORMAT....)


Dále cituji : (tedy i závislost na jakékoliv deklaraci) a nahradil jsem je jednoduchou sekvencí (c=5, msgbox c), a proceduru i její volání jsem i přejmenoval (a je bez parametrů).
     Předpokládám, že jste toto prováděl u té funkce numform. Ovšem ten popis (c=5, msgbox c)
odpovídá spíš tomu mému vzoru kde jste nahradil print MsgBoxem a iVar číslem 5 - asi takto :

Sub TEST
Dim iVar, odmocneno as integer
ivar = 5
Odmocneno = FUNKCE(iVar) 'nebo podobně
'Odmocneno = FUNKCE(5)
MsgBox Odmocneno
End Sub

Function FUNKCE(ByVal i as integer) 
FUNKCE = SQR(i) 
End Function

     Ale takhle to chodí bez problémů takže jde asi o něco jiného. Jde o tuto funkci numform?
numform(numberformatstring,numberformatid)
     Pokud předáváte parametry takto : numform(c=5, msgbox c) tak se není čemu divit.
Uvádíte, že je to ale bez parametrů a přejmenované.
Ta proměnná "c" se správně má deklarovat, ale systém si poradí i bez deklarace. MsgBox je funkce, nebo také příkaz(existují obě varianty) a takto je dávno vše.
když kdekoliv zadáte MsgBox 5, nebo MsgBox c tak to musí zobrazit to "c" respektive číslo 5.
Otestujte :

Sub TestMsgBoxu_1
c = 5
MsgBox c
End sub

Sub TestMsgBoxu_2
MsgBox 5
End sub

     Popravdě vůbec nechápu co popisujete. Když se funkce (nebo i sub) plní parametrem tak je to přenos nějaké hodnoty, nebo řetězce ap. Takže například
Function NEJAKAFUNKCE(ByVal X as long, ByVal sText as string)
     Ještě existuje ByRef nebo se neuvádí nic (to je sice většinou funkční ale například u LibreOffice je to nedoporučeno - nikliv však zakázáno).
     Zato přenášený parametr musí být deklarován. Dá se například přenášet číslo řádku z původního makra jako "integer", ale do krmené funkce musí být deklarováno "Long" jinak vyskočí chyba (čísla řádků a sloupců jsou deklarována jako Long - protože hodnota Integer končí někde na 32767 a řádků v sešitě je asi 1,048 milionu).
     Takže například voláme funkci ABC(x) a "x" je deklarováno jako integer. Funkce ABC ale musí být deklarována Function ABC(ByVal Y as long). Načte původní integer(x) a uvnitř funkce ABC je to Long(Y) - tedy nezáleží na původním názvu při volání a ani na jeho deklaraci. Volaná funkce to načte podle toho co má zapsané "na vrátnici".


     Jednoduše asi musíte změnit systém práce. Každé makro otestujte samostatně bez souvislostí a když bude fungovat udělejte provázání a zase otestujte. Postupně provazujte a tím dojdete na místo které hapruje. To co uvádíte mi říká že používáte přímo nefunkční makra.

Editoval neutr (16. 4. 2016 14:22:14)


Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte tak orientaci na fóru při vyhledávání řešení problémů
JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#9 16. 4. 2016 15:09:56

Marrtt
Člen
Registrace: 25. 2. 2015
Příspěvků: 115

Re: problém s podprocedurou

udělal jsem tohle (funkci jsem přejmenoval na 100% nikdy nepoužité jméno a ze všech původních příkazů i deklarací jsem udělal jen REM-poznámky, takže jsou nefunkční, tedy nemůže jít o nesoulad v deklaracích):

sub pytel rem (numberformatstring) rem,numberformatid)

msgbox "NAZDAR" - rem jediný funkční příkaz

rem    Fondy = thisComponent
rem    Dim numberformatid As long
rem    Dim NumberFormats As Object
rem    Dim LocalSettings As New com.sun.star.lang.Locale
rem    NumberFormats = Fondy.getNumberFormats()
rem     numberformatid = Fondy.NumberFormats.queryKey(NumberFormatString,LocalSettings,true)
rem    If numberformatid = -1 Then
rem        numberformatid = NumberFormats.addNew(numberformatstring,LocalSettings)
rem    End If
End sub

tedy vlastně vznikne triviální testovací procedura bez parametrů a přenosů proměnných:
sub pytel
  msgbox "NAZDAR"
end sub

a stejně to na ní padá

Offline

#10 16. 4. 2016 15:49:28

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 2,581

Re: problém s podprocedurou

Otestujte tohle - u mne to chodí oboje. Byla tam chyba jako pomlčka před rem u prvního makra. Druhé makro házelo chybu protože existovaly dvě makra se stejným názvem :

sub pytel rem (numberformatstring) rem,numberformatid)

msgbox "NAZDAR" rem jediný funkční příkaz (ale byla pomlčka před tímto rem

rem    Fondy = thisComponent
rem    Dim numberformatid As long
rem    Dim NumberFormats As Object
rem    Dim LocalSettings As New com.sun.star.lang.Locale
rem    NumberFormats = Fondy.getNumberFormats()
rem     numberformatid = Fondy.NumberFormats.queryKey(NumberFormatString,LocalSettings,true)
rem    If numberformatid = -1 Then
rem        numberformatid = NumberFormats.addNew(numberformatstring,LocalSettings)
rem    End If
End sub

'tedy vlastně vznikne triviální testovací procedura bez parametrů a přenosů proměnných:
'ale měla stejné jméno jako ta první tak jsem ji přejmenoval na pytel1 :-)
sub pytel1
  msgbox "NAZDAR"
end sub

Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte tak orientaci na fóru při vyhledávání řešení problémů
JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#11 16. 4. 2016 15:56:58

Marrtt
Člen
Registrace: 25. 2. 2015
Příspěvků: 115

Re: problém s podprocedurou

- rem jediný funkční příkaz
to jsem dopisoval až tady v chatu, v proceduře to není

Offline

#12 16. 4. 2016 16:07:14

Marrtt
Člen
Registrace: 25. 2. 2015
Příspěvků: 115

Re: problém s podprocedurou

Přemístil jsem procedury do stejné knihovny a modulu jako volající makro a problém se neopakuje - nějaká chyba ve spolupráci knihoven???

Offline

#13 16. 4. 2016 16:19:33

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 2,581

Re: problém s podprocedurou

To ne pokud nepoužíváte knihovnu nad všemi makry "Moje Standard". Ta by tohle uměla, ale takovéhle kraviny doufám neděláte. Všechno co užíváte by mělo být v jediném dokumentu i když může mít desítky knihoven a stovky modulů s tisíci makry.
     Samozřejmě když uděláte deklaraci Dim jako vnější tak takovou proměnnou nemůžete číst v jiné knihovně, respektive se načte nanejvých jako prázdný řetězec nebo nula - ale většinou jako neznámý parametr. Jak a kam co umístit je jedna ze základfních úvah programátora. S tím těsně souvisí určení typu proměnných a jejich deklarace - zbytek už znáte.


Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte tak orientaci na fóru při vyhledávání řešení problémů
JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#14 16. 4. 2016 18:37:44

Marrtt
Člen
Registrace: 25. 2. 2015
Příspěvků: 115

Re: problém s podprocedurou

Ne - proměnné byly deklarované podle Vašeho návodu - GLOBAL numberformatstring As string a GLOBAL numberformatid As long před prvním makrem MAIN. Pokud byla problémová procedura v jiné knihovně (samozřejmě pod jedním dokumentem), nefungovala. Pak jsem ji celou vzal a přesunul do stejného modulu jako je volající makro. Tam funguje. Když ji přesunu do původní knihovny, nefunguje a program ji nenajde. BLÉÉÉ....

Offline

#15 16. 4. 2016 18:55:36

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 2,581

Re: problém s podprocedurou

Nevím co se jak stalo. Já běžně užívám deklarace Global pro dvě knihovny (běžně pro standard a nějakou další - například Library která bývá uzamčena). Nevím pod jakou verzí LO, nebo AOO to používáte a je možné že máte nějakou verzi kde to zlobí.
     Otestujte deklaraci Public já ji příliš nepoužívám ale měla by zviditelnit proměnnou ve všech programových modulech.

Editoval neutr (16. 4. 2016 18:57:15)


Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte tak orientaci na fóru při vyhledávání řešení problémů
JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#16 16. 4. 2016 19:59:29

Marrtt
Člen
Registrace: 25. 2. 2015
Příspěvků: 115

Re: problém s podprocedurou

taky to s tím nejde...a začíná se mi to sypat celý, přestává vidět další procedury, který fungovaly...asi si to hodím na první větev... dneska končím, budu to dál testovat jindy. Děkuju za trpělivost.

Offline

#17 2. 9. 2016 15:42:53

balamut
Člen
Registrace: 2. 9. 2016
Příspěvků: 1

Re: problém s podprocedurou

Já bych to tipoval (protože z výše uvedeného nic nepoznám), že by vůbec neškodilo na začátku ty ostatní knihovny explicitně natáhnout.

tj. zavolat na Event OnLoad něco jako

sub Init
   LoadLib("LibName1")
   LoadLib("LibName2")
End Sub 

kde

Sub LoadLib (MyLib as String)
If (Not GlobalScope.BasicLibraries.isLibraryLoaded(MyLib)) Then
    GlobalScope.BasicLibraries.LoadLibrary(MyLib)
    End If
End Sub

Offline

#18 2. 9. 2016 17:37:22

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 2,581

Re: problém s podprocedurou

To máte asi pravdu, ale Marrtt se už delší dobu neozval, takže debata dál nepokračovala.


     Základem jsou deklarace proměnných opisuji nápovědu :
Public : - Deklaruje proměnnou na úrovni modulu (tj. ne do procedury nebo funkce), takže je přístupná ve všech knihovnách a modulech. Jenže tohle se musí aktivovat jako příkaz makrem nebo funkcí. Stačí to udělat na začátku a pak to jenom měnit, ale já to považuji za nevhodný postup. Proměnná zůstává nastavena a mohou k ní také jiné moduly. Jde tedy o něco, co se hodí do nadřazených knihoven Standard ap. nad celým kancelářským balíkem.
     Jenže já mám s touhle deklarací špatné zkušenosti. Nedaly se aktivovat z místní knihovny určitého dokumentu. Takže aktivace se musela spouštět z knihovny dokumentu a aktivovala se do nadřazené knihovny Standard. Tohle se nepodaří transportovat s dokumentem. Muselo by to být rozšíření. Když se to neudělá správně je zle. Řeknu to jinak : - Public funguje jen v knihovně určitého dokumentu a není viditelná nad dvěma různými dokumenty byť stejného druhu - například Calcy. Je to vysloveně vhodné jen do nadřazené knihovny.


Global : - Deklaruje proměnnou na globální úrovni (tj. ne do procedury nebo funkce), takže je přístupná ve všech knihovnách a modulech aktuálního sezení.
    Tohle opravdu funguje podle předpokladu. Jen se to musí také aktiviovat pokud to má chodit tak jak popisuje nápověda. Já to používám ve velké většině případů. Mám ale dojem, že to umí číst jen dokumenty otevřené před aktivací. Tedy nevím to jistě, ale tak to asi je, nebo bylo když jsem hledal před časem nějaké řešení.


     Testoval jsem k tomu ještě Set : - Nastaví odkaz na objekt, proměnnou nebo vlastnost. Je to sice typické načtení array, ale mělo by to fungovat vždy - ať už na string, nebo numerickou, variant, object...
     Dále jsem testoval celkem nepotřebné Call : - Přenese vykonávání programu do procedury, funkce nebo DLL procedury. Takhle by se správně měla volat proměnná z "nevlastní" knihovny k načtení. Tedy podobně jako se dělá aktivace.
     Aktivace v rámci stejné knihovny (global) stačí udělat hned přímo přiřazením hodnoty. Logicky tedy není nutné dělat extra sktivaci. Je logické, že pak Global funguje na úrovni Privat a Dim. Takže pro načtení doporučuji Call, nebo slepé přiřazení - Napřiklad v makru iVar = GlobalProměnná. S iVar dál nemusíme pracovat. Global je vidět.


     Takže já jsem se k takovým pokusům chtěl dopracovat, ale Marrtt to zřejmě vzdal, nebo našel řešení. Teoreticky by PUBLIC mělo být nejsilněší a nejtrvanlivější, ale musí se testovat aktivace i volání mnohem pečlivěji nežli Global.. Samo od sebe to prostě nefunguje vždy tak jak by si to uživatel představoval.


Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte tak orientaci na fóru při vyhledávání řešení problémů
JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

Zápatí