Strona 1 z 1

[SOLVED] Okno drukowania po zatwierdzeniu okna dialogowego

: wt gru 17, 2019 7:28 pm
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ę

Re: Okno drukowania po zatwierdzeniu okna dialogowego

: wt gru 17, 2019 11:32 pm
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

Re: Okno drukowania po zatwierdzeniu okna dialogowego

: wt gru 17, 2019 11:51 pm
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.

Re: Okno drukowania po zatwierdzeniu okna dialogowego

: pt gru 20, 2019 12:06 pm
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ć?

Re: Okno drukowania po zatwierdzeniu okna dialogowego

: sob gru 21, 2019 1:10 am
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ź...

Re: Okno drukowania po zatwierdzeniu okna dialogowego

: sob gru 21, 2019 10:54 am
autor: Jermor
@Rafkus, zgadzasz się z @belstar. Ja nie brałem udziału w tym wątku.