Formulardokument schreibgeschützt öffnen

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: Formulardokument schreibgeschützt öffnen

von Strat49 » Mi, 11.10.2006 03:16

Hallo,

habe ganz zufällig einen Weg gefunden, der genau das macht, was ich wollte.

Einfach im geöffneten Dokument unter Extras/Optionen/Sicherheit einstellen, dass das Dokument schreibgeschützt geöffnet werden soll.

Also alles ganz einfach. manchmal sieht man den Wald vor Bäumen nicht! :wink:

Norbert

von Toxitom » Sa, 23.09.2006 18:36

Hey Norbert,
Gilt dies nur, wenn der Array nur ein Element = 0 hat? Dein Makrobuch S. 210 f habe ich so verstanden, dass die Methode loadComponentFromURL in der letzten Option immer den Array mit der gesetzten Parameteranzahl (also bei einem Parameter = 0, bei zweien = 1 etc.) haben muss.
Nein, du musst nur einen Array übergeben. Und der muss vorher deklariert werden (mit DIM). Wieviele Elemente der Array enthält, spielt keine Rolle. Du könntest auch so etwas schreiben:

Code: Alles auswählen

...
Dim arg(10)   'ein Array mit 11 Elementen
arg(0).name = "irgentetwas"
arg(0).value = true
starDesktop.loadComponentFromURL(sURL, "_blank", 0, arg())
Also nur ein von 11 Elementen füllen - dann alles übergeben. Ein Array selbst wird immer nur mit Klammern (leer) beschriben, steht in den Klammern etwas drin, so bezeiht sich das dann auf das einzelen Element.

Gruss
Thomas

von Strat49 » Sa, 23.09.2006 13:54

Danke Thomas,

die Geburt ist vollbracht, der Kreissaal tobt vor Freude! :P :P :P

Habe den Code berichtigt und es klappt wie gewünscht. Sieht gut aus!

Code: Alles auswählen

Der Methode "LoadComponentFromURL()" wird jetzt das Array gesamt übergeben, also in der Art "arg()". Wenn du da jetzt reinschreibst "Arg(0)", so würdest du nur den Inhalt des ersten Elementes (Index 0) übergeben - und das kann der Basic-Interpreter hier nicht auflösen. Wäre auch falsch, die Methode löst das selbst auf.
Gilt dies nur, wenn der Array nur ein Element = 0 hat? Dein Makrobuch S. 210 f habe ich so verstanden, dass die Methode loadComponentFromURL in der letzten Option immer den Array mit der gesetzten Parameteranzahl (also bei einem Parameter = 0, bei zweien = 1 etc.) haben muss. Vielleicht habe ich aber auch nur irgendwo einen erklärenden Hinweis überlesen. :wink: Allerdings beim genauen Betrachten des Codes auf S. 211 fällt mit jetzt auf, dass nur die Parameterzahl 0 gesetzt wurde, aber in der Methode die Anzahl 1 (also nicht Arg()) aufgerufen wird !? Auch ein <edit>?

Ansonsten, auf zu weiteren Taten! Das nächste Problem lugt bestimmt schon wartend um die nächste Häuserecke. Zum Glück findet man hier ja kompetente Hilfe.

Also danke und ciao bis bald
Norbert

von Toxitom » Sa, 23.09.2006 08:46

Hallo Norbert,

hmm, wird ne schwierige Geburt ....
Das Dokument ist aber immer noch nicht scheibgeschützt,
Sicher, das ist ein erwartetes Verhalten :-) . Jetzt ist nur der Entwurfsmodus aus, d.h. die Steuerelemente funktionieren direkt.
OK, Array leer gemacht, Makro läuft durch, allerdings wird nicht schreibgeschützt geöffnet. Also wieder nicht wie gewünscht. Scheint mir auch logisch zu sein, so wie ich deine Buchhinweise verstanden habe. Mit dem Arg(0) wird im Array ein Parameter = "ReadOnly" definiert und auf "True" gesetzt. Also muss das zu öffnende Dokument über die Methode LoadComponentFromURL als letzte Option durch den Array auch den gewünschten Parameter zugewiesen bekommen, oder?
Nein. Nicht das Array leermachen! Der Weg ist wie folgt: Du definierst das Array mit der gewünschten Dimension - hast du gemacht.
Jetzt weist due den Array-Elementen Inhalte zu - hast du gemacht.
Der Methode "LoadComponentFromURL()" wird jetzt das Array gesamt übergeben, also in der Art "arg()". Wenn du da jetzt reinschreibst "Arg(0)", so würdest du nur den Inhalt des ersten Elementes (Index 0) übergeben - und das kann der Basic-Interpreter hier nicht auflösen. Wäre auch falsch, die Methode löst das selbst auf.

