Ruby-Programmierung: Bibliotheken

Aus Wikibooks

Zurück zu Ruby-Programmierung Hauptmenü

Programmieren mit REXML-Modul[Bearbeiten]

REXML ist ein in reinem Ruby Code geschriebener XML-Parser.

Übersicht und Gebrauch des REXML-Moduls[Bearbeiten]

Laden des Moduls wird in Ruby mit require "rexml/document" eingeleitet.

Damit wird der Namensraum REXML:: erzeugt.

Einlesen einer XML-Datei
# Laden des REXML-Modul document
require "rexml/document"

# Eine XML-Datei laden
file = File.new( "eineXMLDatei.xml" )

# XML-Datei in eine Variable speichern
doc = REXML::Document.new file

# Ausgabe der XML-Datei
puts doc.to_s
Erzeugen einer XML-Datei
require "rexml/document"
# File-Objekt erzeugen
file = File.new( "make.xml","w" )

# Variable für Erzeugung der XML-Datei zur Verfügung stellen
doc = REXML::Document.new

# XML-Decleration erzeugen und übergeben
doc << REXML::XMLDecl.new(1.0, "ISO-8859-1", "no")

# Root-Tag erzeugen und anhängen
doc.add_element(REXML::Element.new("root"))

# Root-Tag-Attribut erzeugen und anhängen
doc.root.attributes["Attr1"] = "wert1"

# Root Tag Attribut erzeugen und anhängen
doc.root.attributes["Attr2"] = 5

# Variable mit Tag definieren
e = REXML::Element.new( "eintrag")

# Variable mit Wert belegen
e.add_text REXML::Text.new(' bar2')

# An Variable für Erzeugung XML-Datei übergeben
doc.root.add_element(e)
e = REXML::Element.new( "eintrag")
e.add_text REXML::Text.new(' bar')

# Für Variable Attribut erzeugen und anhängen
e.attributes["Attr1"] = 23
doc.root.add_element(e)
e = REXML::Element.new( "eintrag")
e.add_text REXML::Text.new('1 Text ')
e.add_text REXML::Text.new('2 Text ')
e.attributes["c1c"] = 23
doc.root.add_element(e)
e = REXML::Element.new("eintrag")
e.add_text REXML::Text.new('1 Text ')
e.add_text REXML::Text.new('2 Text ')
e.attributes["c1c"] = 23

# Überschreibt 1 Text
e.text = "noch ein Text "
doc.root.add_element(e)

# Einhängen von Tags vor 1. Tag
doc.root[0,0] = REXML::Element.new "davor"
doc.root[0,0] = REXML::Element.new "davor1"

# Ausgabe auf Konsole
doc.write( $stdout, 0 )

# In Datei schreiben
file << doc

# Datei schliessen
file.close
Aussehen der erzeugten XML-Datei
<?xml version='1.0' encoding='ISO-8859-1' standalone='no'?> 
<root Attr1='wert1' Attr2='5'> 
  <davor1/> 
  <davor/> 
  <eintrag> bar2</eintrag> 
  <eintrag Attr1='23'> bar</eintrag> 
  <eintrag c1c='23'>1 Text 2 Text </eintrag> 
  <eintrag c1c='23'>noch ein Text 2 Text </eintrag> 
</root> 

Programmieren mit WXRUBY Modul[Bearbeiten]

Übersicht und Gebrauch des wxRUBY 2 - Moduls[Bearbeiten]

Laden des Moduls wird in Ruby mit

begin
  require 'wx'
rescue LoadError => no_wx_err
  begin
    require 'rubygems'
    require 'wx'
  rescue LoadError
    raise no_wx_err
  end
end

eingeleitet.

Einfaches Fenster:

