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

#1 29. 12. 2021 14:58:15

Bezda86
Člen
Registrace: 18. 12. 2021
Příspěvků: 5

Vložení dat do seznamu v dialogu

Prosím o radu zda jde a jak vložit data z buněk do rozevíracího seznamu v dialogovém okně
něco jako toto:

Sub Main
dim vstupni_pole, dlg as object
doc = thisComponent
list = doc.sheets(0)

DialogLibraries.LoadLibrary("Standard")
dlg=createUnoDialog(DialogLibraries.Standard.Dialog1)
vstupni_pole = list.getCellRangeByName("A2:A4")

dlg.getControl("d_seznam")=vstupni_pole

if dlg.execute() = 1 then

dlg.dispose()
endif
End Sub

Ve formulářovém ovládacím prvku je k tomu záložka data, ta ovšem v prvku pro dialog není.

Děkuji za každou radu

Offline

#2 30. 12. 2021 08:05:33

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

Re: Vložení dat do seznamu v dialogu

Listboxy v dialogu nabíjené makrem


Dejte pozor - existuje více podobných postupů a i prvků - například ComboBox. Existují i zcela genereované dialogy (makro vygeneruje vše od dialogového okna přes různé prvky až k jejich vybavení hodnotami). Také dejte pozor na to, že formulářové prvky jsou nejen pro dialogy, ale dají se umístit přímo do sešitu a ovládají se trošku jinak. Každý typ obvládacího oprvku má jiný postup. Jde zejména o různá datumová a časová pole, pole formátovaná, progressbary, zaškrtávací tlačítka, dialogy pro obrázky, nebo více záložek, stromy, nebo typy PopUp dialogů a celá sada "FillePickerů".


Doporučuji spíš samostatné hledání příkladů na cizích fórech a vytvoření si vlastní databáze scriptů. Jak si jednou začnete s makry - budete chtít stále více různých kousků kódů. Pak se musí stát, že už nebude stačit dotaz do tohoto fóra. Podívejte se na seriály o programování. Doporučuji začít seriálem "Malá makra" od Daniela Sedláčka. Ale už jsou dobré i příklady v nápovědach pro Calc a Writer - máme přeloženy téměř aktuální návody. Jsou to obsáhlé texty, ale věnujte se jim - vřele doporučuji.


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

Offline

#3 30. 12. 2021 12:31:53

kamlan
Člen
Registrace: 15. 9. 2016
Příspěvků: 354

Re: Vložení dat do seznamu v dialogu

Nepřiložil jste ukázkový soubor s vaším dialogem, takže jen "zpaměti" bez možnosti odzkoušení :-)

vstupni_pole=list.getCellRangeByName("A2:A4").getDataArray() 'matice s řetězci z dané oblasti

dim p(ubound(vstupni_pole)), i&
for i=lbound(vstupni_pole) to ubound(vstupni_pole) 'z matice jen jednorozměrné pole
	p(i)=vstupni_pole(i)(0)
next i

dim o as object
o=dlg.getControl("d_seznam") 'listbox
o.Model.StringItemList=p 'data z pole do listboxu

Z mé zkušenosti je použití StringItemList pro naplnění Listboxu mnohem rychlejší oproti metodám addItem/removeItem -> to kdybyste tam dával třeba desítky či stovky položek, nebo třeba potřeboval dynamicky měnit položky druhého listboxu v závislosti na tom co se vybere v prvním listboxu (pro každou položku z listboxu1 by byly jiné položky v listboxu2).

Offline

#4 30. 12. 2021 16:19:55

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

Re: Vložení dat do seznamu v dialogu

pro kamlan:


kamlan napsal(a)

Nepřiložil jste ukázkový soubor s vaším dialogem ....

vstupni_pole=list.getCellRangeByName("A2:A4").getDataArray() 'matice s řetězci z dané oblasti

