------art_24443_11281700.1140567371701
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

Here's some more fun - an alternate way to initialize properties. Now if
only I could get rid of the argument to the block:

# begin code

Form.class_eval do
  def initialize(*args, &blk)
    super
    unless blk.nil?
      blk.call(self)
    end
  end
end


class MainForm
  attr_accessor :form

  def initialize
    @form  = Form.new do |f|
      f.FormBorderStyle = FormBorderStyle::Sizable
      f.SizeGripStyle = SizeGripStyle::Show
      f.StartPosition = FormStartPosition::CenterScreen
      f.Text = "Initialize From Block!"
      f.Size = Size.new(220, 200)
    end
  end
end

Application.Run(MainForm.new.form)


On 2/21/06, m4dc4p <jgbailey / gmail.com> wrote:
>
> This is a great step forward. I've done a lot of Windows Forms work and
> ..NET has a really good UI layer for working with. What's more, it has
> *fantastic* documentation. I tried to learn Tcl/Tk but the challenge of
> translating from Perl and learning a new tool kit at the same time was
> too much. This is just what I wanted to write Ruby GUI apps.
>
> Anyways, I banged together a little 'Google Calculator' program that
> uses Google's calcuator service for evaluating expressions. Sounds
> trivial until you need to divide miles by fortnights or similar (try
> it!).
>
> Heres the code - just copy it into the same directory with the
> rubyclr.rb file and the RbDynamicMethod.dll:
>
>
> # RSS Reader sample application
> # (C)Copyright 2006 John Lam
>
> # BUG: crashes on dave winer's feed http://www.scripting.com/rss.xml -
> bug in rss feed reader
>
> require 'rubyclr'
>
> RubyClr::reference 'System'
> RubyClr::reference 'System.Drawing'
> RubyClr::reference 'System.Windows.Forms'
>
> include System::Drawing
> include System::Drawing::Drawing2D
> include System::Windows::Forms
>
>
> require 'open-uri'
> require 'cgi'
>
> class GoogleCalc
>
>   def self.calc(expr)
>     open(("http://www.google.com/search?q=#{CGI.escape(expr.strip)}"))
> do |f|
>       if f.status.include? "200"
>         begin
>           matches = MATCH_EXP.match(f.read)
>           return result_format(matches[2])
>         rescue NoMethodError
>          return "==> Expression not understood."
>         rescue Exception
>          return "==> Expression not understood. (#{$!.class.inspect},
> #{$!.inspect})"
>         end
>       else
>         return "==> Response error: #{f.status.inspect}"
>       end
>     end
>   end
>
> private
>
>   MATCH_EXP = Regexp.new("<td><img
> src=/images/calc_img.gif></td><td>&nbsp;</td><td nowrap>(.*?) =
> (.*?)</b>")
>
>   def self.result_format(s)
>     s.gsub("<font size=-2>
> </font>",",").gsub("&#215;","x").gsub("<sup>","^").gsub("</sup>", "")
>   end
>
>
> end
>
> class MainForm
>   attr_accessor :form
>
>   def initialize
>     form = Form.new
>     form.FormBorderStyle =  FormBorderStyle::Sizable
>     form.SizeGripStyle = SizeGripStyle::Show
>     form.StartPosition = FormStartPosition::CenterScreen
>     form.Text = "Google Calculator"
>     form.Size = Size.new(220, 200)
>
>     expressionGroupBox = GroupBox.new
>     expressionGroupBox.Dock = DockStyle::Top
>     expressionGroupBox.Width = 215
>     expressionGroupBox.Height = 50
>     expressionGroupBox.Text = "Expression"
>
>     expressionTextBox = TextBox.new
>     expressionTextBox.Location = Point.new(5, 20)
>     expressionTextBox.Size = Size.new(125, 21)
>     expressionTextBox.Anchor = AnchorStyles::Left | AnchorStyles::Top |
> AnchorStyles::Right
>
>     calcButton = Button.new
>     calcButton.Size = Size.new(75, 23)
>     calcButton.Location = Point.new(135, 19)
>     calcButton.Text = "Calculate"
>     calcButton.Anchor = AnchorStyles::Right | AnchorStyles::Top
>     calcButton.Enabled = false
>
>     expressionGroupBox.Controls.Add(expressionTextBox)
>     expressionGroupBox.Controls.Add(calcButton)
>
>     resultGroupBox = GroupBox.new
>     resultGroupBox.Dock = DockStyle::Fill
>     resultGroupBox.Text = "Results"
>     resultGroupBox.Size = Size.new(100, 100)
>
>     resultTextBox = TextBox.new
>     resultTextBox.Location = Point.new(5, 20)
>     resultTextBox.Size = Size.new(90, 75)
>     resultTextBox.Anchor = AnchorStyles::Right | AnchorStyles::Top |
> AnchorStyles::Left | AnchorStyles::Bottom
>     resultTextBox.Multiline = true
>     resultTextBox.ReadOnly = true
>     # resultTextBox.BorderStyle = BorderStyle::None
>     #resultTextBox.ForeColor = Color.Black
>     #resultTextBox.BackColor = Color.White
>
>     expressionTextBox.TextChanged do |sender, args|
>       calcButton.Enabled = (expressionTextBox.Text.strip != "")
>     end
>
>     calcButton.Click do |sender, args|
>       begin
>         calcButton.Text = "Working ..."
>         calcButton.Enabled = false
>         resultTextBox.Text = GoogleCalc.calc(expressionTextBox.Text)
>       rescue Exception
>         resultTextBox.Text = "==> Error occurrred: $!.message"
>       ensure
>         calcButton.Text = "Calculate"
>         calcButton.Enabled = true
>       end
>     end
>
>     resultGroupBox.Controls.Add(resultTextBox)
>
>     form.Controls.Add(resultGroupBox)
>     form.Controls.Add(expressionGroupBox)
>     form.PerformLayout
>     @form = form
>   end
> end
>
> Application.EnableVisualStyles
> Application.SetCompatibleTextRenderingDefault false
> Application.Run(MainForm.new.form)
>
>
>
> John Lam wrote:
> > This is a much more complete drop of the bridge:
> > http://www.iunknown.com/articles/2006/02/20/second-drop-of-rubyclr
> >
> > To show off its features, I've built a non-trivial all-Ruby Windows
> Forms
> > 2.0 RSS Reader application that's in the distribution. It's been tested
> with
> > the RTM bits of .NET FX 2.0, and Ruby 1.8.2.
> >
> > Comments & questions more than welcome!
> >
> > Cheers,
> > -John
> > http://www.iunknown.com
> >
> > ------=_Part_9676_7336074.1140486137995--
>
>
>

------art_24443_11281700.1140567371701--