Programmering i Ruby

Den Pragmatiske Programmerers Veiledning

Forrige < Innhold ^
Neste >

Ruby og Microsoft Windows



Ruby er skrevet for Posix-miljø, som betyr at den kan dra fordel av alle systemkall og biblioteker som Unix-programmerere er kjent med.

Men det er et stort antall egenskaper og ekstensjoner designet for å gjøre Ruby mer nyttig i et Microsoft Windows-miljø også. I dette kapitlet vil vi se på disse egenskapene og dele noen hemmeligheter for å bruke Ruby effektivit under Windows.

Ruby Ports

Windows har ikke et Posix-miljø selv, så noen type emulerings-bibliotek er påkrevd for å gi de nødvendige funksjonene. Det er flere ports av Ruby for Windows: den mest brukte er den som støtter seg på GNU Win32-miljøet, og blir kalt "cygwin32"-porten. Cygwin32-porten virker bra med ekstensjons-biblioteker,og er tilgjengelig på nettet som en pre-kompilert binær-fil. En annen port, "mswin32", støtter seg ikke på cygwin. Den er for tiden bare tilgjengelig som kildekode. Det gjenstående av dette kapittelet vil referere til cygwin32-porten.

Kjøre Ruby under Windows

Det er to kjørefiler med cygwin32-Ruby-distribusjonen: ruby.exe og rubyw.exe.

ruby.exe er ment til å bli brukt fra kommandolinjen i Unix(DOS-skall). For applikasjoner som leser og skriver til standard input og output, er dette fint. Men det betyr også at hver gang du kjører ruby.exe, vil du få et DOS-skall selv om du ikke vil ha et---Windows vil lage et nytt kommandovindu og vise det mens Ruby kjører. Dette er kanskje ikke rette oppførsel hvis, for eksempel, du dobbelklikker på et Ruby-skript som bruker et grafisk grensesnitt (slik som Tk), eller hvis du kjører et Ruby-skript som bakgrunnsoppgave, eller inne i et annet program.

I disse tilfellene kan du bruke rubyw.exe. Dette er det samme som ruby.exe, men den hverken angir ikke standard inn, standard ut, eller standard feil, eller setter igang et DOS-skall når den kjøres.

Du kan sette fil-assosiasjoner[ ved å bruke View/Options/Filetypes i Explorer.] slik at filer med endelsen ".rb" will automatisk bruke rubyw.exe. Ved å gjøre dette kan du dobbelklikke på Ruby-skript og de vil ganske enkelt kjøre uten at et DOS-vindu dukker opp.

Win32API

Hvis du planlegger å utføre Ruby-programmering som trenger direkte tilgang til noen Windows 32 API-funksjoner, eller å bruke inngangspunkter i noen andre DLL-er, så har vi gode nyheter til deg---Win32API-utvidelsen.

Win32API-modulen er dokumentert fra side 508, men her er et raskt overblikk over dens funksjonalitet.

Du lager et Win32API-objekt som representerer et kall til et spesielt DLL-inngangspunkt ved å spesifisere navnet på funksjonen, navnet på DLL-en som inneholder funksjonen, og funksjons-signaturen(argumenttypen og returtypen). Det resulterende ojektet kan benyttes til å utføre funksjonskallet.

Mange av argumentene til DLL-funksjoner er binære strukturer i en eller annen form. Win32API-objektet håndterer dette ved å bruke Ruby String-objekter til å sende de binære dataene fram og tilbake. Du vil trenge å pakke inn og ut disse strengene når det er nødvendig (se eksempelet på side 508).

Automatisering i Windows

Hvis det å kravle rundt i Windows sin lavnivå API ikke interesserer deg, så kan kanskje Windows-automatisering gjøre det---du kan bruke Ruby som en klient for Windows-automatisering takket være en Ruby-utvidelsen som heter WIN32OLE, skrevet av Masaki Suketa. Eksemplene i denne seksjonen er tatt fra de som er i WIN32OLE distribution.c

Windows-automatisering tillater en automatiseringskontroller (en klient) til å sende kommandoer og spørringer mot en automatiseringsserver, slik som Microsoft Excel, Word, PowerPoint, o.s.v.

Du kan kalle en metode til en automatiseringsserver ved å kalle en metode med det samme navnet fra et WIN32OLE-objekt. For eksempel kan du lage en ny WIN32OLE-klient som starter en ny kopi av Internet Explorer og kommanderer den til å besøke hjemmesiden.

ie = WIN32OLE.new('InternetExplorer.Application')
ie.visible = true
ie.gohome

Metoder som ikke er kjent for WIN32OLE (slik som visible eller gohome)blir sendt til WIN32OLE#invoke-metoden, som sender de rette kommandoene til serveren.WIN32OLE-referansen som begynner på side 505 beskriver klassen i detalj, men vi vil gå over et par av dens særtrekk her.