Nevím o čem píšete - soubor s obsahem je přiložen obsahuje 2 listboxy z dialogu, který je součístí ukázky. Ale obsahuje jen jeden nabíjený z buněk. Jde to udělat relativně různým kódem - což také uvádím, ale meritum Vašeho příspěvku mi uniká.


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

Offline

#5 30. 12. 2021 16:23:14

kamlan
Člen
Registrace: 15. 9. 2016
Příspěvků: 354

Re: Vložení dat do seznamu v dialogu

@neutr: to byla čistá reakce na autora dotazu, ne na vás :-)

Offline

#6 3. 1. 2022 19:52:13

Bezda86
Člen
Registrace: 18. 12. 2021
Příspěvků: 5

Re: Vložení dat do seznamu v dialogu

Ukázkový soubor

Pánové děkuji vám za rady, použil jsem a upravil verzi od kamlana, hlavně protože pracuji s daty v objemu stovek.
Sice vše funguje, ale po otevření roletky se seznam zobrazuje na konci pole.
Je nějaký jednoduchý fígl, jak toto zobrazení přesunout na začátek dat?

Předem moc děkuji za vaší bezvadnou práci a ochotu pomoci nám začátečníkům.

Offline

#7 3. 1. 2022 22:18:42

kamlan
Člen
Registrace: 15. 9. 2016
Příspěvků: 354

Re: Vložení dat do seznamu v dialogu

U těch ComboBoxů se aktuální položka nastavuje vlastností .Text. Když daný Text v tom seznamu je, tak ho to na něj nastaví.

o.Model.StringItemList=p 'data z pole do listboxu
o.Model.Text=p(0) 'první položka bude aktivní

.Text lze nastavit třeba i na nějakou neznámou hodnotu a ta pak bude dána na začátek a brána též jako výchozí. A zmizí když si něco ze seznamu vyberete.

Pro ukázku jiná syntaxe s neznámou položkou.

with o.Model
	.StringItemList=p 'data z pole do listboxu
	.Text="-------" 'čárky nejsou v seznamu takže budou dány jako výchozí první položka seznamu
end with

Jinak třeba pro příště :-). Vzhledem k tomu že jde již o komplikovanější Sešit a že tam nemáte čistý LibreBasic ale je to z VBA, tak lepší by bylo napsat ještě postup jak se k chybě člověk dostane, u vás např.: Dejte list "Výdej materiálu", pak klik na tlačítko "Výdej dialog" a pak rozbalte "Název materiálu". Tam je problém.

Případně ještě dodat: je to dialog Standard/ Vydej, a obsluhuje to makro VBAProject/ Moduly/ Module3/ Prvky.

Sice jsem se k tomu po chvíli proklikal, ale být ten soubor o něco složitější, tak už bych se na to vykašlal a musel vám napsat dotaz jak se k tomu dostat. Ale máte to pěkně barevný, to se mi líbilo :-).

Offline

#8 4. 1. 2022 11:47:44

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

Re: Vložení dat do seznamu v dialogu

Bezda86 napsal(a)

Prosím o radu zda jde a jak vložit data z buněk do rozevíracího seznamu v dialogovém okně
něco jako toto: .....