Im übrigen hab ich mir den Ursprungscode noch mal angesehen. Da ist noch ein Fehler drin. Richtig muss es heissen:

Code: Alles auswählen

Sub DateiLadenReadOnly_Entwurf
   Dim vDoc   'die geladene Komponente
   Dim Arg(0) as new com.sun.star.beans.PropertyValue
   Dim sURL as string 'URL der zu ladenden Datei
   Arg(0).Name = "ReadOnly"
   Arg(0).Value = True
   sURL = ConvertToURL("/pfad/zur/datei/test.odt")
   vDoc = StarDesktop.loadComponentFromURL(sURL, "_blank", 0, Arg())
End Sub
"True" oder "False" sind Schölüsselwörter und bezeichnen einen bestimmten Zustand. Die darfst du natürlich nicht in Anfürhungszeichen setzen . sonst werden sie als Strings interpretiert und damit kann OOo nix anfangen.
Ich hab den Code mal getestet - funktioniert einwandfrei :-)

Viele Grüße
Thomas

<edit> PS: Hab gerade im Makrobuch einen Tippfehler gefunden :oops:
Auf Seite 210 steht True auch in Anführungszeichen.... naja, wird bei der nächsten Ausgabe berichtigt.

von Strat49 » Fr, 22.09.2006 22:53

Hallo Thomas,

danke für die Tipps:
Dazu blendest du dei Formular-Entwurfs-Symbolleiste ein und klickst auf das Icon "Formular im Entwurfsmodus öffenen". Das ist wohl eingeschaltet. Danach öffent sich das Formular immer ganz normal
Gesagt, getan. Die Schaltfläche funktioniert. Das Dokument ist aber immer noch nicht scheibgeschützt, hat also noch die Rasterlinien und die Rahmenlinien. Geht erst nach Druck auf "Datei bearbeiten" weg. Sieht also noch nicht wie gewünscht aus. Aber OK, das Raster läßt sich über Extras/Optionen abschalten. Bleiben also nur noch die Rahmenlinien. Ich habe nämlich die Texte jeweils in Textrahmen gesetzt, weil es so besser zu händeln ist.
Das übergebe Array darf natürlich keine Dimension mehr beinhalten - das kann der Interpreter nicht mehr auflösen. Nur das Array übergeben!
Dann sollte das auch funktionieren
OK, Array leer gemacht, Makro läuft durch, allerdings wird nicht schreibgeschützt geöffnet. Also wieder nicht wie gewünscht. Scheint mir auch logisch zu sein, so wie ich deine Buchhinweise verstanden habe. Mit dem Arg(0) wird im Array ein Parameter = "ReadOnly" definiert und auf "True" gesetzt. Also muss das zu öffnende Dokument über die Methode LoadComponentFromURL als letzte Option durch den Array auch den gewünschten Parameter zugewiesen bekommen, oder?
Hmm, also dafür würde ich einen Dialog nehmen.
Das glaube ich dir gerne. Aber die Hinweise im Basebuch sind dazu nur sehr knapp und im Makrobuch bin ich noch nicht so weit vorgedrungen. :oops:

Vielleicht sollte ich ein paar Kapitel überspringen!? :wink:

Wird auf jeden Fall wieder ein interessantes Arbeitswochende, und das bei dem Wetter!

Also Grüße erst einmal
Norbert

von Toxitom » Fr, 22.09.2006 20:21