Hente og sette egenskaper

Du kan sette og hente properties fra serveren ved å bruke normal Ruby hash-notasjon. For eksempel, for å sette Rotation-egenskapen til en Excel-graf kan du skrive

excel = WIN32OLE.new("excel.application")
excelchart = excel.Charts.Add()
...
excelchart['Rotation'] = 45
puts excelchart['Rotation']

Parameterne til et OLE objekt blir automatisk satt opp som atrributer til WIN32OLE-objektet. Det betyr at du kan sette en parameter ved å tilordne til en objektattributt.

excelchart.rotation = 45
r = excelchart.rotation

Fordi disse attributtene er vanlige Ruby aksessor-metoder, kan ikke attributtnavnene starte med en stor bokstav. I dette eksemplet må vi bruke rotation istedenfor Rotation.

Navngitte argumenter

Andre automatiseringsspråk for klienter som Visual Basic har konseptet med navngitte argumenter. Anta at du hadde en Visual Basic-rutine med signaturen:

Song(artist, title, length):    rem Visual Basic

Istedet for å kalle det med alle 3 argumeter i rekkefølgen som er spesifisert, kan du bruke navngitte argumenter.

Song title := 'Get It On':      rem Visual Basic

Dette tilsvarer kallet Song(nil, 'Get It On', nil).

I Ruby kan du bruke denne egenskapen til å sende en hash med de navngitte argumentene.

Song.new( 'title' => 'Get It On' )

for each

Hvor Visual Basic har et "for each"-utsagn for å iterere over en samling av elementer i en server, har WIN32OLE-objektet en each-metode (som tar en blokk) for å gjøre den samme tingen.

Et eksempel

Det følgende eksempelet bruker Microsoft Excel for å illustrere mesteparten av disse konseptene. Først så lager vi et nytt WIN32OLE-objekt tilknyttet Excel og setter noen celle-verdier. Så velger vi en område av celler og lager en graf. Vi setter Type-egenskapen i excelchart-objektet for å gjøre det om til en 3D-graf. Så lager vi en løkke for å gå igjennom og forandre graf-rotasjonen, 10° hver gang. Vi legger til noen få grafer, og så bruker vi each for å gå igjennom og skrive dem ut. Til slutt kan vi lukke Excel-applikasjonen og avslutte.

require 'win32ole'

# -4100 er verdien til Excel-konstanten xl3DColumn. ChartTypeVal = -4100;

# Lager OLE-objekt for Excel excel = WIN32OLE.new("excel.application")

# Lag og roter grafen

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();

Optimalisering

Som med de fleste (hvis ikke alle) høynivå-språk kan de være alt for lett å kverne ut kode som er altfor treg, men det kan enkelt fikses med litt tankevirksomhet.

Med WIN32OLE, trenger du å være forsiktig med unødvendige dynamiske oppslag. Hvis mulig, er det bedre å tildele et WIN32OLE-objekt til en variabel og så referere elementer fra det, enn å lage en lang kjede med "."-uttrykk.

For eksempel, istedenfor å skrive:

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

kan vi eliminere de vanlige sub-uttrykkene ved å lagre den første delen av uttrykket til en temporær variabel og så lage kall fra den variabelen:

worksheet = workbook.Worksheets(1)

worksheet.Range("A1").value = 1 worksheet.Range("A2").value = 2 worksheet.Range("A3").value = 4 worksheet.Range("A4").value = 8

( In progress translation to Norwegian by NorwayRUG. $Revision: 1.7 $ )
$Log: win32.xml,v $
Revision 1.7  2002/11/30 20:28:55  kent
Små kosmetiske endringer. Ikke rørt "port" ennå.

Revision 1.6  2002/10/31 13:22:38  kent
Lenke Win32 kapittelet inn i index.xml


Forrige < Innhold ^
Neste >

Extracted from the book "Programming Ruby - The Pragmatic Programmer's Guide".
Translation to norwegian by Norway Ruby User Group.
Copyright for the english original authored by David Thomas and Andrew Hunt:
Copyright © 2001 Addison Wesley Longman, Inc.
This material may be distributed only subject to the terms and conditions set forth in the Open Publication License, v1.0 or later (the latest version is presently available at
http://www.opencontent.org/openpub/).

(Please note that the license for the original has changed from the above. The above is the license of the original version that was used as a foundation for the translation efforts.)

Copyright for the norwegian translation:
Copyright © 2002 Norway Ruby User Group.
This material may be distributed only subject to the terms and conditions set forth in the Open Publication License, v1.0 or later (the latest version is presently available at
http://www.opencontent.org/openpub/).
Distribution of substantively modified versions of this document is prohibited without the explicit permission of the copyright holder.
Distribution of the work or derivative of the work in any standard (paper) book form is prohibited unless prior permission is obtained from the copyright holder.