Ve formulářovém ovládacím prvku je k tomu záložka data, ta ovšem v prvku pro dialog není.

     Ukázka je nejlepší prostředek jak dostat správnou odpověď. Ale je nutné se také správně zeptat. Tady vidím hned několik problémů.


     Z ukázky chápu, že je to příprava pro vytvoření ovládání pomocí dialogových prvků řízených makry. V ukázce jsou dva dialogy (dialogová okna Basic, respektive VBA s názvy Dialog1 a Výdej). Více či méně jsou oba nefunkční. Vše co je v ukázce vidět se týká FORMULÁŘOVÝCH PRVKŮ a nikoliv OVLÁDACÍCH PRVKŮ DIALOGU. Rozdíl mezi těmito je zřejmý. Dialogové ovládací prvky jsou součástí dialogového okna v Basic. Formulářové prvky jsou součástí "DRAWPAGE" (tedy součástí jednotlivých listů). Podle dotazu Vám je rozdíl zřejmý, i když asi ne tak úplně.
     Makro, které jste požadoval a zřejmě aplikoval - nabíjí obsah "SEZNAMU" (ListBox) na listu VÝDEJ a PŘÍJEM materiálu. Na LISTU SEZNAM je v buňce E3 textové pole. Ve skutečnosti je ale seznam vybaven automatickým filtrem. Problematika „databáze materiálu" je snadno řešitelná kontingenční tabulkou s tím, že výstupy jsou vloženy do jednotlivých listů.


     Celkem chápu, že hledáte možnost snadného intuitivního ovládání. V tomto stavu je to vývojová verze. Vím přesně oč se jedná. Kdysi jsem pracoval jako rozpočtář, elektromechanik a energetik celkem velkých provozů. Proto řeknu, že je celkem velice důležité k jakým účelům má Vaše práce sloužit. Podle názvů (skříň, elektrodílna apod.) soudím, že se jedná o evidenci pro účely údržby elektro. Zde už vidím, že nerozlišujete typ skladu. V elektrodílně bývá často sklad použitých, nebo repasovaných součástek, který je „mimo zákon", tedy formální evidenci. Je to první místo kam jde elektrikář když má podezření, nebo jistotu, že odešla nějaká součástka (PLC, softstartér, stykač apod.). Součástku vymění. Co se děje dál je různé. Například se posílá info (co se pokazilo a jak proběhla oprava) + požadavek na objednání nového kusu, popřípadě součástka se pošle k opravě, kalibraci apod.
     Ale seznam slouží samozřejmě k inventurám a ke zjištění co se má objednat podle stavu položky. Tady se dostáváme k obsluze ze strany nadřízených, kde už je vyžadována „štábní kultura". Nákupčí vyžaduje přesnou specifikaci, ekonom finance zamrzlé v rezervách. Vedení výroby se zabývá prostoji – elektrikář je často hromosvod a tak ve vlastním zájmu musí sledovat co je příčinami poklesu výroby.
     Odtud zřejmě plyne problém s EXCELEM který má nainstalovaný pouze několik strojů ve firmě a zbytek je na LibreOffice (nebo ApacheOpenOffice).


     Pokud by se jednalo pouze o potřeby elektrodílny tak by postačilo ovládání jen pomocí vzorců v kombinaci s DATA > PLATNOST (což je také typ seznamu a je mnohem lepší, nežli ovládací prvky klasického typu pro formuláře, nebo dialogová okna). Klasické formulářové prvky mají výhodu snad jen v tom, že se může přiřadit makro k takovému ovládacímu prvku když se nad ním klikne, nebo třeba jen přejede přes něj a podobně. Vy ale tuto možnost nevyužíváte a tím se výhoda vytrácí.
     Používat klasická dialogová okna je „vyšší dívčí" a používá se zejména na efekt – vypadá to profesionálně. Ale musí se to umět. Ovládací prvky v dialogu by měly mít automatickou aktualizaci obsahu při každé změně (ten téměř funkční dialog VÝDEJ „výdej materiálu") obsahuje statický seznam položek, který se musí vložit manuálně při každé změně. Domnívám se, že Vám šlo právě o tuto funkčnost. Aby to bylo ale opravdu profesionálně provedené je nutné mnoho věcí přeprogramovat a doprogramovat. Tohle by naše fórum asi umělo dobře – ale nikoliv pro Excel. V takovém případě v tom zůstanete sám.


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

Offline

#9 23. 1. 2022 12:57:03

Bezda86
Člen
Registrace: 18. 12. 2021
Příspěvků: 5

Re: Vložení dat do seznamu v dialogu

Dobrý den,
po dlouhé době jsem zpět s tím, že jsem celý soubor, který byl slepeninou excelu a calcu předělal od začátku jako calc soubor s novými požadavky a tím i novými problémy.