class Fenster < Wx::Frame
  def initialize(title, pos, size, style = Wx::DEFAULT_FRAME_STYLE)
    super(nil, -1, title, pos, size, style)

    #Durch die Verwendung des Schlüsselwortes super kann man
    #Methoden und den Konstruktor der Wx::Frame Klasse aufrufen

    if Wx::PLATFORM == "WXMSW"
      set_icon( Wx::Icon.new(local_icon_file("mondrian.ico"), 
                             Wx::BITMAP_TYPE_ICO) )
    else
      set_icon( Wx::Icon.new(local_icon_file("mondrian.xpm"), 
                             Wx::BITMAP_TYPE_XPM) )
    end

    menu_file = Wx::Menu.new()
    menu_help = Wx::Menu.new()
   
    menu_help.append(Wx::ID_ABOUT, "&About\tF1")
    menu_file.append(Wx::ID_EXIT, "E&xit\tAlt-X")
    menu_bar = Wx::MenuBar.new()
    menu_bar.append(menu_file, "&File")
    menu_bar.append(menu_help, "&Help")
    
    set_menu_bar(menu_bar)

    create_status_bar(2)
    set_status_text("einfaches Fenster mit wxRuby!")

    # Verbindung events mit def Funktionen
    # der Übersicht wegen in Funktion ausgelagert

    evt_menu(Wx::ID_EXIT) { on_quit }
    evt_menu(Wx::ID_ABOUT) { on_about }
  end

  #def Funktionen der events
 
  def on_quit
    close()
  end

  
  def on_about
    msg =  sprintf("Dialogfenster.\n" \
                   "mit wxRuby Version %s", Wx::WXRUBY_VERSION)

    
    about_dlg = Wx::MessageDialog.new( self, msg, 'Einfaches Fenster',
                                       Wx::OK|Wx::ICON_INFORMATION )
    about_dlg.show_modal()
	about_dlg.destroy()
  end

  
  def local_icon_file(icon_name)
    File.join( File.dirname(__FILE__), icon_name) 
  end
end

#Wx::App ist für alle wxruby vorgeschrieben ein Vererbung
#stellt dadurch alle Methoden(Funktion) zur Verfügung

class Fensterclass < Wx::App
  def on_init
    frame = Fenster.new("Minimal wxRuby App",
                             Wx::Point.new(50, 50), 
                             Wx::Size.new(450, 340))
   
    frame.show()
  end
  
  
end

#Nun starten der wxruby Anwendung

app = Fensterclass.new

app.main_loop()

Programmieren mit FOX-Modul[Bearbeiten]

Übersicht und Gebrauch des fox16 - Moduls[Bearbeiten]

Aufgabe des Programms überprüfen des EAN Code an einem Beispiel einer Getränkeflasche

5449000017956 hier ist die Prüfziffer 6 Okay wenn nicht wird richtige Ziffer angezeigt

require 'fox16'
#include Fox #einfügen wenn Namespace nicht mit angeben werden soll
class EanPruefziffer
  def initialize(ean=nil,le=nil)
    if ean 
      @ean=ean
      if ean =~/[a..zA..ZäöüÄÖÜß]/ or ean.size==0 or ean.size != le
        STDERR.print "Argument unzulaessig"
        @erg="Eingabe unzulaessig"
        #exit(-1)
      else
        if @ean[-1]-48 == pruef(le)
          @erg="Pruefziffer ist korrekt"
          # exit(0)
        else
          STDERR.print "Pruefsummenfehler"
          @erg="Pruefsummenfehler #{pruef(le)}"
          #exit(1)
        end #if
      end #if 
    else
      STDERR.print "Fehler\n#{__FILE__ } String oder\n#{__FILE__ } -l n [String]\n" 
    end
  end #def initialize
  def text()
    @erg
  end #def text
  def pruef(opt=13)
    summe=0
    pruefziffer=0
    @ean[0..(opt-2)].each_byte {|s| 
              pruefziffer=pruefziffer + (s.to_i - 48) * ( 1 +( summe%2 )* 2) 
              summe +=  1 
              }
    (10- (pruefziffer%10))
  end #def pruef
end #class EanPruefziffer

Klassen definiert so das alle Buttons gleich sind und nur das übergeben was den unterschied zwischen Button ausmacht

class Button < Fox::FXButton
  def initialize(main,text)
    super(main,text,nil,nil,0,Fox::BUTTON_NORMAL|Fox::LAYOUT_FIX_WIDTH,10,10,150,50,10,10,10,10)
    self.font =Fox::FXFont.new(getApp(),"Arial Black", 15,Fox::FONTWEIGHT_BOLD)
  end #def initialize