Hey Norbert,
Also im Moment stört mich nicht die Veränderbarkeit des Formulars (kommt dann erst als nächster Schritt). Das Formular wird nur immer im Entwurfsmodus geöffnet, hat also die Rasterlinien und die Schaltfläche funktioniert noch nicht. Dazu muss es erst mit dem Symbol "Datei bearbeiten" auf schreibgeschützt gesetzt werden.
Also, wenns nur das ist: Das kannst du abstellen. Dazu blendest du dei Formular-Entwurfs-Symbolleiste ein und klickst auf das Icon "Formular im Entwurfsmodus öffenen". Das ist wohl eingeschaltet. Danach öffent sich das Formular immer ganz normal ;-)
ich öffne zunächst ein externes Begrüßungsformular mit dem Autoren- und Versionenhinweis etc. und einer Schaltfläche "Anwendung starten", die per Makro dann die Basedatei startet und sofort ein Baseformular mit weiteren Schaltflächen für die interne Datenbearbeitung und -erfassung öffnet.
Hmm, also dafür würde ich einen Dialog nehmen :-)

Aber ok, das ist Geschmackssache.

Der Fehler in deiner Codezeile:
das muss heissen:

Code: Alles auswählen

vDoc = StarDesktop.loadComponentFromURL(sURL, "_blank", 0, Arg()) 
Das übergebe Array darf natürlich keine Dimension mehr beinhalten - das kann der Interpreter nicht mehr auflösen. Nur das Array übergeben!
Dann sollte das auch funktionieren :-)

Gruss
Thomas

von Strat49 » Fr, 22.09.2006 19:10

Hallo Thomas,

danke für die schnelle Antwort. Habe noch einmal schnell im Forum OO Basic und Java geschnüffelt und schon gehts hier weiter. :D

Also im Moment stört mich nicht die Veränderbarkeit des Formulars (kommt dann erst als nächster Schritt). Das Formular wird nur immer im Entwurfsmodus geöffnet, hat also die Rasterlinien und die Schaltfläche funktioniert noch nicht. Dazu muss es erst mit dem Symbol "Datei bearbeiten" auf schreibgeschützt gesetzt werden.

Als internes Baseformular öffnet es sich ja auch schreibgeschützt, sieht gut aus und kann sofort genutzt werden. Nur - liegt erst halt nach dem Basecontainer, der sich zuerst öffnet!

Ich möchte nicht MS Access als Referenz anführen (weil Glaubenskriege nicht in dieses Forum gehören), nur dort geht es halt, dass per Makro sofort ein Formular geöffnet werden kann und der Eindruck einer eigenständigen Anwendung entsteht. Daher habe ich mir für OOo ausgedacht: ich öffne zunächst ein externes Begrüßungsformular mit dem Autoren- und Versionenhinweis etc. und einer Schaltfläche "Anwendung starten", die per Makro dann die Basedatei startet und sofort ein Baseformular mit weiteren Schaltflächen für die interne Datenbearbeitung und -erfassung öffnet. Das letztere klappt auch schon, nur eben nicht das schreibgeschützte Öffnen des Begrüßungsformulars! :?

Das Verstecken des LayoutManagers und der Statusleiste entsprechend deinem Makro "Formular_alleine" S. 349 in Datenbanken mit OOo2 soll dann zum Abschluss noch hinzukommen, wenn ich in den Formularen selbst nichts mehr bearbeiten muss. Das wäre also dein Tipp 1.

Zum Code selbst: ich arbeite zunächst immer mit einfachen Testdateien, welche die Makroschnipsel enthalten. Wenn das Makro funktioniert, übertrage ich es in die eigentliche Produktionsdatei. Das Begrüßungsformular kann sich ja nicht selbst schreibgeschützt aufrufen. Daher habe ich eine leere odt.Datei erstellt, diese hat in der Bibliothek Standard.Module1 nur das beschriebene Makro, allerdings erweitert um die eigene Closeroutine (in der Produktionsdatei wird es in einer eigenen Bibliothek gespeichert). Also ein sehr einfacher Code. Benötigst du die Datei noch für die nähere Untersuchung?

Die beanstandete Zeile lautet:

Code: Alles auswählen

vDoc = StarDesktop.loadComponentFromURL(sURL, "_blank", 0, Arg(0))
Eigentlich hatte ich mir den Ablauf ganz einfach vorgestellt. Ist so wohl nicht, oder?

Gruß
Norbert

von Toxitom » Fr, 22.09.2006 18:20

Hey Norbert,

(ich lass den Thread mal hier - ist im Prinzip egal :-) )

