Oh, sorry. This should not be a surprise, as it's the same in Java which is
the language I usually code in. I guess some "Rubber Ducking" (Ref. The
Pragmatic Programmer) would have solved my problem :-)

@ndr?

"Lyle Johnson" <jlj / cfdrc.com> wrote in message
news:XCSD8.68916$To6.21894691 / e420r-atl1.usenetserver.com...
> > I am writing my first Ruby program, which is a small GUI application,
> > based on the Fox library. The GUI is quite simple, consisting of one
> > list (FXList) which I want to add items, which again has two
> > properties, name and password, and a few buttons. The items are
> > implemented as a simple class Entry which extends FXListItem:
> >
> > class Entry < FXListItem
> >
> >   def initialize(name, password)
> >     @name = name
> >     @password = scramble(password)
> >   end
> >
> >   def scramble(password)
> >     # This method will be more sofisticated in next iteration :-)
> >     password.reverse
> >   end
> >
> >   def unscramble()
> >     @password.reverse
> >   end
> >
> >   def to_s
> >     "Name: " + @name + ", Password: " + @password
> >   end
> > end
> >
> > When trying to add instances of this class to an FXList using the
> > appendItem method, I get into trouble. Here is the offending code:
> >
> >     ...
> >     @list = FXList.new(self, 10, nil, 0, LIST_SINGLESELECT |
> > LAYOUT_FILL_X)
> >     item = Entry.new("xx", "yy")
> >     @list.appendItem(item)  # This line causes the error
> >     ...
> >
> > and here is the error message I receive:
> >
> > c:/dev/ruby/lib/ruby/site_ruby/1.6/fox/overloads.rb:164:in
> > `appendItem1': This FXListItem * already released (RuntimeError)
> >         from c:/dev/ruby/lib/ruby/site_ruby/1.6/fox/overloads.rb:164:in
> > `appendItem'
> >         from PwdMgr.rb:71:in `initialize'
> >         from PwdMgr.rb:100:in `new'
> >         from PwdMgr.rb:100:in `run'
> >         from PwdMgr.rb:109
>
> You need to always be sure to call the base class initialize method when
> deriving new classes from FOX classes. In your case, you failed to call
> FXListItem#initialize in your Entry#initialize method and so it never
> initialized the base class portion of this object. Try this for
> Entry#initialize instead:
>
>     class Entry < FXListItem
>
>         def initialize(name, password)
>             super("item text here") # calls FXListItem#initialize
>             @name = name
>             @password = scramble(password)
>         end
>
>         # other stuff as before
>     end
>
> > I also have tried to test the item variable using the
> > item.instance_of?(FXListItem) method, and it returns false, so I guess
> > I have got something wrong in my understanding of Ruby and
> > inheritance.
>
> Since it never got a chance to initialize the base class part you ended up
> with a nil reference. After making the fix described above,
> Entry#kind_of?(FXListItem) or Entry#is_a?(FXListItem) should return true.
> Note that Entry#instance_of?(FXListItem) will not (and should not) return
> true, however; Object#instance_of? only returns true if the receiver is an
> instance of the specified class (not one of its subclasses).
>
> > The C++ API doc says the following about appendItem: (Can't find a
> > Ruby version of the API doc. Does it exist?)
>
> I am slowly building up a set of RDoc-style source files from which I can
> generate more Ruby-friendly documentation, but for the time being the C++
> API is still your best source.
>
> > FXint appendItem(FXListItem* item, FXbool notify=FALSE)
> > Append a [possibly subclassed] item to the list
> >
> > Can anyone tell me what I am doing wrong here?
>
> Your call to FXList#appendItem was perfectly fine. The error message was,
> unfortunately, not very helpful (other than telling you that something was
> wrong with the list item itself).
>
> Hope this helps,
>
> Lyle
>
>
>