von Stephan » So, 10.04.2005 19:22
Hallo Frank,
möglicherweise ist das Folgende etwas philosophisch, deshalb sage ich mal es ist im Zweifel nur meine Meinung.
Mir ist beim versuchen jedoch noch etwas aufgefallen. Wenn die Funktion beim öffnen der Datei ausgeführt wird, ist der Zellenschutz nicht aktiv.
Das hängt mit Deiner Einstellung bezüglich der Sicherheit des Ausführens von Makros zusammen.
Ist das eurer Meinung ein Bug?
Ich denke nein, weil ich annehme die Sicherheitseinstellung von Makros ist Bei Dir so das es erlaubt ist. Calc führt beim Laden einer Datei quasi ein "kaltes" Update aller Berechnungen der Zellen aus, hierbei laufen auch alle Makros/Funktionen "vollständig" wenn Du das unter Makrosicherheit nicht verboten hast.
Auch bei Deiner Ausgangsfunktion ist das so:
Code: Alles auswählen
Function Testfunktion(wert)
Testfunktion=wert
OSheet = ThisComponent.Sheets(0)
osheet.getCellByPosition(1,1).value = wert
End Function
Bei geöffneter Calc-Datei funktioniert der Zugriff:
nicht, weil die normale Aktualisierung immer eine "warme" ist.
Trägst Du jedoch die Formel ein kannst Du auch manuell eine "kalte" Aktualisierung durchführen, die die Ausführung erzwingt (vorausgesetzt die Datei wurde nicht mit "Makroausführungsverbot" geöffnet). Drücke hierzu STRG+UMSCHALT+F9.
(Das Ganze ist natürlich ein Sicherheitsrisiko und sollte nicht verwendet werden. Du wirst bei Prüfung feststellen das Deine spezielle Funktion bei "kaltem" Aktualisieren immer zwei Mal läuft. Da Deine Funktion einen Zugriff auf das Zellobjekt direkt durchführt, was sie ja eigentlich nicht sollte und was deshalb normalerweise geblockt wird, erwächst deshalb ein besonderes Risiko aus ThisComponent, in sofern wäre hier Stardesktop.CurrentComponent angebracht. Das ist insgesamt jedoch nur theoretisch weil ein Zugriff auf das Zellobjekt in der Art und Weise wie Du ihn durchführst ohnehin nicht angebracht ist deshalb abgeblockt wird.
Man kann nun darüber streiten ob diese Art der Implemetierung richtig ist, weil es ja durchaus Fälle gibt wo der Zugriff auf dass Objekt der Zelle in beschriebener Art und Weise nicht zu Problemen führen würde.
Nur was soll ich sagen, es wäre auch möglich das sich eine ungespeicherte Calc-Datei bei Klick auf Schließen ohne Nachfrage schließt und die ungespeicherten Änderungen einfach verloren gehen. Aus dieser Sicht ist das mit der Problematik "Zellobjekt" eben auch nur ein Sicherheitsnetz um die Integrität der Gesamtdatei/Tabelle zu gewährleisten weil Du ja in der Funktion auch weitere Aktionen durchführen kannst. Zerstört z.B. Deine Funktion die Integrität der Tabelle und erhält gleichzeitig eine Speichern-Routine wäre jeder Rückweg verbaut bzw. könnte verbaut sein.)
Gruß
Stephan
Hallo Frank,
möglicherweise ist das Folgende etwas philosophisch, deshalb sage ich mal es ist im Zweifel nur meine Meinung.
[quote]Mir ist beim versuchen jedoch noch etwas aufgefallen. Wenn die Funktion beim öffnen der Datei ausgeführt wird, ist der Zellenschutz nicht aktiv.[/quote]
Das hängt mit Deiner Einstellung bezüglich der Sicherheit des Ausführens von Makros zusammen.
[quote]Ist das eurer Meinung ein Bug?[/quote]
Ich denke nein, weil ich annehme die Sicherheitseinstellung von Makros ist Bei Dir so das es erlaubt ist. Calc führt beim Laden einer Datei quasi ein "kaltes" Update aller Berechnungen der Zellen aus, hierbei laufen auch alle Makros/Funktionen "vollständig" wenn Du das unter Makrosicherheit nicht verboten hast.
Auch bei Deiner Ausgangsfunktion ist das so:
[code]Function Testfunktion(wert)
Testfunktion=wert
OSheet = ThisComponent.Sheets(0)
osheet.getCellByPosition(1,1).value = wert
End Function [/code]
Bei geöffneter Calc-Datei funktioniert der Zugriff:
[code]osheet.getCellByPosition(1,1).value = wert[/code]
nicht, weil die normale Aktualisierung immer eine "warme" ist.
Trägst Du jedoch die Formel ein kannst Du auch manuell eine "kalte" Aktualisierung durchführen, die die Ausführung erzwingt (vorausgesetzt die Datei wurde nicht mit "Makroausführungsverbot" geöffnet). Drücke hierzu STRG+UMSCHALT+F9.
[i](Das Ganze ist natürlich ein Sicherheitsrisiko und sollte nicht verwendet werden. Du wirst bei Prüfung feststellen das Deine spezielle Funktion bei "kaltem" Aktualisieren immer zwei Mal läuft. Da Deine Funktion einen Zugriff auf das Zellobjekt direkt durchführt, was sie ja eigentlich nicht sollte und was deshalb normalerweise geblockt wird, erwächst deshalb ein besonderes Risiko aus ThisComponent, in sofern wäre hier Stardesktop.CurrentComponent angebracht. Das ist insgesamt jedoch nur theoretisch weil ein Zugriff auf das Zellobjekt in der Art und Weise wie Du ihn durchführst ohnehin nicht angebracht ist deshalb abgeblockt wird.
Man kann nun darüber streiten ob diese Art der Implemetierung richtig ist, weil es ja durchaus Fälle gibt wo der Zugriff auf dass Objekt der Zelle in beschriebener Art und Weise nicht zu Problemen führen würde.
Nur was soll ich sagen, es wäre auch möglich das sich eine ungespeicherte Calc-Datei bei Klick auf Schließen ohne Nachfrage schließt und die ungespeicherten Änderungen einfach verloren gehen. Aus dieser Sicht ist das mit der Problematik "Zellobjekt" eben auch nur ein Sicherheitsnetz um die Integrität der Gesamtdatei/Tabelle zu gewährleisten weil Du ja in der Funktion auch weitere Aktionen durchführen kannst. Zerstört z.B. Deine Funktion die Integrität der Tabelle und erhält gleichzeitig eine Speichern-Routine wäre jeder Rückweg verbaut bzw. könnte verbaut sein.)[/i]
Gruß
Stephan