[fxruby-users] Adding / Deleting controls dynamically

Philippe Lang philippe.lang at attiksystem.ch
Mon Apr 19 05:55:48 EDT 2010


Hi,

Thanks Joey, your solution works fine.

But there is something strange when deleting children of an FXScrollWindow: it always ends up with a SEGMENTION FAULT on my computer. Does anyone have the same problem? You can use the test code below: clicking on the "remove scroll_frame children" button crashes the application. The other 2 buttons work correctly.

I suspect a bug in FXRuby of Fox...

My config: Windows XP, Ruby 1.8.6 patch level 111, patched FXRuby 1.6.19.

-------------------------------------------------------------

#!/usr/bin/ruby

require 'fox16'

include Fox

class MyWindow < FXMainWindow
    
  def initialize(app)
    super(app, "Window", nil, nil, DECOR_ALL, 0, 0, 400, 150)
    
    stack_frame = FXVerticalFrame.new(self, FRAME_NONE|LAYOUT_FILL_X|LAYOUT_FILL_Y)
    scroll_frame = FXScrollWindow.new(stack_frame, LAYOUT_FILL_X|LAYOUT_FILL_Y|LAYOUT_SIDE_TOP)
    matrix_frame = FXMatrix.new(scroll_frame, 10, MATRIX_BY_COLUMNS|LAYOUT_FILL_X|LAYOUT_FILL_Y)
    
    (1..17).each do
      FXButton.new(matrix_frame, "button")
    end
    
    # Bottom frame for buttons
    button_frame = FXVerticalFrame.new(stack_frame, FRAME_NONE|LAYOUT_FILL_X)
    
    # Removes all children from stack_frame container: OK
    FXButton.new(button_frame, "remove stack_frame children").connect(SEL_COMMAND) do |sender, selector, data|
      stack_frame.each_child do |child|
        stack_frame.removeChild(child)
      end
      stack_frame.recalc
    end
    
    # Removes all children from stack_frame container: SEGMENTATION FAULT
    FXButton.new(button_frame, "remove scroll_frame children").connect(SEL_COMMAND) do |sender, selector, data|
      scroll_frame.each_child do |child|
        scroll_frame.removeChild(child)
      end
      scroll_frame.recalc
    end

    # Removes all children from stack_frame container: OK
    FXButton.new(button_frame, "remove matrix_frame children").connect(SEL_COMMAND) do |sender, selector, data|
      matrix_frame.each_child do |child|
        matrix_frame.removeChild(child)
      end
      matrix_frame.recalc
    end
  end

  def create
    super
    show(PLACEMENT_SCREEN)
  end
  
end

if __FILE__ == $0
  $app = application = FXApp.new("Attik System", "FXRuby Test")
  MyWindow.new(application)
  application.create
  application.run
end

-------------------------------------------------------------
Attik System              web  : http://www.attiksystem.ch
Philippe Lang             phone: +41 26 422 13 75
rte de la Fonderie 2      gsm  : +41 79 351 49 94
1700 Fribourg             pgp  : http://keyserver.pgp.com 


> -----Message d'origine-----
> De : fxruby-users-bounces at rubyforge.org [mailto:fxruby-users-
> bounces at rubyforge.org] De la part de Joey Kinsella
> Envoyé : jeudi 15 avril 2010 19:42
> À : fxruby-users at rubyforge.org
> Objet : Re: [fxruby-users] Adding / Deleting controls dynamically
> 
> Pretty close...
> 
> Try changing the following code:
> 
>      dynamic_frame.each_child do |child|
>        child.destroy
>      end
> 
> to:
>      dynamic_frame.each_child do |child|
>        dynamic_frame.removeChild(child)
>      end
> 
> Seems to work.
> 
> 
> On Thu, Apr 15, 2010 at 3:31 AM, Philippe Lang
> <philippe.lang at attiksystem.ch> wrote:
> 
> 
> 	Hi,
> 
> 	I'm developing a user interface for querying an SQL database,
> where controls are being added/deleted dynamically, while the user is
> working.
> 
> 	Everything works just fine when adding controls: you just have to
> "create" the control, and then call "recalc" for the frame where the
> control has been added.
> 
> 	At some point, I need to delete everything which was added, and
> start over. This is where I start having problems.
> 
> 	Here is some test code, where I tried to reproduce the problem.
> Add a few controls, delete them all, and add one again: you will see it
> does not appear at the right place, as if the previous "destroyed"
> controls where still here, somehow.
> 
> 	Does anyone know how to clean all childs of a frame correctly?
> 
> 	Best regards!
> 
> 	-------------------------------------------------------------
> 	#!/usr/bin/ruby
> 
> 	require 'fox16'
> 
> 	include Fox
> 
> 	class MyWindow < FXMainWindow
> 
> 	 def initialize(app)
> 
> 	   super(app, "Window", nil, nil, DECOR_ALL, 0, 0, 400, 200)
> 
> 	   stack = FXVerticalFrame.new(self,
> FRAME_NONE|LAYOUT_FILL_X|LAYOUT_FILL_Y)
> 
> 	   # Frame where controls are being dynamically added / deleted
> 	   dynamic_frame = FXHorizontalFrame.new(stack,
> FRAME_NONE|LAYOUT_FILL_X|LAYOUT_FILL_Y)
> 
> 	   # Bottom frame for buttons
> 	   button_frame = FXHorizontalFrame.new(stack,
> FRAME_NONE|LAYOUT_FILL_X)
> 
> 	   # Button that adds a control in the dynamic_frame. Works fine.
> 	   FXButton.new(button_frame, "add").connect(SEL_COMMAND) do
> |sender, selector, data|
> 	     FXButton.new(dynamic_frame, "button").create
> 	     dynamic_frame.recalc
> 	   end
> 
> 	   # Button that deletes all child windows of dynamic_frame.
> 	   # Works, except that afterwards, new controls are not added at
> the right place.
> 	   FXButton.new(button_frame, "remove all").connect(SEL_COMMAND)
> do |sender, selector, data|
> 	     dynamic_frame.each_child do |child|
> 	       child.destroy
> 	     end
> 	     dynamic_frame.recalc
> 	   end
> 
> 	 end
> 
> 	 def create
> 	   super
> 	   show(PLACEMENT_SCREEN)
> 	 end
> 
> 	end
> 
> 	if __FILE__ == $0
> 	 $app = application = FXApp.new("Attik System", "FXRuby Test")
> 	 MyWindow.new(application)
> 	 application.create
> 	 application.run
> 	end
> 
> 	-------------------------------------------------------------
> 	Attik System              web  : http://www.attiksystem.ch
> 	Philippe Lang             phone: +41 26 422 13 75
> 	rte de la Fonderie 2      gsm  : +41 79 351 49 94
> 	1700 Fribourg             pgp  : http://keyserver.pgp.com
> 
> 
> 
> 	_______________________________________________
> 	fxruby-users mailing list
> 	fxruby-users at rubyforge.org
> 	http://rubyforge.org/mailman/listinfo/fxruby-users
> 
> 
> 
> --
> If you are not the intended recipient, you are hereby notified that any
> dissemination, distribution, copying or other use of this communication
> is strictly prohibited.  If you have received this communication in
> error, please notify us immediately.

-------------- next part --------------
A non-text attachment was scrubbed...
Name: PGP.sig
Type: application/pgp-signature
Size: 474 bytes
Desc: not available
URL: <http://rubyforge.org/pipermail/fxruby-users/attachments/20100419/adf1dc76/attachment.bin>


More information about the fxruby-users mailing list