Okno drukowania po zatwierdzeniu okna dialogowego

Dyskusje dotyczące tworzenia makropoleceń, pisania skryptów oraz programowania przy użyciu UNO

Okno drukowania po zatwierdzeniu okna dialogowego

Postprzez krolik » Wt gru 17, 2019 7:28 pm

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) Pobrane 6 razy
OpenOffice 4.1.7, Windows 10
Avatar użytkownika
krolik
 
Posty: 9
Dołączył(a): Śr lis 20, 2019 6:21 pm

Re: Okno drukowania po zatwierdzeniu okna dialogowego

Postprzez belstar » Wt gru 17, 2019 11:32 pm

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 napisał(a):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: 653
Dołączył(a): Cz mar 17, 2011 9:08 am

Re: Okno drukowania po zatwierdzeniu okna dialogowego

Postprzez belstar » Wt gru 17, 2019 11:51 pm

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
belstar
 
Posty: 653
Dołączył(a): Cz mar 17, 2011 9:08 am

Re: Okno drukowania po zatwierdzeniu okna dialogowego

Postprzez krolik » Pt gru 20, 2019 12:06 pm

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) Pobrane 7 razy
OpenOffice 4.1.7, Windows 10
Avatar użytkownika
krolik
 
Posty: 9
Dołączył(a): Śr lis 20, 2019 6:21 pm

Re: Okno drukowania po zatwierdzeniu okna dialogowego

Postprzez Rafkus » So gru 21, 2019 1:10 am

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 @ 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   Rozszerz widokZwiń widok
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'
   
   'Dialog.Execute()    - to usunąć, zostało wywołane wyżej
  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   Rozszerz widokZwiń widok
'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 edytowano So gru 21, 2019 5:06 pm przez Rafkus, łącznie edytowano 1 raz
OpenOffice 4.1.5. Widows 10
Libre 4.2.5.2 Windows XP
Rafkus
 
Posty: 58
Dołączył(a): Cz kwi 12, 2018 10:26 pm

Re: Okno drukowania po zatwierdzeniu okna dialogowego

Postprzez Jermor » So gru 21, 2019 10:54 am

@Rafkus, zgadzasz się z @belstar. Ja nie brałem udziału w tym wątku.
AOO 4.1.7, LO 6.2.8 (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 ktoś podał rozwiązanie.
Avatar użytkownika
Jermor
 
Posty: 910
Dołączył(a): So paź 12, 2013 11:09 am


Powrót do Makra i programowanie

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość