|
|||
ruby.exe
und rubyw.exe
.
ruby.exe
benutzt man mit der Kommandozeile (eine DOS-Shell), genauso wie in der Unix-Version. Das ist prima bei Applikationen, die vom Standard-In- und Output lesen und schreiben. Es heißt aber auch, dass jedes Mal, wenn man ruby.exe
laufen lässt, eine DOS-Shell erscheint, auch wenn man sie gar nicht haben will --- Windows erzeugt automatisch ein neues Kommandozeilen-Fenster, während Ruby läuft. Das ist manchmal nicht so das passende Verhalten, wenn man etwa auf ein Ruby-Script doppelklickt, das ein graphisches Interface (wie Tk) benutzt, oder wenn man ein RubyScript als Hintergrundprozess von einer anderen Anwendung aus laufen lässt.
In all diesen Fällen wird man dann stattdessen rubyw.exe
nehmen. Das ist genau das gleiche wie ruby.exe
, außer dass es kein Standard-In, kein Standard-Out und kein Standard-Error unterstützt und dass eben keine DOS-Shell gestartet wird.
Man kann auch Dateiverknüpfungen benutzen,[Mit View/Options/Filetypes
bzw Ansicht/Ordneroptionen/Dateitypen
im Explorer.]
so dass Dateien mit der Endung ``.rb
'' automatisch von rubyw.exe
ausgeführt werden. Damit kann man dann mit einem Doppelklick Ruby-Scripts starten, ohne dass das lästige DOS-Fenster aufpoppt.
Win32API
-Erweiterung.
Das Win32API
-Modul wird ab Seite 512 beschrieben, aber hier gibts erstmal einen kleinen Überblick darüber, wie es funktioniert..
Man erzeugt ein Win32API
-Objekt, das den Aufruf eines speziellen DLL-Einstiegspunkts repräsentiert, indem man den Namen der Funktion angibt, den Namen der diese Funktion enthaltenden DLL sowie die Signatur der Funktion (Typen der Argumente und Rückgabetyp). Mit dem erzeugten Objekt kann man dann den Funktionsaufruf realisieren.
Viele dieser Argumente für die DLL-Funktionen sind irgendwelche binäre Strukturen. Diese werden von Win32API
als Ruby-String
-Objekte weitergereicht. Diese muss man notfalls packen und entpacken (siehe das Beispiel auf Seite 512).
WIN32OLE
von Masaki Suketa kann man Ruby als Client für diese Windows Automation einsetzen. Die Beispiele in diesem Abschnitt stammen alle aus dieser WIN32OLE
-Distribution.
Windows Automation gibt einem Automations-Controller (ein Client) die Möglichkeit, Kommandos und Anfragen an einen Automations-Server zu richten, wie etwa Microsoft Excel, Word, Power Point und so weiter.
Man führt eine Methode eines Automations-Servers aus, indem man eine Methode mit dem selben Namen eines WIN32OLE
-Objekts aufruft. Als Beispiel erzeugen wir einen neuen WIN32OLE
-Client, der eine neue Ausführung des Internet-Explorers startet und ihm sagt, die Home-Page zu besuchen.
ie = WIN32OLE.new('InternetExplorer.Application') ie.visible = true ie.gohome |
WIN32OLE
nicht bekannt ist (wie etwa visible
oder gohome
), wird sie an die WIN32OLE#invoke
-Methode weitergereicht, die die passenden Kommandos an den Server sendet. Die Referenz für WIN32OLE
ab Seite 509 beschreibt diese Klasse genauer, aber wir werden hier schon ein paar Einzelheiten behandeln.
Rotation
-Property in einer Excel-Tabelle setzen will, könnte man das so schreiben:
excel = WIN32OLE.new("excel.application") excelchart = excel.Charts.Add() ... excelchart['Rotation'] = 45 puts excelchart['Rotation'] |
WIN32OLE
-Objekts eingerichtet. Das heißt man kann einen Parameter setzen, indem man etwas einem Objekt-Attribut zuweist.
excelchart.rotation = 45 r = excelchart.rotation |
rotation
an Stelle von Rotation
benutzen.
Song(artist, title, length): rem Visual Basic |
Song title := 'Get It On': rem Visual Basic |
Song(nil, 'Get It On', nil)
.
In Ruby kann man das machen, indem man einen Hash mit den benamten Argumenten übergibt.
Song.new( 'title' => 'Get It On' ) |
WIN32OLE
-Objekt eine
each
-Methode (die einen Block erwartet), um genau das selbe zu erreichen.
WIN32OLE
-Excel-Objekt und setzen ein paar Werte ein. Als Nächstes wählen wir einen Bereich von Zellen aus und erzeugen eine Tabelle. Wir setzen das Type
-Property dieses excelchart
-Objekts, um daraus eine 3D-Tabelle zu machen. Dann laufen wir durch diese Tabelle und ändern die Tabellen-Rotation, 10° nacheinander. Wir fügen noch ein paar Einträge hinzu und laufen mit each
einmal durch und drucken das Ganze aus. Am Ende schließen wir die Excel-Applikation und beenden das Programm
require 'win32ole' # -4100 is the value for the Excel constant xl3DColumn. ChartTypeVal = -4100; # Creates OLE object to Excel excel = WIN32OLE.new("excel.application") # Create and rotate the chart excel['Visible'] = TRUE; workbook = excel.Workbooks.Add(); excel.Range("a1")['Value'] = 3; excel.Range("a2")['Value'] = 2; excel.Range("a3")['Value'] = 1; excel.Range("a1:a3").Select(); excelchart = workbook.Charts.Add(); excelchart['Type'] = ChartTypeVal; 30.step(180, 10) do |rot| excelchart['Rotation'] = rot end excelchart2 = workbook.Charts.Add(); excelchart3 = workbook.Charts.Add(); charts = workbook.Charts charts.each { |i| puts i } excel.ActiveWorkbook.Close(0); excel.Quit(); |
WIN32OLE
muss man mit unnötigen dynamischen Zugriffen vorsichtig sein. Wenn möglich sollte man das WIN32OLE
-Objekt einer Variablen zuweisen und darüber auf Elemente referenzieren, statt eine lange Kette von .-Ausdrücken zu erzeugen.
Zum Beispiel sollte man statt zu schreiben
workbook.Worksheets(1).Range("A1").value = 1 workbook.Worksheets(1).Range("A2").value = 2 workbook.Worksheets(1).Range("A3").value = 4 workbook.Worksheets(1).Range("A4").value = 8 |
worksheet = workbook.Worksheets(1) worksheet.Range("A1").value = 1 worksheet.Range("A2").value = 2 worksheet.Range("A3").value = 4 worksheet.Range("A4").value = 8 |