Okna dialogowe - oprogramowanie kontrolek

Dyskusje dotyczące tworzenia makropoleceń, pisania skryptów oraz programowania przy użyciu UNO
Awatar użytkownika
Samson
Posty: 38
Rejestracja: wt cze 14, 2011 5:31 pm
Lokalizacja: Poprad

Okna dialogowe - oprogramowanie kontrolek

Post autor: Samson »

Witam
Walczę z oknami dialogowymi i nie umiem wyjść z pewnej sytuacji (nie jestem inforamtykiem tylko budowlancem) - pewnie to jest trywialne

W załączniku jest arkusz z przykładowym problemem.

Otóż:
-w arkuszu znajduje się przycisk uruchamiający okno dialogowe "OknoDialogowe1" (makro "PokazOknoDialogowe")

Kod: Zaznacz cały

REM Makro wywołujące okno dialogowe
Sub PokazOknoDialogowe
Dim libStandard
Dim libDialog
libStandard = DialogLibraries.getByName("Standard")
REM W cudzysłowiu wpisać nazwe okna dialogowego z zakładki
libDialog = libStandard.getByName("OknoDialogowe1")
REM Dwie poniższe zmienne sa nazwa okna dialogowego
OknoDialogowe1 = CreateUnoDialog(libDialog)
OknoDialogowe1.execute
End Sub
to makro działa chyba poprawnie.

- po wpisaniu parametrów i wybraniu opcji w tym oknie dialogowym klawisz "OK" powinien wykonać następujące czynności (za pomocą makra "KopiujZOkna"):
* skopiować dane z wyboru do komórek od C4 do C10, z tym że z pola wyboru i przycisków opcji powinien kopiować wartości 0 ,1 albo FAŁSZ, PRAWDA, z okna listy wybrany tekst, z pola tekstowego tekst a z pola sformatowanego liczbe
* następnie sprawdzic wartość komórki C12, jeżeli wynosi ona 1 powinien wyswietlic w oknie MsBox monit z trescia komorki C13, jezeli wartosc komorki C12 jest inna niz 1 zamknac okno dialogowe.
* Czy da się wyświetlić Msbox z trescia w kilku linijkach ale tak zeby np.w górnej linijce wyświetlił tekst "znaleziono błędy:" a w niższej tekst z komórki C13, i np w następnej tekst z komórki C14???
Ale cos mi tu nie idzie, pokazuje mi informacje ze nie zdefiniowalem zmiennej

Kod: Zaznacz cały

Sub KopiujZOkna

Dim OknoDialogowe1 as object
Dim PoleWyboru as object
Dim PoleListy as object
Dim PrzyciskOpcji1 as object
Dim PrzyciskOpcji2 as object
Dim PrzyciskOpcji3 as object
Dim PoleTekstowe as object
Dim PoleSformatowane as object
Dim PoleKontrolne as object REM pole kontrolne stwierdzajace poprawnosc danych w oknie
Dim OpisBledu as object REM pole opisu błędu

REM Kopiowanie danych z POLA WYBORU (CHECK BOX)
PoleWyboru = OknoDialogowe1.getControl ("CheckBox1").Bolean
PoleWyboru = thisComponent.Sheets(0).getCellRangeByName("C4")

REM Kopiowanie danych z POLA LISTY (LIST BOX)
PoleListy = thisComponent.Sheets(0).getCellRangeByName("C5")
PoleListy.Value = OknoDialogowe1.getControl ("ListBox1").String

REM Kopiowanie danych z PRZYCISKU OPCJI 1 (OPTION BUTTON 1)
PrzyciskOpcji1 = thisComponent.Sheets(0).getCellRangeByName("C6")
PrzyciskOpcji1.Value = OknoDialogowe1.getControl ("OptionButton1").Value
REM Kopiowanie danych z PRZYCISKU OPCJI 2 (OPTION BUTTON 2)
PrzyciskOpcji2 = thisComponent.Sheets(0).getCellRangeByName("C7")
PrzyciskOpcji2.Value = OknoDialogowe1.getControl ("OptionButton2").Value

REM Kopiowanie danych z PRZYCISKU OPCJI 3 (OPTION BUTTON 3)
PrzyciskOpcji3 = thisComponent.Sheets(0).getCellRangeByName("C8")
PrzyciskOpcji3.Value = OknoDialogowe1.getControl ("OptionButton3").Value

REM Kopiowanie danych z POLA TEKSTOWEGO (TEXT FIELD)
PoleTekstowe = OknoDialogowe1.getControl ("TextField1").Text
PoleTekstowe = thisComponent.Sheets(0).getCellRangeByName("C9")


