Děkuju,
pročtu si to a zamyslím se nad tím, znovu podotýkám, že je to můj první případ a nemám zkušenosti, trápil jsem se nad tím dlouho, než se to vůbec rozběhlo. Studoval jsem vývojáky ještě za krále klacka a není to můj denní chleba.
Spousta pindů, nevím proč se vyžíváte ve zdůraňování toho, že moc neumíte.
Ale už teď vidím, že tahle úprava s cyklem na konci znamená zápis do stále stejné buńky (1,i+4). Můj záměr je trvale naplnit 10řádkový seznam v Calcu a zároveň zajistit, aby po každém vložení nové položky do tohoto seznamu se okamžitě objevila nová položka v listboxu v témže dialogu a zároveň makro kontrolovalo, zda počet položek nepřekročil povolené množství (zde 10). Při první iniciaci zároveň kontroluji, zda je vůbec nějaká položka zadána.
Ano, je to poznamenáno v komentáři v proceduře. Nehodlám se zabývat programováním. V proceduře jsem jen odstranil rekurzi. Ostatní snad zvládnete sám. Doplnění je snadné.
Cyklus Do-While na konci odstaví kontrolu naplnění seznamu a nezapisuje nové položky do Listboxu. proto jsem volil rekurzi procedury, která po každém vložení doplní Listbox a zároveň provede kontrolu (později chci ještě vestavět kontrolu na duplicitu položek).
Viz výše. Co Vám brání po vyplnění dialogu zkontrolovat správnost a unikátnost dat, zapsat je na správné místo a případně doplnit ListBox? Ovšem řešit to rekurzivním voláním procedury obsluhující událost dialogu rozhodně nemohu doporučit.
Z téže procedury budu později řešit i odchod do další práce s vloženými položkami (např. pohyby na příslušných účtech).
Nechápu co to znamená. Rada zní: Nedělejte to, přinejmenším do té doby, než pochopíte a porozumíte, jak psát aplikaci s dialogy.
Volání této rekurze ovšem neproběhne nijak často, jedná se o seznam bankovních účtů a ty se nepřidávají každý den, spíše to bude jednorázová záležitost; je obvyklé obchodovat maximálně se třemi účty (i kontrola na přeplnění je spíše alibi), takže toto zpětné volání nijak nezatíží běh programu.
Obvykle lze rekurzi nahradit cyklem. Obvykle je cyklus také rychlejší a tohoto typu nedělá problémy na které si mimochodem stěžujete (nefunkčnost metod, padání aplikace).
vyzkouším navrženou úpravu SELECT-CASE + příkazy VISIBLE a EndDialog
Ty metody jsou ukázány dvě. Vyberte si jednu.
Budu rád, pokud mi někdo sdělí zkušenosti s příkazem ENDEXECUTE()
V této úloze je použití této metody zbytečné, spíše škodlivé.
]]>PS:
Omlouvám se ještě jednou všem (především panu NEUTR), kteří měli dojem, že jsem nějak agresivní, na něco si stěžuji nebo si něco vynucuji - pokud to tak vypadalo, je to mylný dojem a rozhodně to nebyl můj úmysl. Jsem rád, že mám s kým konzultovat, každý má na věc jiný pohled a pokud z toho vyplyne přínos a elegance, rád se poučím nebo to použiju jinde a jindy. Budu rád, pokud mi někdo sdělí zkušenosti s příkazem ENDEXECUTE(), našel jsem ho v nějaké anglické příručce, komentář mi nebyl jasný. (Netrvám na něm dogmaticky, ale příkaz mi funguje).
Martin
a) Podívejte se na úpravu maker. Např. odsazování. Kód se hodně těžko čte, není jasné, co chcete.
b) Používáte nevhodný styl programování. To o co se pokoušíte je aplikce řízená událostmi. Vy se pokoušíte události nahrazovat sekvenčním algoritmem. Výsledkem je zbytečně rekurzivní volání dialogů, nepřehledný kód
sub main
dim vysledek as integer
DialogLibraries.LoadLibrary("Standard")
Hlavni_menu = createUnoDialog(DialogLibraries.Standard.Hlavni_menu)
do
vysledek = Hlavni_menu.execute()
' Různé způsoby obsluhy tlačítek
Select Case vysledek
Case 4 ' zpracování je v proceduře
' sprava_fin_uctu
Case 3
msgbox "zde se bude zpracovávat a uchovávat seznam obchodovaných fondů"
' tady může být zpracování
Case 2
MsgBox "procedura pro zpracování obchodů"
Case 1
MsgBox "Ok (není v nabídce)"
Case 0
MsgBox "Hotovo"
End Select
loop while vysledek <> 0
Hlavni_menu.dispose()
end sub
' Zpracování je v proceduře,
' hlavní dialog není ukončen a po dokončení operace se řízení vrací do dialogu
Sub from_main_to_fin_acc
' hlavni_menu.setVisible(False) ' Skryje hlavní dialog
sprava_fin_uctu
' hlavni_menu.setVisible(True ) ' Znovu ho zbrazí
' hlavni_menu.endDialog(4)
end sub
' Vlastní akce je v hlavní proceduře a po ukončení se hlavní dialog opět spustí
' Procedura ukončí hlavní dialog se návratovým kódem
sub sprava_portfolia
hlavni_menu.endDialog(3)
end sub
sub obchodovani
hlavni_menu.endDialog(2)
end sub
Zpracování účtu - nechtělo se mi luštit smysl, tak jen úprava konce.
V dialogu je třeba nastavit ukončení na typ tlačítka Cancel (Zrušit)
Sub sprava_fin_uctu
dim cell as object
dim finacc_num as string
dim x as integer
dim i as integer
Fondy = thisComponent Rem název projektu
Strana_1 = fondy.sheets(1) Rem pohledová tabulka
Strana_2 = fondy.sheets(2) Rem databáze
Strana_3 = fondy.sheets(3) Rem pomocné proměnné
DialogLibraries.LoadLibrary("Standard")
fin_acc = createUnoDialog(DialogLibraries.Standard.fin_acc) rem dialog správa finančních účtů
finacc_num_box = fin_acc.GetControl("finacc_num_box") rem deklarace seznamu účtů
i = strana_3.getCellByPosition ( 8 , 0 ).value rem buňka s počtem účtů v seznamu (později možná ještě kontrola na duplicitu)
if i > 0 then rem exixtence nějakého účtu?
if i = 10 then rem------ ověření kapacity zásobníku
msgbox "počet finanční účtů přesáhl povolenou kapacitu, přepisuji od pozice 1"
i= i-10
else
endif
rem------
for x=0 to (i-1) rem cyklus k naplnění seznamu účtů
cell = strana_1.getCellByPosition (1 , x+4 )
finacc_num_box.additem(cell.string,finacc_num_box.itemCount + 1)
next x
else
finacc_num_box.additem("nemáte definován žádný obchodní účet",finacc_num_box.itemCount + 1) rem výstraha - žádný účet (ale možno dále pracovat i bez účtů, nebudou pracovat některé procedury)
endif
rem vyvolej dialog
do while fin_acc.execute() = 1 ' pokud je něco vloženo, tak to zapiš
num_acc_str = fin_acc.GetControl("num_acc_str") rem načti číslo úču
curr_acc_str = fin_acc.GetControl("curr_acc_str") rem načti měnu účtu (zatím nezpracováno)
cell = Strana_1.getcellbyposition ( 1,i+4) rem definuj buňku pro zápis účtu
cell.string = num_acc_str.text rem zapiš účet do buňky
' asi by tu mělo být nějaké nastavení dalšího opakování dialogu
Loop
fin_acc.dispose()
end sub
Takže není na místě vyčítat - "Nikdo jste neřekl že dialog..". Je na místě vyčítat : zamyslete se o co si opravdu píšete a co chcete (nebývá to totéž - a dost často tazatel na konci chce něco jiného, nežli chtěl na začátku).
Vy skutečně vyžadujete osobní asistenci a vysvětlení základů - jinak byste nemohl být tak nekritický. Uvědomte si, že tady Vám nikdo odpovídat nemusí. Vše děláme dobrovolně, a když mne osobně někdo naštve tak mu také správnou formou odpovím. Takže pokud mohu prosit rozumně a kriticky jen konkrétní věci.
detail je uveden zde v adresáři Dialog_uvodni_menu na adrese https://app.box.com/s/8cje9qgu5gscygzeon5wx45pb61yc2x9 (zatím je to potřeba zpouštet ručně jako MAIN, ještě jsem do přiloženého Calku nedal žádný kulturní spouštěč, např. automatické spuštění úvodního dialogu při otevření Calcu). Vzorce a pomocné proměnné jsou zatím zapsané v listu CALCU, ale určitě vymyslím, jak je uchovávat v programu nebo zapisovat při spuštění (většina už tak běží), aby nebyl běh závislý na jejich náhodném vymazání nebo ztrátě listu.
Martin
PS : větvení programu najdete v nápovědě pod heslem Makra a programování > Přehled příkazů > běhové funkce výrazy a operátory > "Řízení běhu programu" - konkrétně podmínky : IF, Select Case a IIF. Tyto funkce programu lze suplovat načtením ze sešitu. Já jsem Vám poslal obecné příklady načítání do a z dialogu. Vy se pak ptáte znovu jak propojit dialog na buňku.
Proto jsem odkázal na obecnější základy. Je totiž zřejmé, že nevíte jak funguje tlačítko, nebo obecný ovládací prvek ačkoliv to původně vypadalo, že s makry pracovat umíte.
Omlouvám se - je to moje chyba - špatně jsem odhadl situaci.
]]> Tady začněte
Tady pokračujte
Obecně platí, že hledáme nejen v nápovědě, ale zejména v historii fóra : tato stránka karta HLEDAT.
Mimo toho je to téma obecnější zpracované do různých seriálů. Ten co doporučuji je od Dana Sedláčka. Ovšem existují i jiné práce s podobným zaměřením. Ty vyhledáte tak, že klepnete na této stránce na odkaz "články" (modrý pruh).
Na stránce kam skočíte máte odkazy například na návody a seriály. Nejlepší je ale v modrém pruhu zadat do vyhledávání heslo které Vás zajímá.
Zatím díky, Martin
]]> V principu se ale tlačítka navzájem neblokují až na tlačítko volby, nebo zaškrtávací pole. Dají se sice přepínat zapnuto vypnuto a pak se aktivují podle pořadí (pořadí aktivace) ale to není totéž. CheckBoxy se mohou blokovat podle logických operátorů - AND, OR, XOR ap. ale nejčastěji to bude zřejmě systém přepínačů - 1 vybraný blokuje všechny ostatní. jsou to ale typy tlačítek kterým se v elektrotechnice říká vypínač (zapnuto/vypnuto). Zachovávají polohu. Ostatní tlačítka - klasické buttony jsou skutečně impulzní (sepnou a postaví so do výchozí polohy) - ale dají se navolit na přepínání a vícenásobný krok.
To se u checkboxů dělalo automaticky blokem tlačítek, ale zlobilo to. Takže já se na to nespoléhám a blokuji makrem. To se dá dělat na několika úrovních. Já například často používám blokování pomocí Public proměnných.
V tom dialogu nejsou přejmenovaná tlačítka. Takže si je přejmenujte na Button1 a Button2 a otestujte se je v režimu 'typ tlačítka výchozí'. Zadejte na příklad k události 'schválit akci' to makro výpisu. Když budu mít čas pošlu Vám upravený dialog. Píšete ale o 5-ti párech tlačítek takže nevím co máte zrovna za představu. Bude to asi jiná varianta dialogu.