[SOLVED] Okno drukowania po zatwierdzeniu okna dialogowego

Dyskusje dotyczące tworzenia makropoleceń, pisania skryptów oraz programowania przy użyciu UNO
Awatar użytkownika
krolik
Posty: 10
Rejestracja: śr lis 20, 2019 6:21 pm

[SOLVED] Okno drukowania po zatwierdzeniu okna dialogowego

Post autor: krolik »

Witam,
wymyśliłem sobie taki projekt: po otwarciu dokumentu tekstowego otwiera się okno dialogowe z miejscem do wpisania danych po zatwierdzeniu wprowadzonych danych pojawiają się one w dokumencie tekstowym. Po przesłaniu tych danych otwiera się systemowe okno dialogowe wyboru drukarki. Mimo, że skrypt odpowiadający za pojawiające się okno druku jest nagrane przez narzędzie umieszczone w OO Writer. Jedyną wadą jest to że okno z formularzem pojawia się dwa razy. Chciałbym również zmodyfikować je w ten sposób aby w oknie druku po kliknięciu drukuj lub anuluj ponownie pojawiało się moje okno z formularzem. W załączniku załączam okrojoną wersję
Załączniki
pole_tekstowe.odt
(14.77 KiB) Pobrany 209 razy
Ostatnio zmieniony śr kwie 01, 2020 11:37 am przez krolik, łącznie zmieniany 1 raz.
OpenOffice 4.1.7, Windows 10
belstar
Posty: 654
Rejestracja: czw mar 17, 2011 9:08 am

Re: Okno drukowania po zatwierdzeniu okna dialogowego

Post autor: belstar »

Dwa razy wywołujesz metodę Execute, raz przed Select Case a później w niej, usuń tą pierwszą i dialog pojawi się raz.
Nie wiem co planujesz, ale Select Case słuzy do wyboru kiedy mamy wiele opcji tu wystarczy If Then ewentualnie If Then Else. Poza tym wstaw przycisk Anuluj, wspominasz o nim a go nie ma. Tak, tak, wiem to tylko test.
krolik pisze:ponownie pojawiało się moje okno z formularzem
Ano, odpowiedz masz w pierwszej części, dlaczego dialog pojawia się dwa razy
LibreOffice 5.1.2.2 Ubuntu 16 LTS
belstar
Posty: 654
Rejestracja: czw mar 17, 2011 9:08 am

Re: Okno drukowania po zatwierdzeniu okna dialogowego

Post autor: belstar »

Chociaż wydaje mi się że wywołanie dwa razy metody Execute nie jest właściwe,bo powinny być utworzone dwie instancje tego samego obiektu, ale po co. Przejdź na nowy LO, będziesz tam miał inspektora obiektów MRI i w nim sprawdź jakie metody ma obiekt Dialog, powinna tam być metoda Visible, ale nie jestem pewien. Teoretycznie wywołując Execute raz obiekt już istnieje tylko jest niewidoczny, czyli chodzi o pokazanie go.
LibreOffice 5.1.2.2 Ubuntu 16 LTS
Awatar użytkownika
krolik
Posty: 10
Rejestracja: śr lis 20, 2019 6:21 pm

Re: Okno drukowania po zatwierdzeniu okna dialogowego

Post autor: krolik »

Właśnie po usunięciu jednego Execute okno dialogowe pojawia się raz. Ale po wpisaniu danych do okna dialogowego za pierwszym razem (po uruchomieniu dok. tekstowego) nie wszystkie wartości z pól formularza są przesyłane do kształtów (zlokalizowanych w dok. tekstowym) odbierających dane. Próbowałem umieścić polecenie wydruku w różnych miejscach np. po umieszczeniu na końcu skryptu przed Dialog.Dispose() - żadne wartości nie są przesyłane, z kolei wklejenie kodu w innym miejscu powoduje, że wartość termin nie jest przesyłana, czasem też po zmianie miejsca kodu odpowiedzialnego za drukowanie wartości pojawiają się dopiero po zamknięciu okna drukowania. Czy można w jakiś sposób to naprawić?
Załączniki
forum.odt
(17.43 KiB) Pobrany 200 razy
OpenOffice 4.1.7, Windows 10
Awatar użytkownika
Rafkus
Posty: 513
Rejestracja: czw kwie 12, 2018 10:26 pm

