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

Makropolecenia i funkcje w języku Basic
RapH
Posty: 3
Rejestracja: czw sie 16, 2018 8:53 am

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

Post autor: RapH »

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 zmieniony czw wrz 06, 2018 8:28 am przez RapH, łącznie zmieniany 1 raz.
Apache Open Office 4.1.5
Jan_J
Posty: 4557
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

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

Post autor: Jan_J »

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 (7.6) ∙ AOO (4.1) ∙ Python (3.11|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
RapH
Posty: 3
Rejestracja: czw sie 16, 2018 8:53 am

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

Post autor: RapH »

"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
Jan_J
Posty: 4557
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

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

Post autor: Jan_J »

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 (7.6) ∙ AOO (4.1) ∙ Python (3.11|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Awatar użytkownika
Jermor
Posty: 2233
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

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

Post autor: Jermor »

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

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.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.
Jan_J
Posty: 4557
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

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

Post autor: Jan_J »

Jermor pisze: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 (7.6) ∙ AOO (4.1) ∙ Python (3.11|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
RapH
Posty: 3
Rejestracja: czw sie 16, 2018 8:53 am

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

Post autor: RapH »

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
ODPOWIEDZ