REM Kopiowanie danych z POLA SFORMATOWANEGO (FORMATTED FIELD)
PoleSformatowane.Value = OknoDialogowe1.getControl("FormattedField1")
PoleSformatowane = thisComponent.Sheets(0).getCellRangeByName("C10")


REM KONTROLA PRAWIDŁOWOŚCI DANYCH W OKNIE
thisComponent.Sheets(0).getCellRangeByName("C12").Value = PoleKontrolne.Value
thisComponent.Sheets(0).getCellRangeByName("C13").String = OpisBledu.String

IF PoleKontrolne = 1 THEN
msgbox("ZNALEZIONO BŁEDNE DANE:"+OpisBledu,0,"BŁĘDNE DANE")
ELSE
OknoDialogowe1.endExecute
OknoDialogowe1.dispose() REM uwolnienie okna dialogowego
END IF

End Sub
Czy ktos moze mi pomoc poprawic kod tak aby to okno dzialalo jak nalezy?
Z gory dziekuje za pomoc, w zalaczniku przesylam rowniez plik Calca.
Załączniki
Okno dialogowe.ods
(15.39 KiB) Pobrany 333 razy
OpenOffice 4.1 na Windows 7 Pro
Libre Office 4.2 na Windows 7 Pro
Awatar użytkownika
Samson
Posty: 38
Rejestracja: wt cze 14, 2011 5:31 pm
Lokalizacja: Poprad

Re: Okna dialogowe - oprogramowanie kontrolek

Post autor: Samson »

Po uruchomieniu arkusza, przy próbie dopalenia okna dialogowego wyskakuje komunikat:
"Błąd pracy BASIC`a.
Wystąpił wyjątek
Type: com.sun.star,lang.WrappedTargetException
Message:
TargetException:
Type: com.sun.star.script.LibraryNotLoadedException
Message:."
otwiera edytor Basic i pokazuje następującą linijkę w kodzie makra:
libDialog = libStandard.getByName("OknoDialogowe1")

Gdy edytor jest otwarty juz potem normalnie wlacza okno, w czym moze tkwic problem???
OpenOffice 4.1 na Windows 7 Pro
Libre Office 4.2 na Windows 7 Pro
Jan_J
Posty: 4653
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Okna dialogowe - oprogramowanie kontrolek

Post autor: Jan_J »

Twoja biblioteka nie jest wczytana do zasobów.

Kod: Zaznacz cały

REM Makro wywołujące okno dialogowe
Sub PokazOknoDzialogowe
  Dim libStandard
  Dim libDialog
  DialogLibraries.loadLibrary("Standard")  ' <--- dodaj
  libStandard = DialogLibraries.getByName("Standard")
  REM W cudzysłowiu wpisać nazwe okna dialogowego z zakładki
  libDialog = libStandard.getByName("OknoDialogowe1")
  REM Dwie poniższe zmienne sa nazwa okna dialogowego
  OknoDialogowe1 = CreateUnoDialog(libDialog)
  OknoDialogowe1.execute
End Sub
Natomiast dalej, w funkcji KopiujZOkna, też masz błędy. Przede wszystkim dlatego, że używasz nowego (niezainicjowanego) obiektu o nazwie OknoDialogowe1, zamiast odwoływać się do użytego okna.
Najprościej zadeklarować Global OknoDialogowe1 przed funkcją PokazOknoDialogowe. Bardziej elegancko byłoby wydłubać uchwyt okna z parametru przesyłanego funkcji KopiujZOkna przez kontroler zdarzeń. Ale żeby to było możliwe, należałoby zadeklarować taki parametr w nagłówku Sub KopiujZOkna(event).

Dalej, nie do końca poprawnie nadajesz wartości kontrolkom. Zamiast

Kod: Zaznacz cały

PoleWyboru = OknoDialogowe1.getControl ("CheckBox1").Bolean
PoleWyboru = thisComponent.Sheets(0).getCellRangeByName("C4")
powinno być

Kod: Zaznacz cały

