From: Haazmatt <haa...@gm...> - 2006-03-21 07:04:53
|
Hi - I'm new to cocoa, but pretty comfortable with ruby. I'm trying to draw an image in a custom view in a document based app. Here's my code: require 'osx/cocoa' class MapView < OSX::NSView include OSX ns_overrides 'initWithFrame:', 'drawRect:' def initWithFrame (frame) super_initWithFrame(frame) @mapbase =3D NSImage.imageNamed("map_blank") return self end def drawRect (rect) @mapbase.compositeToPoint(:drawPoint, :operation, NSCompositeSourceOver= ) end end I can't get it to compile. What is the right way to do this? thanks in adavance, -Matt -- haa...@gm... |
From: Jonathan P. <jp...@dc...> - 2006-03-21 09:13:50
|
On 21 Mar 2006, at 7:04, Haazmatt wrote: > def drawRect (rect) > @mapbase.compositeToPoint(:drawPoint, :operation, > NSCompositeSourceOver) > > I can't get it to compile. What is the right way to do this? Your code looks ok apart from the above call to compositeToPoint. You say you "can't get it to compile" - what does this mean exactly? Ruby code isn't compiled before the RubyCocoa app is run. What error messages to you get exactly? The error in the above code, which is calling the method: - (void)compositeToPoint:(NSPoint)aPoint operation: (NSCompositingOperation)op The first argument is an NSPoint, so instead of :drawPoint as you have, you can pass a two-element array. Also, you can call the method in one of two ways (which I assume you already know): @mapbase.compositeToPoint([10,20], :operation, NSCompositeSourceOver) or @mapbase.compositeToPoint_operation([10,20], NSCompositeSourceOver) |
From: Jonathan P. <jp...@dc...> - 2006-03-21 20:13:11
|
Hi, I cc-ed this reply back to the list. I hope that's okay. > I should have said that it would not build (instead of not > compile). I tried both ways to call compositeToPoint that you > suggested and they both failed to build. Here is the error: I think the project has built successfully. What you're seeing is a run time error (which shows up in the Run Log window in XCode). > ../MapView.rb:31:in `NSApplicationMain': NSApplicationMain - > RBException_NoMethodError - undefined method `compositeToPoint' for > nil:NilClass (OSX::OCException) > > or > > ../MapView.rb:32:in `NSApplicationMain': NSApplicationMain - > RBException_NoMethodError - undefined method > `compositeToPoint_operation' for nil:NilClass (OSX::OCException) > > Does this mean that @mapbase is not getting initialized in > initWithFrame? I'm just not familiar enough with Cocoa to debug this. Precisely. Add some 'puts' to your initWithFrame method to ensure it gets called. I suspect that the image you're asking for: @mapbase = NSImage.imageNamed("map_blank") cannot be found. The method returns nil on failure. Check that your image has been copied to the built application's Resources directory. You should have a directory called 'build' next to the Xcode project. In there should be either be YourProject.app, or it'll be inside a directory called 'Development' or 'Deployment', depending on your current build settings. Navigate inside the application bundle (the *.app directory) at the terminal or in the Finder by control-clicking and choosing 'Show package contents'. |
From: Haazmatt <haa...@gm...> - 2006-03-21 21:15:39
|
On 3/21/06, Jonathan Paisley <jp...@dc...> wrote: > > Hi, > > I cc-ed this reply back to the list. I hope that's okay. Not a problem, I'm glad to share. > I should have said that it would not build (instead of not > > compile). I tried both ways to call compositeToPoint that you > > suggested and they both failed to build. Here is the error: > > I think the project has built successfully. What you're seeing is a > run time error (which shows up in the Run Log window in XCode). > > > ../MapView.rb:31:in `NSApplicationMain': NSApplicationMain - > > RBException_NoMethodError - undefined method `compositeToPoint' for > > nil:NilClass (OSX::OCException) > > > > or > > > > ../MapView.rb:32:in `NSApplicationMain': NSApplicationMain - > > RBException_NoMethodError - undefined method > > `compositeToPoint_operation' for nil:NilClass (OSX::OCException) > > > > Does this mean that @mapbase is not getting initialized in > > initWithFrame? I'm just not familiar enough with Cocoa to debug this. > > Precisely. Add some 'puts' to your initWithFrame method to ensure it > gets called. I suspect that the image you're asking for: > > @mapbase =3D NSImage.imageNamed("map_blank") > > cannot be found. The method returns nil on failure. > > Check that your image has been copied to the built application's > Resources directory. You should have a directory called 'build' next > to the Xcode project. In there should be either be YourProject.app, > or it'll be inside a directory called 'Development' or 'Deployment', > depending on your current build settings. > > Navigate inside the application bundle (the *.app directory) at the > terminal or in the Finder by control-clicking and choosing 'Show > package contents'. > > That did it. I added the image file to my project and it works. Thanks again. -Matt -- haa...@gm... |