Re: Okno drukowania po zatwierdzeniu okna dialogowego

Post autor: Rafkus »

Po pierwsze: W złym miejscu następuje wywołanie dialogu. W twoim makrze testowym najpierw pobierasz dane z okna dialogowego a dopiero potem inicjujesz jego wywołanie i zaraz potem drukujesz. Powinno być odwrotnie - Execute daj zaraz po załadowaniu biblioteki dialogu.
Po drugie zgadzam się z @Jermorem @belstar-em:
Dwa razy wywołujesz metodę Execute, raz przed Select Case a później w niej,
, z tym że ja zaproponuję abyś wynik z Execute przypisał do zmiennej.

Twój poprawiony kod :

Kod: Zaznacz cały

Sub ramkatekst

 Dim Dialog	As Object	'okno dialogowe'
 Dim nazwa	As Object	'tekst pobrany z okna dialogowego'

 DialogLibraries.LoadLibrary("Standard")
 Dialog = CreateUnoDialog(DialogLibraries.Standard.form)

 wynik_dialogu = Dialog.Execute()

 nazwa = Dialog.GetControl("p_nazwa")	'przepisanie tekstu z pola z okna dialogowego do zmiennej'

 oDoc = ThisComponent
 oDrawP = oDoc.getDrawPage()
 IleObj = oDrawP.getCount()
 oObj1 = oDrawP.getByIndex(1)		'tu operujesz indeksami'
 nazwatekst = oObj1.Name		'nazwa ramki'
 sString = nazwa.Text
 oObj1.String() = sString
	
 'Formatowanie tekstu'
 oObj1.setPropertyValue("CharHeight", 60)	'wielkosc czcionki' 
 oObj1.setPropertyValue("CharWeight", BOLD)	'porubinie czcionki'
 oObj1.setPropertyValue("CharFontName", "Dosis")'nazwa czcionki'
   
  Select Case wynik_dialogu		' zamiast  Dialog.Execute() odwołaj się do zmiennej
 	Case 1
		'Po naciśnięciu OK nastepuje wydruk strony z podanymi danymi'
	 	dim document   as object
	 	dim dispatcher as object
	 	rem ----------------------------------------------------------------------
		rem get access to the document
		document   = ThisComponent.CurrentController.Frame
		dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
		
		dispatcher.executeDispatch(document, ".uno:Print", "", 0, Array())
 End Select
 
   Dialog.dispose()
 End Sub

PS. Obejrzałem twój drugi dokument, tam znowu masz troszkę pomieszaną kolejność.
W nim co prawda dialog jest wywołany w dobrym miejscu ale zaraz po nim każesz drukować dokument a następnie dopiero przechodzisz do pobierania i edytowania danych z dialogu.
Obrazowo - robisz herbatę: czyli bierzesz kubek, wlewasz wrzątek, wypijasz i wrzucasz herbatę ;)
Poprawniej powinno być tak:

Kod: Zaznacz cały

'załdowanie obsługi dialogu
 DialogLibraries.LoadLibrary("Standard")
 Dialog = CreateUnoDialog(DialogLibraries.Standard.form) 
 
If Dialog.Execute() then     'uruchomienie dialogu,

  ' przetwarzanie danych
   'drukowanie
end if 
Dialog.dispose()

Ups, Faktycznie odwoływałem się do wcześniejszej wypowiedzi @belstar -a. Przepraszam za błąd, poprawiłem wypowiedź...
Ostatnio zmieniony sob gru 21, 2019 5:06 pm przez Rafkus, łącznie zmieniany 1 raz.
LibreOffice 7.4.6 (preferowany) oraz OpenOffice 4.1.6. Widows 10
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
Awatar użytkownika
Jermor
Posty: 2239
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Okno drukowania po zatwierdzeniu okna dialogowego

Post autor: Jermor »

@Rafkus, zgadzasz się z @belstar. Ja nie brałem udziału w tym wątku.
AOO 4.1.15, LO 7.5.9 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
ODPOWIEDZ