PoleWyboru = OknoDialogowe1.getControl ("CheckBox1")
PoleWyboru.State = thisComponent.Sheets(0).getCellRangeByName("C4").getValue
i to z kilku powodów: banalny to literówka o -> oo; następnie w checkboksie nie ma pola Boolean, tylko pole State; potem instrukcja "zmienna = kontrolka.State" nie zapamięta adresu pola, tylko jego wartość, więc nadawanie jej innego stanu mija się z celem. Wreszcie getCellRangeByName() nie zwraca wartości, tylko uchwyt zakresu. Trzeba jeszcze pobrać wartość za pomocą metody getValue. Przy okazji, skoro mówimy o jednej komórce, można też wykorzystać prostszą metodę odwołania getCellByPosition(kolumna,wiersz).
Dalej powalcz trochę sam.
JJ
LO (26.2) ∙ Python (3.13|3.10) ∙ Unicode 17 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Awatar użytkownika
Samson
Posty: 38
Rejestracja: wt cze 14, 2011 5:31 pm
Lokalizacja: Poprad

Re: Okna dialogowe - oprogramowanie kontrolek

Post autor: Samson »

Witam
Dziękuję za potrzebną poradę.
Z tym pierwszym makrem sobie poradzilem i juz otwiera okno dialogowe bez problemu,
Ale w dalszym ciagu mam problem z makrem, ktore ma skopiowac dane z okna dialogowego do komórek arkusza.
Nie umiem poprawnie napisać tego makra - w przykladowym arkuszu sa wszytskie typy kontrolek ktore chce uzyc, jezeli ktos bylby tak dobry i poprawil to zeby to dzialalo bylbym bardzo wdzieczny.
Nie wiem tez jak wywolac msbox z wieksza liczba lini tekstu - chodzi o to ze po zadaniu przez uzytkownika danych do okna dialogowego makro skopiuje dane do arkusza, arkusz sprawdzi poprawnosc danych - czy np nic nie brakuje, czy dane sa poprawne i zwroci do komorki C12 wartosc 1 albo 0. Jeżeli zwróci 1 powinno wyswietlic sie msbox z tekstem "Znaleziono błędne dane:" i w linijce niżej wyświetlało tekst z komórki C13.

Poniżej zamieszczam moje "wypociny":

Makro WywolajOkno:

Kod: Zaznacz cały

REM Makro wywołujące okno dialogowe

Global OknoDialogowe1

Sub PokazOknoDzialogowe
  Dim libStandard
  Dim libDialog
  DialogLibraries.loadLibrary("Standard")  ' <--- dodaj
  libStandard = DialogLibraries.getByName("Standard")
  REM W cudzysłowiu wpisać nazwe okna dialogowego z zakładki
  libDialog = libStandard.getByName("OknoDialogowe1")
  REM Dwie poniższe zmienne sa nazwa okna dialogowego
  OknoDialogowe1 = CreateUnoDialog(libDialog)
  OknoDialogowe1.execute
End Sub
Makro KopiujZOkna:

Kod: Zaznacz cały

Global OknoDialogowe1

Sub KopiujZOkna


Dim PoleWyboru as object
Dim PoleListy as object
Dim PrzyciskOpcji1 as object
Dim PrzyciskOpcji2 as object
Dim PrzyciskOpcji3 as object
Dim PoleTekstowe as object
Dim PoleSformatowane as object
Dim PoleKontrolne as object REM pole kontrolne stwierdzajace poprawnosc danych w oknie
Dim OpisBledu as object REM pole opisu błędu

REM Kopiowanie danych z POLA WYBORU (CHECK BOX)
PoleWyboru = OknoDialogowe1.getControl ("CheckBox1")
PoleWyboru.State = thisComponent.Sheets(0).getCellRangeByName("C4").getValue


REM Kopiowanie danych z POLA LISTY (LIST BOX)
PoleListy = OknoDialogowe1.getControl ("ListBox1")
PoleListy.Value = thisComponent.Sheets(0).getCellRangeByName("C5").getValue

REM Kopiowanie danych z PRZYCISKU OPCJI 1 (OPTION BUTTON 1)
PrzyciskOpcji1 = OknoDialogowe1.getControl ("OptionButton1")
PrzyciskOpcji1.State = thisComponent.Sheets(0).getCellRangeByName("C6").getValue

REM Kopiowanie danych z PRZYCISKU OPCJI 2 (OPTION BUTTON 2)
PrzyciskOpcji2 = OknoDialogowe1.getControl ("OptionButton2")
PrzyciskOpcji2.State = thisComponent.Sheets(0).getCellRangeByName("C7").getValue

REM Kopiowanie danych z PRZYCISKU OPCJI 3 (OPTION BUTTON 3)
PrzyciskOpcji3 = OknoDialogowe1.getControl ("OptionButton3")
PrzyciskOpcji3.State = thisComponent.Sheets(0).getCellRangeByName("C8").getValue


REM Kopiowanie danych z POLA TEKSTOWEGO (TEXT FIELD)
PoleTekstowe = OknoDialogowe1.getControl ("TextField1")
PoleTekstowe = thisComponent.Sheets(0).getCellRangeByName("C9").getstring

