Druckvorschau

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

toni
***
Beiträge: 66
Registriert: Mi, 03.01.2007 10:26

Druckvorschau

Beitrag von toni »

Hallo,

dies ist meine erste Anfrage hier im Forum.
Ich hoffe, ich halte die Regeln ein...
Ich bin dabei, eine VBA-Anwendung in Starbasic um zu schreiben.
Ich möchte u.a. über einen selbst programmierten Button in die Druckvorschau (Seitenansicht) gelangen.
Die scheint in Starbasic nicht ohne weiteres möglich zu sein, da irgendwie die Makros "verloren" gehen.
Mit folgendem Code (aus OOoForum.org) klappt es:

Code: Alles auswählen

Sub Main
   ' Create new empty spreadsheet.
   ' Get document model, controller, and frame.
   oDoc = StarDesktop.loadComponentFromURL( "private:factory/scalc", "_blank", 0, Array() )
   oDocCtrl = oDoc.getCurrentController()
   oDocFrame = oDocCtrl.getFrame()
   
   ' Put some stuff into the spreadsheet to preview
   '  so we have something to look at.
   PutInSomeStuff( oDoc )
   
   ' Now preview the spreadsheet..
   oDispatcher = createUnoService( "com.sun.star.frame.DispatchHelper" )
   oDispatcher.executeDispatch( oDocFrame, ".uno:PrintPreview", "", 0, Array() )
End Sub


Sub PutInSomeStuff( oDoc )
   ' Get first sheet.
   oSheet = oDoc.getSheets().getByIndex( 0 )
   ' Load it with something interesting to look at.
   oSheet.getCellRangeByName( "A1" ).setString( "Month" )
   oSheet.getCellRangeByName( "B1" ).setString( "Sales" )
   oSheet.getCellRangeByName( "A2" ).setString( "Jan" )
   oSheet.getCellRangeByName( "A3" ).setString( "Feb" )
   oSheet.getCellRangeByName( "A4" ).setString( "Mar" )
   oSheet.getCellRangeByName( "A5" ).setString( "Apr" )
   oSheet.getCellRangeByName( "A6" ).setString( "May" )
   oSheet.getCellRangeByName( "A7" ).setString( "Jun" )
   oSheet.getCellRangeByName( "B2" ).setValue( 4509.23 )
   oSheet.getCellRangeByName( "B3" ).setValue( 3705.45 )
   oSheet.getCellRangeByName( "B4" ).setValue( 2941.20 )
   oSheet.getCellRangeByName( "B5" ).setValue( 2132.11 )
   oSheet.getCellRangeByName( "B6" ).setValue( 1445.34 )
   oSheet.getCellRangeByName( "B7" ).setValue( 937.31 )
   
   ' Format some cells as currency.
   ' For a date formatting example, or other calc examples in general
   '  see this....
   '    http://www.oooforum.org/forum/viewtopic.php?t=4996
   oFormats = oDoc.getNumberFormats()
   oLocale = createUnoStruct( "com.sun.star.lang.Locale" )
   nNumKey = oFormats.getStandardFormat( com.sun.star.util.NumberFormat.CURRENCY, oLocale )
   oCell = oSheet.getCellRangeByName( "B2:B7" )
   oCell.NumberFormat = nNumKey
End Sub
Allerdings wird hier zunächst eine neue Datei erzeugt, dies ist nicht in meinem Sinne.
Wenn ich die Zeile:

Code: Alles auswählen

   oDoc = StarDesktop.loadComponentFromURL( "private:factory/scalc", "_blank", 0, Array() )
durch

Code: Alles auswählen

oDoc = ThisComponent
ersetze, komme ich zwar auch in die Seitenansicht, aber irgendetwas geht nebenbei den Bach runter. In der IDE bin ich plötzlich in "Meine Makros" und der ursprüngliche Quellcode ist verschwunden.

In VBA mache ich das übrigens mit .PrintPreview .

Würde mich freuen, wenn mir jemand weiter helfen könnte.

Ciao

Thomas
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey Thomas,

hmm, eigentlich ganz einfach: Lass den Makrorekorder laufen, der nimmt den folgenden Code auf (verkürzt):

Code: Alles auswählen

sub AnsichtWechseln
  document   = ThisComponent.CurrentController.Frame
  dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
  dispatcher.executeDispatch(document, ".uno:PrintPreview", "", 0, Array())
end sub
Tia, und der funktioniert - zumindest bei mir (OOo 2.1)
Das Makro weist du nun dem Button zu - fertig.

OK, der Rekorder ist sich unsicher und kommentiert die letzte Zeile aus - nimmst du das REM weg, ist alles OK.

Im Grunde hast du den Code ja auch selbst. Aber etwas habe ich nicht verstanden: Was machst du in der IDE? Wo hattest du den Code vorher gespeichert? Und wieso "weg"? Den Teil versteh ich nicht.

Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
toni
***
Beiträge: 66
Registriert: Mi, 03.01.2007 10:26

Beitrag von toni »

Hallo Toxitom,

der Code funktioniert bei mir auch einmal.
Ich gehe folgendermaßen vor:

Ich öffne ein neues Calc-Dokument (Version 2.0).
Ich erstelle in der Entwicklungsumgebung ein neues Modul in der zum Dokument gehörigen Standard-Bibliothek und speicher den Code dort ab. Dann erstelle ich einen Button und weise die Sub zu.
Betätige ich dann den Button, gelange ich dann auch in die Seitenansicht. Soweit so gut.
Betätige ich den Button aber ein zweites mal, kommt die Fehlermeldung:

Ein Scripting Framework Fehler trat während der Ausführung von Basic script vnd.sun.star.script:Standard.Module1.AnsichtWechseln?.... auf
Meldung: BasicProviderImpl::getScript: no script!

Wenn ich die Sub aus der Entwicklungsumgebung heraus starte sieht man, dass im Fenster 'aktuelle Bibliothek' die Bibliothek wechselt:

Also, wenn ich den grünen Pfeil anklicke und die Sub ausführe, wechselt die aktuelle Bibliothek:
Vorher war ich in der Bibliothek [test.ods].Standard, danach lande ich in [Meine Makros&Dialoge].Standard.

Wenn ich den Code gleich in [Meine Makros&Dialoge].Standard ab speicher gibt es keine Probleme, aber das kann ja nicht Sinn der Sache sein, oder?

Gruss

Toni
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey Toni,

hmm, das ist lustig....

Nein, so sollte es nicht sein und (bie mir) ist es auch nicht so. Da ist wohl etwas anderes "korrupt"
Welches BS und welche OOo Version nutzt du exakt? Wirklich die 2.0.0? Dann solltest du dringend "updaten", es gab schon die 2.0.1, 2.0.2, 2.0.3., 2.0.4 und aktuell die 2.1. Die ursprüngliche 2.0.0 hatte noch so einige Bugs, unter anderem im ScriptingBereich.
Kannst du überhaupt ein Makro in der Standard-Bibliothek eines Calc-dokumentes abspeicheren (in einem Modul) , dieses dann schliessen, OOo schliessen, OOo wieder öffnen und das Dokument auch, und ist das Makro (Bibliothek und Modul) dann noch da?

GRuss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
toni
***
Beiträge: 66
Registriert: Mi, 03.01.2007 10:26

Druckvorschau

Beitrag von toni »

Hallo Thomas,

vielen Dank.

Mit der 2.1er Version klappt es tatsächlich.

Wäre trotzdem schön, wenn du dich mal melden könntest (siehe Email).

Gruss

Toni
Antworten