Błąd wykonania makra po wywołaniu z przycisku.[SOLVED]

Makropolecenia i funkcje w języku Basic

Błąd wykonania makra po wywołaniu z przycisku.[SOLVED]

Postprzez RapH » Cz sie 16, 2018 9:10 am

Witam szanownych forumowiczów.

Mam pewien problem.
Podczas wywołania z przycisku oryginalnych makr z bibliotek makr OpenOffice

-Makra OpenOffice.Tools.Misc.ProtectSheets
-Makra OpenOffice.Tools.Misc.UnprotectSheets

wywala mi błąd " nie znaleziono właściwości lub metody: Count".
Jeśli jednak uruchamiam te makra myszką z pozycji edytora działanie przebiega pomyślnie.
Jaka jest różnica w sposobie wywołania i dlaczego nie chce działać z przycisku.
Proszę o wsparcie. Z góry dziękuję.
Ostatnio edytowano Cz wrz 06, 2018 8:28 am przez RapH, łącznie edytowano 1 raz
Apache Open Office 4.1.5
RapH
 
Posty: 3
Dołączył(a): Cz sie 16, 2018 8:53 am

Re: Błąd wykonania makra po wywołaniu z przycisku.

Postprzez Jan_J » Pn wrz 03, 2018 1:25 pm

Tzw. "makro" tak naprawdę jest podprogramem, czyli nazwanym opisem pewnego złożonego działania. W dobrze zaprojektowanym podprogramie jego kod opisuje podejmowaną czynność, zaś przedmiot tej czynności jest przekazywany jako tzw. argument (albo parametr realny) wywołania.
Widocznie (i naprawdę również), w przypadku obu sposobów uruchamiania do podprogramu przekazywane są inne argumenty.

Pomyśleć logicznie: zabezpieczyć arkusze w skoroszycie -- W KTÓRYM?
z przycisku -- w bieżącym, tym który jest w bieżącym oknie
z edytora -- ???
no właśnie, taka decyzja projektowa zostałą podjęta, takie są różnice w realizacji wywołań.

Napisałem wyjaśnienie uproszczonym językiem, ale sądzę, że poprawnie oddaje to co się dzieje.
JJ
LO (6.0|6.1) ∙ AOO 4.1.5 ∙ Python (3.7|2.7) ∙ Unicode 11 ∙ LATEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Fedora|CentOS|SUSE)
Jan_J
 
Posty: 3767
Dołączył(a): Pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Błąd wykonania makra po wywołaniu z przycisku.

Postprzez RapH » Wt wrz 04, 2018 8:46 am

"Pomyśleć logicznie: zabezpieczyć arkusze w skoroszycie -- W KTÓRYM?"
- nie wiem czy dobrze rozumiem ale chyba chodzi o podane konkretnego skoroszytu ewentualnie konkretnych arkuszy w skoroszycie.
Nie wiem niestety jak mam to zrobić.
Czy mógłbym prosić o rozwiązanie bezpośrednio w kodzie ?

(*skrypt oryginalny*)

Sub ProtectSheets(Optional oSheets as Object)
Dim i as Integer
Dim oDocSheets as Object
If IsMissing(oSheets) Then
oDocSheets = StarDesktop.CurrentFrame.Controller.Model.Sheets
Else
Set oDocSheets = oSheets
End If

For i = 0 To oDocSheets.Count-1
oDocSheets(i).Protect("")
Next i
MsgBox("Protected!!!")
End Sub
Apache Open Office 4.1.5
RapH
 
Posty: 3
Dołączył(a): Cz sie 16, 2018 8:53 am

Re: Błąd wykonania makra po wywołaniu z przycisku.

Postprzez Jan_J » Wt wrz 04, 2018 4:10 pm

pomyśleć logicznie -- to element snucia narracji, a nie uderzenie w rozmówcę
zabezpieczyć akusze -- zdaje się jest to celem w.w. przykładu

chodziło mi o to, że przy niektórych sposobach uruchamiania makra z bieżącego kontekstu jasno wynika, co to jest "bieżący dokument", a przy innych jest to niejasne albo niemożliwe do ustalenia. Przynajmniej metodą, której używa się powszechnie.
JJ
LO (6.0|6.1) ∙ AOO 4.1.5 ∙ Python (3.7|2.7) ∙ Unicode 11 ∙ LATEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Fedora|CentOS|SUSE)
Jan_J
 