Pro upřesnění funkce souboru. U nás ve firmě zabývající se automatizací (vývoj a montáž automatizovaných a robotických výrobních linek) mají v kanceláři Helios a MS Office, jenže všude se šetří a licenci nám na dílnu na Helios a Office nikdo nekoupí. Obchodní oddělení na nás má požadavek, aby jsme jim dávali vědět jaký materiál v jakém množství spotřebujeme za daný měsíc na jaký projekt, samozřejmě bez přípravy jakéhokoliv prostředku. Proto jsem se rozhodl vytvořit si tuto evidenci, která nám bude sloužit jako ukazatel, kolik čeho máme (info pro nás) a na konci měsíce pošleme soubor na obchodní oddělení, kde budou mít v listu výdej materiálu evidenci toho co je zajímá. Typy umístění jsou jen ukázka toho jaký je ve všem chaos, ale nikdo nechce nic měnit, protože by to pro ně znamenalo více práce byť jen dočasně, než by se dalo vše do pořádku. V neposlední řadě vedení nechce vynakládat pro ně zbytečné náklady na zlepšení přehlednosti nákupem více skříní nebo regálů s binovými pozicemi, když to podle nich zatím takhle funguje.
Stručně a jednoduše: když se zaměstnavatel nepostará o to co chce po zaměstnancích, musí se zaměstnanec postarat sám aspoň v omezené míře.


Doteď jsme používali dva soubory jeden pro manuální evidenci množství a druhý pro manuální zápis toho výdeje. Pro mnohé to bylo složité a často na některé věci zapomněly a tak toho moc nesedělo.


V současnosti řeším 3 problémy, které jsou podrobně popsány v souboru na listu "Nefunkční věci"
Jen ve stručnosti:
1) Jedná se o řazení dat podle určitého sloupce, zkoušel jsem několik verzí zde z fóra a nevím proč žádný nefunguje, co dělám špatně.
2) Zápis datumu přes kalendář a ručně se pokaždé zapíše jinak potřebuji sjednotit výstup
3) pro možnost editace výdeje a příjmu položek potřebuji naplnění seznamů jako při klasickém výdeji či příjmu jen navíc předvyplnit pole hodnotou z buněk řádku, který je editován.


Děkuji za jakoukoliv pomoc.


Ukázkový soubor

Editoval Bezda86 (23. 1. 2022 12:57:57)

Offline

#10 23. 1. 2022 19:16:09

kamlan
Člen
Registrace: 15. 9. 2016
Příspěvků: 354

Re: Vložení dat do seznamu v dialogu

Problém 2 a 3 vyřešíte tím, že ten sloupce A označíte a dáte pravou myší Formát buněk a z karty Číslo vyberete Datum + 31.12.1999. Tím budou mít buňky formát datumu pro ruční zadání.

No a makrem musíte buňce nastavit vlastnost .NumberFormat též na datum. Nejdřív možno zapsat .String a pak nastavit .NumberFormat; nebo nastavit .NumberFormat a pak zapsat .Value=DateValue().

Např. pro makro Vydej/DialogV_Sdata mi fungovaly pro zapsání datumu oba příklady.

aControl = oDlg3.getControl("d_VDatum")
dim oBunka as object, s$
oBunka=list.getCellByPosition(0,Target)
s=aControl.getText()
with oBunka
	.String=s
	.NumberFormat=37 'DD.MM.YYYY
end with
list2.getCellByPosition(1,Target2).String=s
aControl = oDlg3.getControl("d_VDatum")
dim oBunka as object, s$
oBunka=list.getCellByPosition(0,Target)
s=aControl.getText()
with oBunka
	.NumberFormat=37 'DD.MM.YYYY
	.Value=DateValue(s)
end with
list2.getCellByPosition(1,Target2).String=s

K 1 a 4 se dnes již nedostanu, už mám dnes z programování hlavu zatemněnou :-(. Uvidím jak mi co půjde v týdnu.

Offline

Zápatí