rübli hat geschrieben:... von Makroprogramierung keine Ahnung
na - da hast Du (als Nicht-Makroprogrammierer) aber schon ein recht komplexes Problem zu lösen!
Mein Vorschlag, wenn Du Dich ernsthaft mit Makros beschäftigen möchtes, studiere die von Stephan freundlicherweise gesammelte Link-Liste zu Gebrauchsanweisungen auf der Forum-Seite
Informationen zur StarBasic-Programmierung.
Um nun Dein Problem mal konkret anzugehen, hier mal einige Konzept-Vorschläge von mir:
Wenn ich Dich richtig verstanden habe, willst Du nur diverse Dokumente "per Knopfdruck" öffnen.
1. Die einfachste Methode wäre, direkt einen Dateimanager aufzurufen und damit dann gezielt das Dokument zu öffnen.
Willst Du aber dem Benutzer nur ganz spezielle Dokumente zum öffnen anbieten, musst Du Dich für eine statische Liste entscheiden.
2a. Setze ein Listenfeld in das Formular, welches alle Pfade zu Deinen diversen Dokumenten enthält.
2b. Erstelle ein kleines Makro, welches den ausgewählten Listenpunkt auslesen kann und automatisch ein Dokument öffnet.
2c. Weise einer Schaltfläche dieses Makro zu.
Je nach gewünschtem Luxus kannst Du die Aktion "Dokument öffnen" bereits beim Wechsel des Listeninhalts erreichen. Damit kann dann die Schaltfläche wegfallen.
2d. Weise dem Listenfeld beim Ereignis "Status geändert" dieses Makro zu
... soweit also die möglichen Konzepte - die Umsetzung erfordert allerdings schon ein bisschen Aufwand!
Methode 1 (öffnen per Dateimanager):
Das Formular benötigt dazu nur eine ganz normale Schaltfläche und ein kleines Makro - sonst nichts. Die Schaltfläche wird im Bearbeitungsmodus des Formulars eingesetzt und dann noch über seine Eigenschaften an das Makro verwiesen. Am einfachsten erreicht man die Kontrollfeldeigenschaften eines Steuerelements (hier z.B. die Schaltfläche) durch Anklicken mit der rechten Maustaste und Klick auf das Kontext-Menü "Kontrollfeld" = es erscheint ein Eigenschafts-Menü mit diversen Registerkarten.
Bevor wir aber ein Makro der Schaltfläche zuweisen, muss es ja erst einmal gebaut werden! Wir unterbrechen hier und steigen also erst mal in die wunderbare Welt der Makroprogrammierung ein ...
Makro "OpenByFilePicker" bauen:
Auf Makro-Ebene (bitte exakt so vorgehen, wie es Dir schon RobertG erklärt hat) muss also erst mal ein neues Makro gebaut werden, welches den Dateimanager startet, dessen Aktionen abwartet, weiterverarbeitet und zum Schluss das gewählte Dokument automatisch öffnet. Ein solches Makro habe ich mal beispielhaft zusammengestellt und "OpenByFilePicker" genannt (sieh unten). Den Code einfach kopieren und in das Makro-Modul unter dem Verzeichnis "Standard", "Module1" einkopieren - speichern nicht vergessen!
Makro dem Schaltflächen-Ereignis "Aktion ausführen" zuweisen:
Nachdem das Makro programmiert ist und das Formular mit allen Änderungen gespeichert wurde muss abschließend noch einmal das Formular im Entwurfsmodus geöffnet werden und der Schaltfläche zum Öffnen von Dokumenten das soeben programmierte Makro beim Ereignis "Aktion ausführen" zugewiesen bekommen. Das geht so:
Die Kontrollfeld-Eigenschaften der Schaltfläche wie oben beschrieben öffen. Jetzt die letzte Registerkarte "Ereignisse" auswählen und hinter "Aktion ausführen" das Makro suchen. Achtung: Eintragungen von Hand geht hier nicht - es muss mit dem Knopf, rechts gesucht werden! Verwirrend ist nun, dass nochmals ein Fenster mit einer Auflistung der möglichen Ereignisse erscheint - egal - wir bleiben beim Ereignis "Aktion ausführen" und klicken jetzt auf die Schaltfläche "Makro".
Jetzt wird's spannend: Du musst das eben programmiertes Makro mit Namen "OpenByListSelect" finden und das ist nicht so ganz einfach! Wenn Du beim Programmieren exakt so vorgegangen bist, wie es RobertG erklärt, dann sollte sich im Verzeichnisbaum unterhalb Deines Formular-Dokuments (xyz.odb), im Verzeichnis "Standard" ein weiteres Unterverzeichnis mit Namen "Module1" befinden. In diesem Verzeichnis "Module1" sollte dann auch das Makro "OpenByListSelect" zu finden sein - auf "OK" klicken!
Nachfolgend nun das Makro, welches den Dateimanager startet und ein ausgewähltes Dokument öffnet:
Code: Alles auswählen
Sub OpenByFilePicker()
' Funktion zum oeffnen einer OO-Datei (oder sonstigen Datei) mit Hilfe des Dateimanagers.
' Kommentare (wie dieser) beginnen immer mit einem einfachen Hochkomma
' So funktioniert's:
' Eine Schaltflaeche muss unter seinen "Eigenschaften", Registerkarte "Ereignisse"
' dieses Makro in der 2. Zeile bei "Aktion ausfuehren" zugewiesen bekommen.
' Einige wichtige System- und Objekt-Variablen bereitstellen:
Dim i As Integer, GotItAsURL As Boolean, sStartPath As String, aFilesCollection() As String
Dim sDocURL As String, sPickerTitle As String, oFilePicker As Object, oDocument As Object
Dim aFileProps() as new com.sun.star.beans.PropertyValue
' Array, d.h. eine Variable mit n Elementen, vordefinieren (hier jeweils 4 Elemente von Nr. 0 - 3)
' um spaeter mehrere Dateifilter fuer den Dateimanager festlegen zu koennen:
Dim FilterDescriptn(3) As String, FilterExtension(3) As String
' Den Start-Pfad festlegen (hier beispielhaft der Pfad zu "Eigene Dateien"):
' Lokales Benutzerprofil (Standard), entnommen der WINDOWS-Umgebungsvariable %USERPROFILE%:
sStartPath = Environ("USERPROFILE") & "\Eigene Dateien"
' Falls die "Eigenen Dateien" im Netzwerk ausgelagert wurden, geht's nur so:
'sStartPath = Environ("HOMEDRIVE") & Environ("HOMEPATH")
' Oder einfach statisch - das kann natuerlich dann alles moegliche sein:
' sStartPath = "C:\Dokumente und Einstellungen\Administrator\Eigene Dateien"
' Dateifilter festlegen (werden als Auswahl im Dateimanager angeboten):
FilterDescriptn(0) = "Writer-Textdokumente"
FilterDescriptn(1) = "Calc-Tabellendokumente"
FilterDescriptn(2) = "Impress-Präsentationen"
FilterDescriptn(3) = "Alle Datei-Typen"
FilterExtension(0) = "*.odt"
FilterExtension(1) = "*.ods"
FilterExtension(2) = "*.odp"
FilterExtension(3) = "*.*"
' Fenster-Titel des Dateimanagers festlegen:
sPickerTitle = "Wählen Sie die zu öffnende Datei ..."
' Diese Variable dient nur als Schalter, fuer den Fall dass
' der Dateimanager bereits URL-kodierte Pfade liefert
' (macht er unter WINDOWS n i c h t ! )
GotItAsURL = False
' Das Objekt zum WINDOWS-Dateimanager bereitstellen:
oFilePicker=createunoservice("com.sun.star.ui.dialogs.FilePicker")
' Die Anzahl der Datei-Filter wird durch die Array-Groesse bestimmt
' und diese Filter werden nun nacheinander dem Dateimanager uebergeben:
For i = 0 To UBound(FilterDescriptn)
oFilePicker.appendFilter(FilterDescriptn(i), FilterExtension(i))
Next
' Der Start-Pfad wird uebergeben:
oFilePicker.DisplayDirectory = sStartPath
' Der Fenster-Titel wird uebergeben:
oFilePicker.Title = sPickerTitle
' Nur wenn der Dateimanager korrekt gestartet und wieder beendet wurde ...
If oFilePicker.execute() Then
' ... kann der gewaehlte Dateiname eingelesen werden:
aFilesCollection = oFilePicker.getFiles()
' Je nach oben festgeleter Schalter-Einstellung wird URL-kodiert:
If GotItAsURL = True Then
sDocURL = aFilesCollection(0)
Else
sDocURL = ConvertToUrl(aFilesCollection(0))
EndIf
Else
' ... ansonsten war der Dateimanager offenbar abgebrochen worden:
MsgBox "Sie haben keine Datei gewählt - also passiert auch nix!", MB_ICONEXCLAMATION, "Der Dateimanager wurde abgebrochen!"
sDocURL = ""
End If
' Objekt zum Dateimanager loeschen:
oFilePicker.Dispose()
' Nur wenn der Dateipfad korrekt eingelesen wurde, wird die Datei geöffnet:
If sDocURL <> "" Then
oDocument = StarDesktop.loadComponentFromURL(sDocURL, "_blank", 0, aFileProps() )
EndIf
' Die Zuweisung des Oeffnen-Prozesses an die Objektvariable "oDocument"
' koennte auch entfallen - sie ermoeglicht aber weitere Aktionen mit dem
' geoeffneten Dokument, falls so etwas spaeter mal gebraucht werden sollte.
End Sub
Methode 2 (Listenfeld-gesteuertes Öffnen eines gewählten Dokuments):
Ein "Listenfeld" darf nicht mit "Kombinationsfeld" verwechselt werden! Nur mit einem Listenfeld können mehrere, unveränderliche Werte als Liste bereitgestellt werden. Außerdem müsssen unbedingt die Kontrollfeld-Eigenschaften geprüft bzw. korrekt eingestellt werden.
- Für das von mir (unten) bereitgestellte Makro muß das Listenfeld den Namen "URLSelector" bekommen.
- Die Eigenschaft "Aufklappbar" muß auf "Ja" eingestellt werden - sonst erscheint die Liste wie ein normales Eingabefeld und ist für unseren Zweck nicht geeignet.
- Hinter "Mehrfachselektion" muß die Eigenschaft "Nein" eingestellt sein.
Jetzt haben wir ein funktionstüchtiges Listenfeld!
Es gibt 2 Möglichkeiten, ein Listenfeld zu befüllen: Entweder manuell im Formular-Entwurf oder per Makro, welches aber dann beim Ereignis "Dokument öffnen" des Formulars zugewiesen werden muss (Weiter unten beschreibe ich noch, wie das geht).
Werte manuell in die Listbox eintragen::
Kontrollfeld-Eigenschaften, Registerkarte "Allgemein": Dort findet man auch die Eigenschaft "Listen-Einträge". In dieses Eingabefeld kann man Werte zeilenweise eintragen. Um eine neue Zeile zu erzeugen, muss die Umschalttaste (SHIFT) zusammen mit der Zeilenschalten (CR) gedrückt werden.
So kann man nun Zeile für Zeile die Listbox (z.B. mit Deinen Pfad-Angaben zu den Dokumenten) befüllen.
Als letztes noch mal schnell auf der Registerkarte "Daten" prüfen, ob hinter "Art des Listeninhalts" die Funktion "Werteliste" eingestellt ist. Ansonsten wird auf dieser Registerkarte
nichts weiter eingestellt und auch
keine Daten eingetragen (wie gesagt: Die Daten werden auf der Registerkarte "Allgemein" eingetragen, sonst nirgends) - wir sind fertig!
Makro "OpenByListSelect" bauen:
Wie unter Punkt 1 schon erklärt, muss sich auch dieses Makro im Verzeichnis "Standard", "Module1" befinden, damit Du es leichter finden kannst. Jetzt wird also ein weiteres Makro gebaut, welches den vom Benutzer ausgewählten Wert der Listbox automatisch ausliest und weiter verarbeitet. Ein solches Makro habe ich mal beispielhaft zusammengestellt und "OpenByListSelect" genannt (sieh unten) - einfach den Code kopieren und im Module1 einfügen - speichern nicht vergessen!
2c. Makro dem Ereignis "Aktion ausführen" zuweisen:
Damit das Makro beim Anklicken einer Schaltfläche startet, muß diese Schaltfläche beim Ereignis "Aktion ausführen" das Makro aufrufen. Gleiche Vorgehensweise wie oben schon beschrieben.
2d. Makro dem Ereignis "Status geändert" der Listbox zuweisen:
Die Methode erfodert keine zusätzliche Schaltfläche, allerdings sollte dann die Listbox auch keinen Standard-Eintrag beim Öffnen des Formulars besitzen (weil sie sonst möglicherweise vom Benutzer nicht aufgeklappt wird und nix weiter passiert!)
Damit das Makro beim Aufklappen/Auswählen der Listbox automatisch startet, muß das Listenfeld jetzt beim Ereignis "Status geändert" das Makro aufrufen. Gleiche Vorgehensweise wie oben schon beschrieben.
Nachfolgend nun das Makro, welches einen gewählten Listeneintrag ausliest und damit das Dokument öffnet:
Code: Alles auswählen
Sub OpenByListSelect()
' Funktion zum automatischen Auslesen einer aktuell gewaehlten Listenfeld-
' Zeile und zum unmittelbarem Oeffnen des dort vorgefundenen Pfades.
' Kommentare (wie dieser) beginnen immer mit einem einfachen Hochkomma
' So funktioniert's:
' a) Per separater Schaltflaeche:
' Die Schaltflaeche muss unter seinen "Eigenschaften", Registerkarte "Ereignisse"
' dieses Makro in der 2. Zeile bei "Aktion ausfuehren" zugewiesen bekommen.
' b) Automatisch beim Wechseln des Listeneintrags:
' Das Listenfeld muss unter seinen "Eigenschaften", Registerkarte "Ereignisse"
' dieses Makro in der 3. Zeile bei "Status geaendert" zugewiesen bekommen.
' Hinweis:
' Es wird angenommen, dass nur ein gleichzeitig geoeffnetes Formular
' und darin ein Listenfeld mit dem Namen "URLSelector" existiert.
' Als erstes muessen einige Variablen vordimensioniert werden:
Dim oForm As Object, oListBox As Object, oDocument As Object
Dim aFileProps() as new com.sun.star.beans.PropertyValue
Dim sSelectText As String, sDocURL As String
' Dann werden die notwendigen Objekte bereitgestellt,
' um die Listbox ansprechen zu koennen:
oForm = ThisComponent.Drawpage.forms(0)
oListBox = oForm.getByName("URLSelector")
' Hier wird der aktuell ausgewaehlte Text aus der Listbox gelesen:
sSelectText = oListBox.CurrentValue
' Der Text (= Pfad zum Dokument) wird jetzt plattformuebergreifend konvertiert:
sDocURL = ConvertToUrl(sSelectText)
' Die konvertierte Pfadangabe "sDocURL" wird erst mal auf Vorhandensein geprüft ...
If Not FileExists(sDocURL) Then
' ... und eine Meldung ausgegeben, falls nix gefunden:
MsgBox "Datei '" & sSelectText & "' existiert nicht!", MB_ICONSTOP, "Vorgabenliste falsch!"
Else
' ... oder eben das Dokument geoeffnet:
oDocument = StarDesktop.loadComponentFromURL(sDocURL, "_blank", 0, aFileProps() )
EndIf
' Die Zuweisung des Oeffnen-Prozesses an die Objektvariable "oDocument"
' koennte auch entfallen - sie ermoeglicht aber weitere Aktionen mit dem
' geoeffneten Dokument, falls so etwas spaeter mal gebraucht werden sollte.
End Sub
Zum Schluss komme noch einmal auf die von mir oben angedeutete Möglichkeit zurück, die Werteliste einer Listbox per Makro und nicht manuell zu befüllen.
Hierbei ist schon eine Aktion beim Öffnen des Formulars gefragt, welche das Listenfeld befüllt noch bevor das Formular angezeigt wird. Natürlich kann auch das wieder von einem Makro erledigt werden, welches wir aber erst einmal bauen müssen.
Makro "FillListBox" bauen:
Wie unter Punkt 1 schon erklärt, muss sich auch dieses Makro im Verzeichnis "Standard", "Module1" befinden, damit Du es leichter finden kannst. Jetzt wird also ein Makro gebaut, welches automatisch diverse Werte in die Listbox schreibt. Ein solches Makro habe ich mal beispielhaft zusammengestellt und "FillListBox" genannt (sieh unten) - einfach den Code kopieren und im Module1 einfügen - speichern nicht vergessen!
Makro dem Ereignis "Dokument öffnen" zuweisen:
Damit dieses Makro schon während dem Öffnen des Formulars gestartet werden, muß in der Bearbeituns-Modus des Formulars, unter dem Menü "Extras/Anpassen" die Registerkarte Ereignisse gesucht werden (Aufgepasst: Es geht jetzt um Ereignisse des Formulars und nicht um die einzelner Steuerelemente!). In dem Auswahlmenü gibt es an 6. Stelle das Ereignis "Dokument öffnen". Hier muss nun das Makro "FillListBox" angebunden werden - Vorgehensweise wie oben beschrieben.
Wenn die Methode zum automatischen Befüllen bevorzugt wird, darf natrülich die Werteliste der Listbox selbst (unter Kontrollfeld-Eigenschaften "Listen-Einträge") keine Einträge enthalten - sonst gibts Durcheinander!
Nachfolgend nun das Makro, welches automatisch ein Listenfeld beim Öffnen des Formulars mit Werten befüllt:
Code: Alles auswählen
Sub FillListBox
' Funktion zum Befuellen eines Listenfeldes mit diversen Werten
' Kommentare (wie dieser) beginnen immer mit einem einfachen Hochkomma
' So funktioniert's:
' Das Formular muss im Hauptmenue unter "Extras/Anpassen"
' unter der Registerkarte "Ereignisse" dieses Makro
' in der 6. Zeile bei "Dokument öffnen" zugewiesen bekommen.
' Hinweis:
' Es wird angenommen, dass nur ein gleichzeitig geoeffnetes Formular
' und darin ein Listenfeld mit dem Namen "URLSelector" existiert.
' Als erstes muessen einige Objekt-Variablen vordimensioniert werden:
Dim oForm As Object, oListBox As Object
' Dann muss ein sogenannter Array, d.h. eine Variable mit n Elementen
' vordimensioniert werden. Die folgende Variable "yListEntries" ist ein
' solcher Array und bekommt hier 5 Elemente - Nr.0 bis Nr.4 - bereitgestellt:
Dim aListEntries(4) As String
' Jetzt werden die Elemente des Arrays mit Werten (Dokumenten-Pfade) befuellt:
aListEntries(0) = "C:\Verzeichnis\Datei1.odt"
aListEntries(1) = "C:\Verzeichnis\Datei2.odt"
aListEntries(2) = "C:\Verzeichnis\Datei3.odt"
aListEntries(3) = "C:\Verzeichnis\Datei4.odt"
aListEntries(4) = "C:\Verzeichnis\Datei5.odt"
' Dann werden die notwendigen Objekte bereitgestellt,
' um die Listbox im Formular ansprechen zu koennen:
oForm = ThisComponent.Drawpage.forms(0)
oListBox = oForm.getByName("URLSelector")
' Zum Schluss wird die Listbox mit den oben bereitgestellten Daten gefuellt:
oListBox.StringItemList = yListEntries()
' Bei Bedarf kann man auch noch einen Standard-Eintrag der Listbox einstellen
' Hier wird beispielhaft immer der 3. Listenpunkt (d.h. Array-Nr. 2) vorgewaehlt:
' oListBox.DefaultText = yListEntries(2)
' ... das war's !
End Sub
Klingt alles schrecklich kompliziert - ist es vielleicht für einen Neuling auch. Meine Beispiele mögen aber vielleicht dazu dienen, sich in die Grundzüge der Makroprogrammierung hinein zu fummeln. Ansonsten verweise ich ausdrücklich nochmals auf entsprechende Tutorials und Wikkis von OpenOffice!
Viel Erfolg!
Gruß: ejomi (der heute keine Lust hat zu arbeiten und stattdessen lieber Romane schreibt)
[quote="rübli"]... von Makroprogramierung keine Ahnung[/quote]
na - da hast Du (als Nicht-Makroprogrammierer) aber schon ein recht komplexes Problem zu lösen!
Mein Vorschlag, wenn Du Dich ernsthaft mit Makros beschäftigen möchtes, studiere die von Stephan freundlicherweise gesammelte Link-Liste zu Gebrauchsanweisungen auf der Forum-Seite [url=http://de.openoffice.info/viewtopic.php?f=18&t=1553#p5832]Informationen zur StarBasic-Programmierung[/url].
Um nun Dein Problem mal konkret anzugehen, hier mal einige Konzept-Vorschläge von mir:
Wenn ich Dich richtig verstanden habe, willst Du nur diverse Dokumente "per Knopfdruck" öffnen.
[color=#008000]
1. Die einfachste Methode wäre, direkt einen Dateimanager aufzurufen und damit dann gezielt das Dokument zu öffnen.[/color]
Willst Du aber dem Benutzer nur ganz spezielle Dokumente zum öffnen anbieten, musst Du Dich für eine statische Liste entscheiden.
[color=#008000]
2a. Setze ein Listenfeld in das Formular, welches alle Pfade zu Deinen diversen Dokumenten enthält.
2b. Erstelle ein kleines Makro, welches den ausgewählten Listenpunkt auslesen kann und automatisch ein Dokument öffnet.
2c. Weise einer Schaltfläche dieses Makro zu.[/color]
Je nach gewünschtem Luxus kannst Du die Aktion "Dokument öffnen" bereits beim Wechsel des Listeninhalts erreichen. Damit kann dann die Schaltfläche wegfallen.
[color=#008000]2d. Weise dem Listenfeld beim Ereignis "Status geändert" dieses Makro zu[/color]
... soweit also die möglichen Konzepte - die Umsetzung erfordert allerdings schon ein bisschen Aufwand!
[b]Methode 1 (öffnen per Dateimanager):[/b]
Das Formular benötigt dazu nur eine ganz normale Schaltfläche und ein kleines Makro - sonst nichts. Die Schaltfläche wird im Bearbeitungsmodus des Formulars eingesetzt und dann noch über seine Eigenschaften an das Makro verwiesen. Am einfachsten erreicht man die Kontrollfeldeigenschaften eines Steuerelements (hier z.B. die Schaltfläche) durch Anklicken mit der rechten Maustaste und Klick auf das Kontext-Menü "Kontrollfeld" = es erscheint ein Eigenschafts-Menü mit diversen Registerkarten. [i]Bevor wir aber ein Makro der Schaltfläche zuweisen, muss es ja erst einmal gebaut werden! Wir unterbrechen hier und steigen also erst mal in die wunderbare Welt der Makroprogrammierung ein ...[/i]
[color=#008000]Makro "OpenByFilePicker" bauen:[/color]
Auf Makro-Ebene (bitte exakt so vorgehen, wie es Dir schon RobertG erklärt hat) muss also erst mal ein neues Makro gebaut werden, welches den Dateimanager startet, dessen Aktionen abwartet, weiterverarbeitet und zum Schluss das gewählte Dokument automatisch öffnet. Ein solches Makro habe ich mal beispielhaft zusammengestellt und "OpenByFilePicker" genannt (sieh unten). Den Code einfach kopieren und in das Makro-Modul unter dem Verzeichnis "Standard", "Module1" einkopieren - speichern nicht vergessen!
[color=#008000]Makro dem Schaltflächen-Ereignis "Aktion ausführen" zuweisen:[/color]
Nachdem das Makro programmiert ist und das Formular mit allen Änderungen gespeichert wurde muss abschließend noch einmal das Formular im Entwurfsmodus geöffnet werden und der Schaltfläche zum Öffnen von Dokumenten das soeben programmierte Makro beim Ereignis "Aktion ausführen" zugewiesen bekommen. Das geht so:
Die Kontrollfeld-Eigenschaften der Schaltfläche wie oben beschrieben öffen. Jetzt die letzte Registerkarte "Ereignisse" auswählen und hinter "Aktion ausführen" das Makro suchen. Achtung: Eintragungen von Hand geht hier nicht - es muss mit dem Knopf, rechts gesucht werden! Verwirrend ist nun, dass nochmals ein Fenster mit einer Auflistung der möglichen Ereignisse erscheint - egal - wir bleiben beim Ereignis "Aktion ausführen" und klicken jetzt auf die Schaltfläche "Makro".
Jetzt wird's spannend: Du musst das eben programmiertes Makro mit Namen "OpenByListSelect" finden und das ist nicht so ganz einfach! Wenn Du beim Programmieren exakt so vorgegangen bist, wie es RobertG erklärt, dann sollte sich im Verzeichnisbaum unterhalb Deines Formular-Dokuments (xyz.odb), im Verzeichnis "Standard" ein weiteres Unterverzeichnis mit Namen "Module1" befinden. In diesem Verzeichnis "Module1" sollte dann auch das Makro "OpenByListSelect" zu finden sein - auf "OK" klicken!
Nachfolgend nun das Makro, welches den Dateimanager startet und ein ausgewähltes Dokument öffnet:
[code]Sub OpenByFilePicker()
' Funktion zum oeffnen einer OO-Datei (oder sonstigen Datei) mit Hilfe des Dateimanagers.
' Kommentare (wie dieser) beginnen immer mit einem einfachen Hochkomma
' So funktioniert's:
' Eine Schaltflaeche muss unter seinen "Eigenschaften", Registerkarte "Ereignisse"
' dieses Makro in der 2. Zeile bei "Aktion ausfuehren" zugewiesen bekommen.
' Einige wichtige System- und Objekt-Variablen bereitstellen:
Dim i As Integer, GotItAsURL As Boolean, sStartPath As String, aFilesCollection() As String
Dim sDocURL As String, sPickerTitle As String, oFilePicker As Object, oDocument As Object
Dim aFileProps() as new com.sun.star.beans.PropertyValue
' Array, d.h. eine Variable mit n Elementen, vordefinieren (hier jeweils 4 Elemente von Nr. 0 - 3)
' um spaeter mehrere Dateifilter fuer den Dateimanager festlegen zu koennen:
Dim FilterDescriptn(3) As String, FilterExtension(3) As String
' Den Start-Pfad festlegen (hier beispielhaft der Pfad zu "Eigene Dateien"):
' Lokales Benutzerprofil (Standard), entnommen der WINDOWS-Umgebungsvariable %USERPROFILE%:
sStartPath = Environ("USERPROFILE") & "\Eigene Dateien"
' Falls die "Eigenen Dateien" im Netzwerk ausgelagert wurden, geht's nur so:
'sStartPath = Environ("HOMEDRIVE") & Environ("HOMEPATH")
' Oder einfach statisch - das kann natuerlich dann alles moegliche sein:
' sStartPath = "C:\Dokumente und Einstellungen\Administrator\Eigene Dateien"
' Dateifilter festlegen (werden als Auswahl im Dateimanager angeboten):
FilterDescriptn(0) = "Writer-Textdokumente"
FilterDescriptn(1) = "Calc-Tabellendokumente"
FilterDescriptn(2) = "Impress-Präsentationen"
FilterDescriptn(3) = "Alle Datei-Typen"
FilterExtension(0) = "*.odt"
FilterExtension(1) = "*.ods"
FilterExtension(2) = "*.odp"
FilterExtension(3) = "*.*"
' Fenster-Titel des Dateimanagers festlegen:
sPickerTitle = "Wählen Sie die zu öffnende Datei ..."
' Diese Variable dient nur als Schalter, fuer den Fall dass
' der Dateimanager bereits URL-kodierte Pfade liefert
' (macht er unter WINDOWS n i c h t ! )
GotItAsURL = False
' Das Objekt zum WINDOWS-Dateimanager bereitstellen:
oFilePicker=createunoservice("com.sun.star.ui.dialogs.FilePicker")
' Die Anzahl der Datei-Filter wird durch die Array-Groesse bestimmt
' und diese Filter werden nun nacheinander dem Dateimanager uebergeben:
For i = 0 To UBound(FilterDescriptn)
oFilePicker.appendFilter(FilterDescriptn(i), FilterExtension(i))
Next
' Der Start-Pfad wird uebergeben:
oFilePicker.DisplayDirectory = sStartPath
' Der Fenster-Titel wird uebergeben:
oFilePicker.Title = sPickerTitle
' Nur wenn der Dateimanager korrekt gestartet und wieder beendet wurde ...
If oFilePicker.execute() Then
' ... kann der gewaehlte Dateiname eingelesen werden:
aFilesCollection = oFilePicker.getFiles()
' Je nach oben festgeleter Schalter-Einstellung wird URL-kodiert:
If GotItAsURL = True Then
sDocURL = aFilesCollection(0)
Else
sDocURL = ConvertToUrl(aFilesCollection(0))
EndIf
Else
' ... ansonsten war der Dateimanager offenbar abgebrochen worden:
MsgBox "Sie haben keine Datei gewählt - also passiert auch nix!", MB_ICONEXCLAMATION, "Der Dateimanager wurde abgebrochen!"
sDocURL = ""
End If
' Objekt zum Dateimanager loeschen:
oFilePicker.Dispose()
' Nur wenn der Dateipfad korrekt eingelesen wurde, wird die Datei geöffnet:
If sDocURL <> "" Then
oDocument = StarDesktop.loadComponentFromURL(sDocURL, "_blank", 0, aFileProps() )
EndIf
' Die Zuweisung des Oeffnen-Prozesses an die Objektvariable "oDocument"
' koennte auch entfallen - sie ermoeglicht aber weitere Aktionen mit dem
' geoeffneten Dokument, falls so etwas spaeter mal gebraucht werden sollte.
End Sub[/code]
[b]Methode 2 (Listenfeld-gesteuertes Öffnen eines gewählten Dokuments):[/b]
Ein "Listenfeld" darf nicht mit "Kombinationsfeld" verwechselt werden! Nur mit einem Listenfeld können mehrere, unveränderliche Werte als Liste bereitgestellt werden. Außerdem müsssen unbedingt die Kontrollfeld-Eigenschaften geprüft bzw. korrekt eingestellt werden.
- Für das von mir (unten) bereitgestellte Makro muß das Listenfeld den Namen "URLSelector" bekommen.
- Die Eigenschaft "Aufklappbar" muß auf "Ja" eingestellt werden - sonst erscheint die Liste wie ein normales Eingabefeld und ist für unseren Zweck nicht geeignet.
- Hinter "Mehrfachselektion" muß die Eigenschaft "Nein" eingestellt sein.
Jetzt haben wir ein funktionstüchtiges Listenfeld!
Es gibt 2 Möglichkeiten, ein Listenfeld zu befüllen: Entweder manuell im Formular-Entwurf oder per Makro, welches aber dann beim Ereignis "Dokument öffnen" des Formulars zugewiesen werden muss (Weiter unten beschreibe ich noch, wie das geht).
[color=#008000]Werte manuell in die Listbox eintragen::[/color]
Kontrollfeld-Eigenschaften, Registerkarte "Allgemein": Dort findet man auch die Eigenschaft "Listen-Einträge". In dieses Eingabefeld kann man Werte zeilenweise eintragen. Um eine neue Zeile zu erzeugen, muss die Umschalttaste (SHIFT) zusammen mit der Zeilenschalten (CR) gedrückt werden.
So kann man nun Zeile für Zeile die Listbox (z.B. mit Deinen Pfad-Angaben zu den Dokumenten) befüllen.
Als letztes noch mal schnell auf der Registerkarte "Daten" prüfen, ob hinter "Art des Listeninhalts" die Funktion "Werteliste" eingestellt ist. Ansonsten wird auf dieser Registerkarte [u]nichts[/u] weiter eingestellt und auch [u]keine Daten eingetragen[/u] (wie gesagt: Die Daten werden auf der Registerkarte "Allgemein" eingetragen, sonst nirgends) - wir sind fertig!
[color=#008000]Makro "OpenByListSelect" bauen:[/color]
Wie unter Punkt 1 schon erklärt, muss sich auch dieses Makro im Verzeichnis "Standard", "Module1" befinden, damit Du es leichter finden kannst. Jetzt wird also ein weiteres Makro gebaut, welches den vom Benutzer ausgewählten Wert der Listbox automatisch ausliest und weiter verarbeitet. Ein solches Makro habe ich mal beispielhaft zusammengestellt und "OpenByListSelect" genannt (sieh unten) - einfach den Code kopieren und im Module1 einfügen - speichern nicht vergessen!
[color=#008000]2c. Makro dem Ereignis "Aktion ausführen" zuweisen:[/color]
Damit das Makro beim Anklicken einer Schaltfläche startet, muß diese Schaltfläche beim Ereignis "Aktion ausführen" das Makro aufrufen. Gleiche Vorgehensweise wie oben schon beschrieben.
[color=#008000]2d. Makro dem Ereignis "Status geändert" der Listbox zuweisen:[/color]
Die Methode erfodert keine zusätzliche Schaltfläche, allerdings sollte dann die Listbox auch keinen Standard-Eintrag beim Öffnen des Formulars besitzen (weil sie sonst möglicherweise vom Benutzer nicht aufgeklappt wird und nix weiter passiert!)
Damit das Makro beim Aufklappen/Auswählen der Listbox automatisch startet, muß das Listenfeld jetzt beim Ereignis "Status geändert" das Makro aufrufen. Gleiche Vorgehensweise wie oben schon beschrieben.
Nachfolgend nun das Makro, welches einen gewählten Listeneintrag ausliest und damit das Dokument öffnet:
[code]Sub OpenByListSelect()
' Funktion zum automatischen Auslesen einer aktuell gewaehlten Listenfeld-
' Zeile und zum unmittelbarem Oeffnen des dort vorgefundenen Pfades.
' Kommentare (wie dieser) beginnen immer mit einem einfachen Hochkomma
' So funktioniert's:
' a) Per separater Schaltflaeche:
' Die Schaltflaeche muss unter seinen "Eigenschaften", Registerkarte "Ereignisse"
' dieses Makro in der 2. Zeile bei "Aktion ausfuehren" zugewiesen bekommen.
' b) Automatisch beim Wechseln des Listeneintrags:
' Das Listenfeld muss unter seinen "Eigenschaften", Registerkarte "Ereignisse"
' dieses Makro in der 3. Zeile bei "Status geaendert" zugewiesen bekommen.
' Hinweis:
' Es wird angenommen, dass nur ein gleichzeitig geoeffnetes Formular
' und darin ein Listenfeld mit dem Namen "URLSelector" existiert.
' Als erstes muessen einige Variablen vordimensioniert werden:
Dim oForm As Object, oListBox As Object, oDocument As Object
Dim aFileProps() as new com.sun.star.beans.PropertyValue
Dim sSelectText As String, sDocURL As String
' Dann werden die notwendigen Objekte bereitgestellt,
' um die Listbox ansprechen zu koennen:
oForm = ThisComponent.Drawpage.forms(0)
oListBox = oForm.getByName("URLSelector")
' Hier wird der aktuell ausgewaehlte Text aus der Listbox gelesen:
sSelectText = oListBox.CurrentValue
' Der Text (= Pfad zum Dokument) wird jetzt plattformuebergreifend konvertiert:
sDocURL = ConvertToUrl(sSelectText)
' Die konvertierte Pfadangabe "sDocURL" wird erst mal auf Vorhandensein geprüft ...
If Not FileExists(sDocURL) Then
' ... und eine Meldung ausgegeben, falls nix gefunden:
MsgBox "Datei '" & sSelectText & "' existiert nicht!", MB_ICONSTOP, "Vorgabenliste falsch!"
Else
' ... oder eben das Dokument geoeffnet:
oDocument = StarDesktop.loadComponentFromURL(sDocURL, "_blank", 0, aFileProps() )
EndIf
' Die Zuweisung des Oeffnen-Prozesses an die Objektvariable "oDocument"
' koennte auch entfallen - sie ermoeglicht aber weitere Aktionen mit dem
' geoeffneten Dokument, falls so etwas spaeter mal gebraucht werden sollte.
End Sub[/code]
Zum Schluss komme noch einmal auf die von mir oben angedeutete Möglichkeit zurück, die Werteliste einer Listbox per Makro und nicht manuell zu befüllen.
Hierbei ist schon eine Aktion beim Öffnen des Formulars gefragt, welche das Listenfeld befüllt noch bevor das Formular angezeigt wird. Natürlich kann auch das wieder von einem Makro erledigt werden, welches wir aber erst einmal bauen müssen.
[color=#008000]Makro "FillListBox" bauen:[/color]
Wie unter Punkt 1 schon erklärt, muss sich auch dieses Makro im Verzeichnis "Standard", "Module1" befinden, damit Du es leichter finden kannst. Jetzt wird also ein Makro gebaut, welches automatisch diverse Werte in die Listbox schreibt. Ein solches Makro habe ich mal beispielhaft zusammengestellt und "FillListBox" genannt (sieh unten) - einfach den Code kopieren und im Module1 einfügen - speichern nicht vergessen!
[color=#008000]Makro dem Ereignis "Dokument öffnen" zuweisen:[/color]
Damit dieses Makro schon während dem Öffnen des Formulars gestartet werden, muß in der Bearbeituns-Modus des Formulars, unter dem Menü "Extras/Anpassen" die Registerkarte Ereignisse gesucht werden (Aufgepasst: Es geht jetzt um Ereignisse des Formulars und nicht um die einzelner Steuerelemente!). In dem Auswahlmenü gibt es an 6. Stelle das Ereignis "Dokument öffnen". Hier muss nun das Makro "FillListBox" angebunden werden - Vorgehensweise wie oben beschrieben.
Wenn die Methode zum automatischen Befüllen bevorzugt wird, darf natrülich die Werteliste der Listbox selbst (unter Kontrollfeld-Eigenschaften "Listen-Einträge") keine Einträge enthalten - sonst gibts Durcheinander!
Nachfolgend nun das Makro, welches automatisch ein Listenfeld beim Öffnen des Formulars mit Werten befüllt:
[code]Sub FillListBox
' Funktion zum Befuellen eines Listenfeldes mit diversen Werten
' Kommentare (wie dieser) beginnen immer mit einem einfachen Hochkomma
' So funktioniert's:
' Das Formular muss im Hauptmenue unter "Extras/Anpassen"
' unter der Registerkarte "Ereignisse" dieses Makro
' in der 6. Zeile bei "Dokument öffnen" zugewiesen bekommen.
' Hinweis:
' Es wird angenommen, dass nur ein gleichzeitig geoeffnetes Formular
' und darin ein Listenfeld mit dem Namen "URLSelector" existiert.
' Als erstes muessen einige Objekt-Variablen vordimensioniert werden:
Dim oForm As Object, oListBox As Object
' Dann muss ein sogenannter Array, d.h. eine Variable mit n Elementen
' vordimensioniert werden. Die folgende Variable "yListEntries" ist ein
' solcher Array und bekommt hier 5 Elemente - Nr.0 bis Nr.4 - bereitgestellt:
Dim aListEntries(4) As String
' Jetzt werden die Elemente des Arrays mit Werten (Dokumenten-Pfade) befuellt:
aListEntries(0) = "C:\Verzeichnis\Datei1.odt"
aListEntries(1) = "C:\Verzeichnis\Datei2.odt"
aListEntries(2) = "C:\Verzeichnis\Datei3.odt"
aListEntries(3) = "C:\Verzeichnis\Datei4.odt"
aListEntries(4) = "C:\Verzeichnis\Datei5.odt"
' Dann werden die notwendigen Objekte bereitgestellt,
' um die Listbox im Formular ansprechen zu koennen:
oForm = ThisComponent.Drawpage.forms(0)
oListBox = oForm.getByName("URLSelector")
' Zum Schluss wird die Listbox mit den oben bereitgestellten Daten gefuellt:
oListBox.StringItemList = yListEntries()
' Bei Bedarf kann man auch noch einen Standard-Eintrag der Listbox einstellen
' Hier wird beispielhaft immer der 3. Listenpunkt (d.h. Array-Nr. 2) vorgewaehlt:
' oListBox.DefaultText = yListEntries(2)
' ... das war's !
End Sub[/code]
Klingt alles schrecklich kompliziert - ist es vielleicht für einen Neuling auch. Meine Beispiele mögen aber vielleicht dazu dienen, sich in die Grundzüge der Makroprogrammierung hinein zu fummeln. Ansonsten verweise ich ausdrücklich nochmals auf entsprechende Tutorials und Wikkis von OpenOffice!
Viel Erfolg!
Gruß: ejomi (der heute keine Lust hat zu arbeiten und stattdessen lieber Romane schreibt)