Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / fpc-devel / 2008-01

More about calling objc methods from pascal

1 message · 1 person ·

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

Felipe Monteiro de Carvalho

Hello,

I am proceding to build the initial part of what would be Cocoa Pascal bindings, but I got really stuck in one part.

Calling methods without any parameters works fine, but I just started with the first method with parameters and it just doesn't work. It's a trivial program that just shows a window. The objc version works fine and shows the window. The pascal version runs fine, except that no window is shown. I have already compared both assemblers, but couldn't find anything that shows the reason of the problem =/

I tryed various possibilities: pass the parameters in the reverse order, pass a pointer of the full structure of a NSRect in one parameter, etc.

Here is the problematic part:

constructor NSWindow.initWithContentRect(
  contentRect: NSRect;
  aStyle: cuint;
  bufferingType: NSBackingStoreType;
  defer: CBOOL);
begin
{    NSWindow* MainWindow = [[NSWindow alloc] initWithContentRect:
MainWindowRect
      styleMask: NSTitledWindowMask | NSClosableWindowMask |
NSMiniaturizableWindowMask | NSResizableWindowMask
        backing: NSBackingStoreBuffered
          defer: NO]; }
  ClassId := objc_getClass(PChar(Str_NSWindow));
  allocbuf := objc_msgSend(ClassId, sel_registerName(PChar(Str_alloc)), []);
  Handle := objc_msgSend(allocbuf,
sel_registerName(PChar(Str_initWithContentRect)),
   [contentRect.origin.x, contentRect.origin.y,
contentRect.size.width, contentRect.size.height,
    aStyle, bufferingType, defer]);
end;
procedure NSWindow.orderFrontRegardless;
begin
  objc_msgSend(Handle, sel_registerName(PChar(Str_orderFrontRegardless)), []);
end;

Here is the obj program:

int main(int argc, char *argv[])
{
    // Creates an autorelease pool
    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
    // Creates the application NSApp object
    [NSApplication sharedApplication];
    // Creates a simple window
    NSRect MainWindowRect = NSMakeRect(300, 300, 300, 500);

NSWindow* MainWindow = [[NSWindow alloc] initWithContentRect: MainWindowRect styleMask: NSTitledWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask | NSResizableWindowMask backing: NSBackingStoreBuffered

          defer: NO];
    [MainWindow orderFrontRegardless];
 //   CreateMenu();
    // Enters main message loop
    [NSApp run];
    // Call release method from object pool
    [pool release];
    return 0;
}

Here is the pascal program (class calls are wrapped inside the bindings):

var
  { classes }
  pool: NSAutoreleasePool;
  MainWindow: NSWindow;
  { strings }
  CFTitle, CFMessage: CFStringRef;
  { sizes }
  MainWindowRect: NSRect;
begin
  {  NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; }
  pool := NSAutoreleasePool.Create;
  // Creates the application NSApp object
  NSApp := NSApplication.sharedApplication;
  // Creates a simple window
  MainWindowRect.origin.x := 300.0;
  MainWindowRect.origin.y := 300.0;
  MainWindowRect.size.width := 300.0;
  MainWindowRect.size.height := 500.0;
  MainWindow := NSWindow.initWithContentRect(MainWindowRect,
    NSTitledWindowMask or NSClosableWindowMask or
NSMiniaturizableWindowMask or NSResizableWindowMask,
    NSBackingStoreBuffered, NO);
  MainWindow.orderFrontRegardless;
//    CreateMenu();
  { Enters main message loop }
  NSApp.run;
  {  [pool release]; }
  pool.Free;
end.

thanks,

Felipe Monteiro de Carvalho

Reply by email