[fxruby-users] FXTextField and number of digits after decimal point

Joel VanderWerf vjoel at path.berkeley.edu
Fri Dec 5 19:31:04 EST 2008


Lyle Johnson wrote:
> 
> On Nov 11, 2008, at 11:25 AM, Michèle Garoche wrote:
> 
>> My question is: Is there a way to use either a TEXTFIELD_INTEGER or a 
>> TEXTFIELD_REAL without losing digits after the decimal point?
> 
> The lack of display precision has to do with the fact that you're using 
> an FXDataTarget to update the value of the text field.
> 
> When the FXTextField sets its text from the double-precision float value 
> that it gets from the FXDataTarget, it uses a fixed format like:
> 
>     sprintf(str, "%.*G", 6, value);
> 
> To use a custom formatting, you'd need to stop using FXDataTarget and 
> instead use a combination of SEL_COMMAND and SEL_UPDATE, e.g.
> 
>     @value_value.connect(SEL_COMMAND) do
>         @value = @value_value.text.to_f
>     end
> 
>     @value_value.connect(SEL_UPDATE) do
>         @value_value.text = @value.to_s # or however you want to format it
>     end
> 
> Hope this helps,
> 
> Lyle

Sorry, this is a late response, but for the record:

If you don't want to give up the functionality of data targets, you 
could do this using FoxTails (http://redshift.sourceforge.net/foxtails/).

The "observable" attribute and the #field method combine to give you 
similar functionality: attrs that sync with their gui representation, 
and which can be observed by your own handlers. Specifying precision is 
just a bonus. Here's an example and screenshot:

require 'foxtails'

include Fox
include FoxTails

class Thing
   extend Observable
   observable :x, :y
end

class FieldsWindow < FXMainWindow
   include FTField
   observable :z, :msg

   def initialize(*args)
     super

     thing = Thing.new
     thing.x = 1.23456
     thing.y = 1.23456789

     self.z = 1.23456789

     field("x = %6.2f and y = %12.8f and z = %f",
          [thing, :x], [thing, :y], :z)

     field("message: %60s", :msg)

     thing.when_y CHANGES do |val, old_val|
       if old_val
         self.msg = "You changed y from #{old_val} to #{val}"
       end
     end
   end

   def create
     super
     show
   end
end

class FieldsApp < FTApp
   def initialize
     super("Fields", "TEST")
     FieldsWindow.new(self, "Fields")
   end
end

FieldsApp.new.run


-- 
       vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407
-------------- next part --------------
A non-text attachment was scrubbed...
Name: fields.png
Type: image/png
Size: 14333 bytes
Desc: not available
URL: <http://rubyforge.org/pipermail/fxruby-users/attachments/20081205/177a5104/attachment.png>


More information about the fxruby-users mailing list