so ganz verstehe ich dein Problem nicht. Also, du willst ein formular öffnen - OK. Diese sol nicht veränerbar sein - richtig? Und es stört dich, dass der Benutzer theoretisch das Formuar manuell ändern kann, deswegen soll es im "Nur Lesemodus" geöffent werden? Um das zu realisiern, nutzt du eine dritte Datei, bei der über eine Schaltfläche das Dokument aufgerufen wird? Aber dann wäre doch auch die änderbar???
Also, dazu zwei Tipps:
1. könntest du das Formular ohne Menüleisten öffnen (bzw. diese per Makro beim Öffnen ausblenden). Dann kann der Benutzer auch nur das vorhanden Formular nutzen - nix verändern, und auch sonst nicht rumspielen :-)
2. Erzeuge dein Formular in Calc - dort kannst du das Dokument per Passwort schützen - dann ist nix mehr änderbar :-)
Ansonsten funktioniert das Formular genauso.

Deinen Code habe ich jetzt icht getestet, sieht aber OK aus. Wie heisst denn die Datei, aus der du das aufrufst? und welche Funktionen werden sonst noch ausgeführt? Wenn du die Fehlermeldung bekommst, welche Zeile ist markiert?

Ohne die Info ist schwer zu helfen.

Viele Grüße
Thomas

von Strat49 » Fr, 22.09.2006 17:33

Lieber Administrator,

wenn er dorthin besser passt, verschiebe diesen Threat bitte einfach in das Forum OO Basic und Java. Habe zu spät daran gedacht :? Sorry.

Gruß Norbert

Formulardokument schreibgeschützt öffnen

von Strat49 » Fr, 22.09.2006 17:29

Hallo zusammen,

bin schon wieder mit dem nächsten Problem da: ich habe zu meiner Basedatei ein externes Formulardokument als odt-Datei erstellt. Darin sind verschiedenen Schaltflächen, mit denen ich dann die Basedatei selbst öffnen und verschiedene Dinge darin machen möchte. Grundsätzlich geht das schon ganz gut. Leider gibt es noch einen Haken.

Das Formulardokument wird immer nicht schreibgeschützt geöffnet, wenn ich es - so macht man das beim Start einer Datenbankanwendung ja wohl meist - aus dem Dateimanager oder mit einer Desktopverknüpfung öffne. Die Option "nur lesen" steht dann ja nicht zur Verfügung.

Also habe ich versucht, mit dem Makrorekorder den Vorgang aufzuzeichnen, dass das Symbol "Datei bearbeiten" ausgeschaltet wird und mit dem Dateiöffnenvorgang verknüpft. Das Makro läuft anstandslos durch; - nur leider ohne Erfolg. Zwar wird zunächst das Symbol geändert, schaltet sich dann jedoch wieder in den Urspungszustand zurück.

Der nächste Schritt war das Schreiben des Makros DateiLadenReadOnly_Entwurf (siehe Code):

Code: Alles auswählen

Sub DateiLadenReadOnly_Entwurf
	Dim vDoc	'die geladene Komponente
	Dim Arg(0) as new com.sun.star.beans.PropertyValue
	Dim sURL as string 'URL der zu ladenden Datei
	Arg(0).Name = "ReadOnly"
	Arg(0).Value = "True"
	sURL = ConvertToURL("/pfad/zur/datei/test.odt")
	vDoc = StarDesktop.loadComponentFromURL(sURL, "_blank", 0, Arg(0))
End Sub
Das Ergebnis ist die folgende Fehlermeldung:

Code: Alles auswählen

BASIC-Laufzeitfehler
Es ist eine Exception aufgetreten.
Type: com.sun.star.lang.IllegalArgumentException
Message: Cannot not coerge argument type during corereflection call!
Warum kann OOo nicht so wie ich möchte?

Ach ja, das Makro soll in einem extra Writerdokument beim Dateiöffnen ausgeführt werden, dann also das Formulardokument Test.odt schreibgeschützt öffnen und sich anschließend selbst schließen (die Close-Routine habe ich hier bewußt weggelassen - funktioniert aber). Ein anderer Weg geht m.E. nicht, da ja zunächst überhaupt ein Dokument geöffnet sein muss, um das Makro ausführen zu können. Oder geht es auch anders?

Ich arbeite mit OOo 2.0.3 auf Suse Linux 10.0.

Grüße und Dank an alle Helfer
Norbert

Nach oben