Posty: 3767
Dołączył(a): Pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Błąd wykonania makra po wywołaniu z przycisku.

Postprzez Jermor » Śr wrz 05, 2018 9:04 pm

Ja także zauważyłem ten efekt. Nie jestem super biegły w makrach ale wydaje mi się, że rozwiązałem ten problem następująco.
Dodałem do pliku dwa makra "chron" i "niechron" i te makra podpiąłem pod przyciski. Mają taką postać:
Kod: Zaznacz cały   Rozszerz widokZwiń widok
sub chron
GlobalScope.BasicLibraries.Loadlibrary("Tools")
ProtectSheets
end sub
Sub niechron
GlobalScope.basicLibraries.LoadLibrary("Tools")
UnprotectSheets
end Sub

I zadziałało.
AOO 4.1.5, LO 6.0.6 (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.
Jermor
 
Posty: 520
Dołączył(a): So paź 12, 2013 11:09 am

Re: Błąd wykonania makra po wywołaniu z przycisku.

Postprzez Jan_J » Śr wrz 05, 2018 10:46 pm

Jermor napisał(a):I zadziałało.
Bo wywołując je z makra osadzonego w dokumencie mamy ustawioną zmienną ThisComponent, z której (zapewne) korzysta makro biblioteczne. Tak samo jest kiedy wywołujemy je przez menu w oknie z otwartym dokumentem. Zaś bezpośrednio z edytora już nie; możemy mieć otwartych fafnoście *innych* okien z dokumentami, gdzie fafnoście >= 0; który z nich byłby `bieżący`? już najbardziej kod skryptu, ale on nie jest arkuszem i nie ma jego właściwości.
JJ
LO (6.0|6.1) ∙ AOO 4.1.5 ∙ Python (3.7|2.7) ∙ Unicode 11 ∙ LATEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Fedora|CentOS|SUSE)
Jan_J
 
Posty: 3767
Dołączył(a): Pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Błąd wykonania makra po wywołaniu z przycisku.

Postprzez RapH » Cz wrz 06, 2018 8:26 am

Dzięki Jemor!!! Pomogłeś !!!
:D
Ja też sobie poradziłem jakoś wcześniej używając i modyfikując inne makro biblioteczne i działa nieźle:

Sub ProtectCurrentSheets_ON()
Dim oDocument as Object
Dim sDocType as String
Dim iResult as Integer
Dim oSheets as Object
Dim i as Integer
Dim bDoProtect as Boolean
oDocument = StarDesktop.ActiveFrame.Controller.Model
sDocType = GetDocumentType(oDocument)
If sDocType = "scalc" Then
oSheets = oDocument.Sheets
bDoProtect = False
For i = 0 To oSheets.Count-1
If Not oSheets(i).IsProtected Then
bDoProtect = True
End If
Next i
If bDoProtect Then
iResult = Msgbox( "NA PEWNO CHCESZ ZABEZPIECZYĆ DOKUMENT",35, GetProductName())
If iResult = 6 Then
ProtectSheets(oDocument.Sheets)
End If
End If
End If
End Sub

Widać (podobnie jak u ciecie) że funkcja "ProtectSheets(oDocument.Sheets)" jest wywoływana tylko z odpowiednimi argumentami, pewnie dlatego działa. Podobnie dla odbezpieczenia z tą różnicą "If oSheets(i).IsProtected Then" + wywołanie " UnprotectSheets(oDocument.Sheets)"

Szkoda że nie wszyscy którzy mogli by pomóc od ręki rozwiązać problem nie chcą tego zrobić, jakieś enigmatycznie podpowiedzi nie wiem dla jakiego efektu, a czasem wystarczą 4 linie kodu :D i problem rozwiązany.
... internet byłby lepszy :fist:
Apache Open Office 4.1.5
RapH
 
Posty: 3
Dołączył(a): Cz sie 16, 2018 8:53 am


Powrót do Basic

Kto przegląda forum

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