REM Kopiowanie danych z POLA SFORMATOWANEGO (FORMATTED FIELD)
PoleSformatowane = thisComponent.Sheets(0).getCellRangeByName("C10")
PoleSformatowane = OknoDialogowe1.getControl("FormattedField1").Value

REM KONTROLA PRAWIDŁOWOŚCI DANYCH W OKNIE
PoleKontrolne = thisComponent.Sheets(0).getCellRangeByName("C12").getValue
OpisBledu = thisComponent.Sheets(0).getCellRangeByName("C13").getString

IF PoleKontrolne = 1 THEN
msgbox("ZNALEZIONO BŁEDNE DANE:"+OpisBledu,0,"BŁĘDNE DANE")
ELSE
OknoDialogowe1.endExecute
OknoDialogowe1.dispose() REM uwolnienie okna dialogowego
END IF

End Sub
W załączniku przesyłam arkusz

Z gory dziekuje za pomoc
Załączniki
Okno dialogowe.ods
(15.41 KiB) Pobrany 344 razy
Obrazek.png
OpenOffice 4.1 na Windows 7 Pro
Libre Office 4.2 na Windows 7 Pro
belstar
Posty: 654
Rejestracja: czw mar 17, 2011 9:08 am

Re: Okna dialogowe - oprogramowanie kontrolek

Post autor: belstar »

Twoje "wypociny" (cytat) powinny nosić nazwę KopiujDoOkna, nie przeczytałeś dokładnie porad Jan_J.
Przepisanie tego co wybrałeś w dialogu powinno wyglądać tak:

Kod: Zaznacz cały

REM Kopiowanie danych z POLA WYBORU (CHECK BOX)
PoleWyboru = OknoDialogowe1.getControl ("CheckBox1")
thisComponent.Sheets(0).getCellRangeByName("C4").setValue(PoleWyboru.State)


REM Kopiowanie danych z POLA LISTY (LIST BOX)
PoleListy = OknoDialogowe1.getControl ("ListBox1")
thisComponent.Sheets(0).getCellRangeByName("C5").setString(PoleListy.SelectedItem)

REM Kopiowanie danych z PRZYCISKU OPCJI 1 (OPTION BUTTON 1)
PrzyciskOpcji1 = OknoDialogowe1.getControl ("OptionButton1")
thisComponent.Sheets(0).getCellRangeByName("C6").setValue(PrzyciskOpcji1.State)

REM Kopiowanie danych z PRZYCISKU OPCJI 2 (OPTION BUTTON 2)
PrzyciskOpcji2 = OknoDialogowe1.getControl ("OptionButton2")
thisComponent.Sheets(0).getCellRangeByName("C7").setValue(PrzyciskOpcji2.State)

REM Kopiowanie danych z PRZYCISKU OPCJI 3 (OPTION BUTTON 3)
PrzyciskOpcji3 = OknoDialogowe1.getControl ("OptionButton3")
thisComponent.Sheets(0).getCellRangeByName("C8").setValue(PrzyciskOpcji3.State)


REM Kopiowanie danych z POLA TEKSTOWEGO (TEXT FIELD)
PoleTekstowe = OknoDialogowe1.getControl ("TextField1")
thisComponent.Sheets(0).getCellRangeByName("C9").setstring(PoleTekstowe.Text)

REM Kopiowanie danych z POLA SFORMATOWANEGO (FORMATTED FIELD)
PoleSformatowane = OknoDialogowe1.getControl("FormattedField1")
thisComponent.Sheets(0).getCellRangeByName("C10").setString(PoleSformatowane.Text)
Poza tym poco najpierw wstawić dane do arkusza a potem przeprowadzać walidacje, powinno to być zrobione przed tą operacją:

Kod: Zaznacz cały

If JakiesPole.value = cos Then jakiesdzialanie 
Lub

Kod: Zaznacz cały

If JakiesPole.value = cos Then
jakiesdzialanie
else
jakiesinnedzialanie
else if
jeszczeinnedzialanie
end if
LibreOffice 5.1.2.2 Ubuntu 16 LTS
Awatar użytkownika
Samson
Posty: 38
Rejestracja: wt cze 14, 2011 5:31 pm
Lokalizacja: Poprad

Re: Okna dialogowe - oprogramowanie kontrolek

Post autor: Samson »

Witam
Dziękuję za odpowiedzi i poświęcony czas
Poniżej przedstawiam działajcy już kod do makr i załaczam plik z tymi makrami dla potomnych.

