for i = 0 to 10
if m < n - 8 then
sText2 = druk3.getByName("od").currentvalue
druk3.getByName("od").text = m
Druk3.getByName("od").commit
sText4 = Druk3.getByName("do").currentvalue
druk3.getByName("do").text = m + 8
Druk3.getByName("do").commit
Rem... To save the current row
druk3.UpdateRow
oDan.reload
rem ----------------------------------------------------------------------
rem define variables
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")
rem ----------------------------------------------------------------------
dim args1(1) as new com.sun.star.beans.PropertyValue
args1(0).Name = "Copies"
args1(0).Value = 1
args1(1).Name = "Collate"
args1(1).Value = true
dispatcher.executeDispatch(document, ".uno:Print", "", 0, args1())
m = m + 8
end if
next i
Jak wstawie w inne miejsce: "dim args1(1) as new com.sun.star.beans.PropertyValue"
to w momencie "next i" uruchamia się pierwsze makro w module...
dim args1(1) as new com.sun.star.beans.PropertyValue
for i = 0 to 10
if m < n - 8 then
sText2 = druk3.getByName("od").currentvalue
druk3.getByName("od").text = m
Druk3.getByName("od").commit
sText4 = Druk3.getByName("do").currentvalue
druk3.getByName("do").text = m + 8
Druk3.getByName("do").commit
Rem... To save the current row
druk3.UpdateRow
oDan.reload
rem ----------------------------------------------------------------------
rem define variables
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")
rem ----------------------------------------------------------------------
args1(0).Name = "Copies"
args1(0).Value = 1
args1(1).Name = "Collate"
args1(1).Value = true
dispatcher.executeDispatch(document, ".uno:Print", "", 0, args1())
m = m + 8
end if
next i
proszę o pomoc
Ostatnio zmieniony czw cze 09, 2011 10:07 pm przez acrab8338, łącznie zmieniany 1 raz.
Uruchom w trybie krokowym (Narzędzia/Mka/Zarzadzaj/.../Edycja i F8), najprawdopodobniej wychodzisz poza zakres tablicy lub wskazujesz nieistniejący element jakiegoś obiektu.
JJ LO (26.2) ∙ Python (3.13|3.10) ∙ Unicode 17 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
sub druk
dim oDan as object
dim oMies as object
dim omiesid as object
dim frm,oTextBox1 as object
dim sText1, sText2, sText3, sText4 as string
dim i as long
oMies = thisComponent.drawPage.forms.getByName("MainForm").getByName("mies")
oDan = thisComponent.drawPage.forms.getByName("MainForm").getByName("Dan")
druk1 = thisComponent.drawPage.forms.getByName("MainForm").getByName("druk1")
druk3 = thisComponent.drawPage.forms.getByName("MainForm").getByName("druk3")
druk1.reload
druk1.reset
druk3.reset
drukid = druk3.getByName("id_m").currentvalue
sText2 = druk1.getByName("id_mies").currentvalue
druk1.getByName("id_mies").text = drukid
druk1.getByName("id_mies").commit
Rem... To save the current row
If druk1.IsNew then
druk1.InsertRow
Else
druk1.UpdateRow
End if
wartod = oMies.getByName("od").currentvalue
wartdo = oMies.getByName("do").currentvalue
dodr = oMies.getByName("do").currentvalue
oddr = oMies.getByName("od").currentvalue
m = cint(oddr)
n = cint(dodr)
dim args1(1) as new com.sun.star.beans.PropertyValue
for i = 0 to 10
if m < n - 8 then
sText2 = druk3.getByName("od").currentvalue
druk3.getByName("od").text = m
Druk3.getByName("od").commit
sText4 = Druk3.getByName("do").currentvalue
druk3.getByName("do").text = m + 8
Druk3.getByName("do").commit
Rem... To save the current row
druk3.UpdateRow
oDan.reload
rem ----------------------------------------------------------------------
rem define variables
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")
rem ----------------------------------------------------------------------
args1(0).Name = "Copies"
args1(0).Value = 1
args1(1).Name = "Collate"
args1(1).Value = true
dispatcher.executeDispatch(document, ".uno:Print", "", 0, args1())
m = m + 8
end if
next i
sText2 = druk3.getByName("od").currentvalue
druk3.getByName("od").text = m
Druk3.getByName("od").commit
sText4 = Druk3.getByName("do").currentvalue
druk3.getByName("do").text = n
Druk3.getByName("do").commit
Rem... To save the current row
If druk3.IsNew then
druk3.InsertRow
Else
druk3.UpdateRow
End if
oDan.reload
rem ----------------------------------------------------------------------
rem define variables
dim document1 as object
dim dispatcher1 as object
rem ----------------------------------------------------------------------
rem get access to the document
document1 = ThisComponent.CurrentController.Frame
dispatcher1 = createUnoService("com.sun.star.frame.DispatchHelper")
rem ----------------------------------------------------------------------
dim args11(1) as new com.sun.star.beans.PropertyValue
args11(0).Name = "Copies"
args11(0).Value = 1
args11(1).Name = "Collate"
args11(1).Value = true
dispatcher1.executeDispatch(document1, ".uno:Print", "", 0, args11())
sText2 = druk3.getByName("od").currentvalue
druk3.getByName("od").text = wartod
Druk3.getByName("od").commit
sText4 = Druk3.getByName("do").currentvalue
druk3.getByName("do").text = wartdo
Druk3.getByName("do").commit
Rem... To save the current row
If druk3.IsNew then
druk3.InsertRow
Else
druk3.UpdateRow
End if
oDan.reload
End Sub
uprościłem i po "next i" jak skończy pętle to wraca na początek- nie wiem jak z tego wybrnąć
Sub Main
oMies = thisComponent.drawPage.forms.getByName("MainForm").getByName("mies")
oddr = oMies.getByName("od").currentvalue
dodr = oMies.getByName("do").currentvalue
m = cint(oddr)
n = cint(dodr)
for i = 0 to 10
if m < n then
m = m + 1
end if
next i
End Sub
Sam Twój kod nie wystarcza do uruchomienia, bo masz jeszcze własne formularze.
Ostatnia najprostsza wersja, jeżeli podstawić za oddr i dodr stałe, działa. Nic nie wraca, na żaden początek. Dodaj tylko "exit for" w ramach else, albo lepiej zastosuj pętlę "for i = m to n-1" (z odpowiednio zmodyfikowanym n). Bo tak jak jest, pętla zawsze się kręci 11 razy, czy trzeba czy nie trzeba.
JJ LO (26.2) ∙ Python (3.13|3.10) ∙ Unicode 17 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Nie wiem czy o to ci chodziło z tymi stałymi, ale tak jest teraz to czasami przeskakuje a czasami nie zresztą dokładnie tak było z tym pierwszym makrem: czasami drukowało poprawnie a czasami nie. Załączam plik w którym przycisk "test" uruchamia makro w 3 module.
Sub Main
dim oMies as object
dim p as long
oMies = thisComponent.drawPage.forms.getByName("MainForm").getByName("mies")
m = oMies.getByName("od").currentvalue
n = oMies.getByName("do").currentvalue
p = ( n - m ) / 8
for i = 0 to p
if m < n then
m = m + 8
end if
next i
End Sub
znalazłem w przykladzie cos takiego: " const a = 2 " ale nie wiem jak to zastosować w moim przypadku
Jestem początkujący i trochę się pogubiłem. To uproszczone makro działą bez zarzutu. To dłuższe też pod warunkiem, że nie dodam funkcji drukuj. Załączam plik, w module drugim makra bez druku i z drukiem (te które zamieściłem na początku), w module trzecim makra uproszczone bez funkcji i z funkcją drukuj. formularzu1 przyciski uruchamiające makra. okazuje się, że dodanie funcji drukowania powoduje błedy.
Makro wreszcie drukuje to co powinno ale ciągle przeskok występuje. Mam w związku z tym pytanie: czy jest opcja by wrzucić w to makro funkcje drukowanie napisaną w języky java, beanshell lub python?
sub pusty
end sub
'=============================
sub druk
document1 = ThisComponent.CurrentController.Frame
dispatcher1 = createUnoService("com.sun.star.frame.DispatchHelper")
dim args11(1) as new com.sun.star.beans.PropertyValue
args11(0).Name = "Copies"
args11(0).Value = 1
args11(1).Name = "Collate"
args11(1).Value = true
dispatcher1.executeDispatch(document1, ".uno:Print", "", 0, args11())
end sub
'=============================
Sub makro
dim oMies as object
dim p as long
oMies = thisComponent.drawPage.forms.getByName("MainForm").getByName("mies")
m = cint(oMies.getByName("od").currentvalue)
n = cint(oMies.getByName("do").currentvalue)
p = ( n - m ) / 8
for i = 0 to p
if m < n then
pusty()
druk()
end if
m = m + 8
next i
End Sub
Ejże, czy chodzi Ci o to, że czasami (czytaj: przy niektórych zestawach danych) druk() wywoływany jest wielokrotnie?
To jest błąd w Twojej pętli. W kodzie
p = ( n - m ) / 8
for i = 0 to p
if m < n then
pusty()
druk()
end if
m = m + 8
next i
może się zdarzyć, że po dodaniu 8 do m nie przekroczysz n, a iteracji będzie więcej niż jedna. I gotowy podwójny wydruk.
Tak jest np. przy m = 1, n = 12. Wtedy p = 1, i pętla robi dwa obroty, a za każdym razem warunek jest spełniony.
Pętlę trzeba przeorganizować. A marko pusty() usunąć.
JJ LO (26.2) ∙ Python (3.13|3.10) ∙ Unicode 17 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Podam kolejnosc w której są wywoływane makra. 1. makro 2. pusty 3. makro 4. druk 5. pusty 6. makro. Punkt 5 nie powinien mieć miejsca. Najdziwniejsze jest to że jak naciskam "f8" powoli to jest procedura działa jak powinna (bez punktu 5). jak naciskam "f8" szybko to kolejność jest taka jak napisałem na początku.
Przy stworzonym przeze mnie makro (na wzór uproszczonego z ostatniego postu) jest ok, przy tym wczesniejszym jeden z zakresów danych ("m" i "m+8" filtują id a przy ostatnim wydruku "m+8" i "n" - po dopisaniu kilku linijek i zamiany "p" na "p-1") drukuje się dwa razy a inny nie drukuje się wogóle.
Właściwie dodanie linijki pusty() która nie powinna wpływać na nic sprawia że wydruk jest prawidłowy. Sprawdzone w praktyce
Zastanawiam się czy tonie jest jakiś błąd programu.
Sprawa wyjaśniła się przy innej części projektu, po prostu mam zbyt wolnego kompa Makro dzieliło mi dane z tabeli na przykładowo 3 zakresy. I tak najpierw wyświetlało zakres 1 potem zakres 2 potem zakres 3 i każdy z nich drukowało. Problem było to że zanim zadziałała cześć makra odpowiedzialna za drukowanie zakresu 1, już pojawiał się zakres 2 (kolejność w makrze była prawidłowa) i stąd ten podwójny wydruk.
Dodałem po funkcji drukuj kilka linijek które nic nie wnoszą, ale zajmują czas zanim przeskoczy kolejny zakres i drukuję się prawidłowo:D
A ten problem z wciśniętym f8 to rzeczywiście błąd programu.