end #class Button
class Label < Fox::FXLabel
  def initialize(main,text)
  #|Fox::LAYOUT_FIX_WIDTH
  super(main,text,nil,Fox::LABEL_NORMAL|Fox::JUSTIFY_CENTER_X,10,10,300,50,10,10,10,10)
  self.font =Fox::FXFont.new(getApp(), "Arial Black", 15,Fox::FONTWEIGHT_BOLD)
  end #def initialize
end #class Label
class Text < Fox::FXTextField
  def initialize(main)
    #|Fox::JUSTIFY_CENTER_X|Fox::LAYOUT_FIX_WIDTH
    super(main,13,nil,0,Fox::TEXTFIELD_NORMAL,0,0,100,50,10,10,10,10)
    self.font =Fox::FXFont.new(getApp(), "Arial Black", 15,Fox::FONTWEIGHT_BOLD)
  end #def initialize
end #class Text
class RadioButton < Fox::FXRadioButton
  def initialize(gp,text,gp_datatarget,zahl)
    super(gp, text , gp_datatarget, Fox::FXDataTarget::ID_OPTION+zahl,
      Fox::ICON_BEFORE_TEXT|Fox::LAYOUT_SIDE_TOP)
    self.font =Fox::FXFont.new(app, "Arial Black", 10,Fox::FONTWEIGHT_BOLD)
  end #def initialize
end #class RadioButton
app = Fox::FXApp.new
main = Fox::FXMainWindow.new(app, "EAN TOOL" ,nil,nil,Fox::DECOR_ALL,0,0,400,400,20,20,20,20)
label1=Label.new(main,"EAN Pruefziffer")
textfeld=Text.new(main)
label2=Label.new(main,"EAN 13 Code eingeben")
button1=Button.new(main,"Pruefen")
button1.connect(Fox::SEL_COMMAND) do |sender, sel, checked| 
       label2.text=EanPruefziffer.new(textfeld.text.to_s,textfeld.numColumns).text()
      end # do self

    gp_data = Fox::FXDataTarget.new(1)
    gp = Fox::FXGroupBox.new(main, "Auswahl Code",Fox::LAYOUT_SIDE_TOP|Fox::FRAME_GROOVE|Fox::LAYOUT_FIX_WIDTH|Fox::LAYOUT_FILL_X, 0, 0,200,200,10,10,10,10)
    RadioButton.new(gp, "EAN  8", gp_data,0)
    RadioButton.new(gp, "EAN 13", gp_data,1)
    RadioButton.new(gp, "EAN 14", gp_data,2)
    RadioButton.new(gp, "NVE 18", gp_data,3)
    gp.font =Fox::FXFont.new(app, "Arial Black", 15,Fox::FONTWEIGHT_BOLD)
    gp_data.connect(Fox::SEL_COMMAND) do
      case gp_data.value
        when 0
          textfeld.numColumns=8
          textfeld.text=""
          label2.text="EAN 8 Code eingeben"
        when 1
          textfeld.numColumns=13
          textfeld.text=""
          label2.text="EAN 13 Code eingeben"
        when 2
          textfeld.numColumns=14
          textfeld.text=""
          label2.text="EAN 14 Code eingeben"
        when 3
          textfeld.numColumns=18
          textfeld.text=""
          label2.text="NVE 18 Code eingeben"
      end# case
    end#connect
    textfeld.connect(Fox::SEL_KEYPRESS) do|sender, sel, item| 
      if item.code >= 48 and item.code <=57
        if textfeld.cursorPos<textfeld.numColumns
          textfeld.text+=item.code.chr
        end #if 
      else
        STDOUT.print "erg #{item.code}"
        STDOUT.flush()
        case item.code
          when 65288 #Rücktab
            textfeld.text=textfeld.text[0..-2]
          when 65293 #Return
            label2.text=EanPruefziffer.new(textfeld.text.to_s,textfeld.numColumns).text()
        end #case
      end #if 
    end #conect
app.create
main.show(Fox::PLACEMENT_SCREEN)
app.run