Makro wywolujace okno dialogowe:

Kod: Zaznacz cały

REM Makro wywołujące okno dialogowe

Global OknoDialogowe1

Sub PokazOknoDzialogowe
  Dim libStandard
  Dim libDialog
  DialogLibraries.loadLibrary("Standard")
  libStandard = DialogLibraries.getByName("Standard")
  REM W cudzysłowiu wpisać nazwe okna dialogowego z zakładki
  libDialog = libStandard.getByName("OknoDialogowe1")
  REM Dwie poniższe zmienne sa nazwa okna dialogowego
  OknoDialogowe1 = CreateUnoDialog(libDialog)
  OknoDialogowe1.execute
End Sub
Makro kopiujce dane z kontrolek makra do komórek arkusza:

Kod: Zaznacz cały

Global OknoDialogowe1

Sub KopiujZOkna


Dim PoleWyboru as object
Dim PoleListy as object
Dim PrzyciskOpcji1 as object
Dim PrzyciskOpcji2 as object
Dim PrzyciskOpcji3 as object
Dim PoleTekstowe as object
Dim PoleSformatowane as object
Dim PoleKontrolne as object REM pole kontrolne stwierdzajace poprawnosc danych w oknie
Dim OpisBledu1 as object REM pole opisu błędu
Dim OpisBledu2 as object
Dim OpisBledu3 as object
Dim OpisBledu4 as object

REM Kopiowanie danych z POLA WYBORU (CHECK BOX)
PoleWyboru = OknoDialogowe1.getControl ("CheckBox1")
thisComponent.Sheets(0).getCellRangeByName("C4").setValue(PoleWyboru.State)


REM Kopiowanie danych z POLA LISTY (LIST BOX)
PoleListy = OknoDialogowe1.getControl ("ListBox1")
thisComponent.Sheets(0).getCellRangeByName("C5").setString(PoleListy.SelectedItem)

REM Kopiowanie danych z PRZYCISKU OPCJI 1 (OPTION BUTTON 1)
PrzyciskOpcji1 = OknoDialogowe1.getControl ("OptionButton1")
thisComponent.Sheets(0).getCellRangeByName("C6").setValue(PrzyciskOpcji1.State)

REM Kopiowanie danych z PRZYCISKU OPCJI 2 (OPTION BUTTON 2)
PrzyciskOpcji2 = OknoDialogowe1.getControl ("OptionButton2")
thisComponent.Sheets(0).getCellRangeByName("C7").setValue(PrzyciskOpcji2.State)

REM Kopiowanie danych z PRZYCISKU OPCJI 3 (OPTION BUTTON 3)
PrzyciskOpcji3 = OknoDialogowe1.getControl ("OptionButton3")
thisComponent.Sheets(0).getCellRangeByName("C8").setValue(PrzyciskOpcji3.State)


REM Kopiowanie danych z POLA TEKSTOWEGO (TEXT FIELD)
PoleTekstowe = OknoDialogowe1.getControl ("TextField1")
thisComponent.Sheets(0).getCellRangeByName("C9").setstring(PoleTekstowe.Text)

REM Kopiowanie danych z POLA SFORMATOWANEGO (FORMATTED FIELD)
PoleSformatowane = OknoDialogowe1.getControl("FormattedField1")
thisComponent.Sheets(0).getCellRangeByName("C10").setString(PoleSformatowane.Text)

'========================================================================================
REM KONTROLA PRAWIDŁOWOŚCI DANYCH W OKNIE
PoleKontrolne = thisComponent.Sheets(0).getCellRangeByName("C12")
OpisBledu1 = thisComponent.Sheets(0).getCellRangeByName("C13")
OpisBledu2 = thisComponent.Sheets(0).getCellRangeByName("C14")
OpisBledu3 = thisComponent.Sheets(0).getCellRangeByName("C15")
OpisBledu4 = thisComponent.Sheets(0).getCellRangeByName("C16")
'========================================================================================
IF PoleKontrolne.value = 1 THEN
Beep
msgbox(	"ZNALEZIONO BŁEDNE DANE:" & chr(13) & OpisBledu1.string & chr(13) & OpisBledu2.string & chr(13) & OpisBledu3.string & chr(13) & OpisBledu4.string,0,"BŁĘDNE DANE")
ELSE
OknoDialogowe1.endExecute
END IF

End Sub
Załączniki
Okno dialogowe.ods
(16.77 KiB) Pobrany 441 razy
OpenOffice 4.1 na Windows 7 Pro
Libre Office 4.2 na Windows 7 Pro
ODPOWIEDZ