Difference between revisions of "PasCocoa"

From Lazarus wiki
Jump to navigationJump to search
Line 84: Line 84:
 
{$define NSSTATUSBAR_PAS_H}
 
{$define NSSTATUSBAR_PAS_H}
  
insert constants, records and other interface declarations with the exception of classes
+
//insert constants, records and other interface declarations with the exception of classes
  
 
{$endif}
 
{$endif}
Line 92: Line 92:
 
{$define NSSTATUSBAR_PAS_H}
 
{$define NSSTATUSBAR_PAS_H}
  
declaration of classes and forward declarations of classes
+
//declaration of classes and forward declarations of classes
  
 
{$endif}
 
{$endif}
Line 98: Line 98:
 
{$ifdef IMPLEMENTATION}
 
{$ifdef IMPLEMENTATION}
  
insert implementation declarations here. The order is not important on the implementation, so don't use extra ifdefs.
+
//insert implementation declarations here. The order is not important on the implementation, so don't use extra ifdefs.
  
 
{$endif}
 
{$endif}
 
</delphi>
 
</delphi>

Revision as of 00:03, 23 February 2008

PasCocoa is the project to build object oriented bindings to use Cocoa in Pascal.

Objective-C to Pascal Bindings

Example

<delphi> program simplewindow;

{$mode delphi}

uses

 objc, ctypes, FPCMacOSAll, AppKit, Foundation;

const

 Str_Panel_Title = 'This is the title';
 Str_Panel_Message = 'This is the message';

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. </delphi>

Subversion

svn co https://lazarus-ccr.svn.sourceforge.net/svnroot/lazarus-ccr/bindings/objc objc
svn co https://lazarus-ccr.svn.sourceforge.net/svnroot/lazarus-ccr/bindings/pascocoa pascocoa

Implementation Details

The Cocoa headers contain several peculiarities that lead us to need a special structure for the bindings. First, several forward declarations of classes are done in a very unordently way. Pascal only accepts forward declarations of classes if they are all declared on the same type clause, and therefore a special session CLASSES is created on the include file.

The include file has a total of 3 separate sessions: HEADER, CLASSES and IMPLEMENTATION

A tipical include file should have this structure:

<delphi> {%mainunit appkit.pas} {

       NSStatusBar.h
       Application Kit
       Copyright (c) 1997-2005, Apple Computer, Inc.
       All rights reserved.

}

{$ifdef HEADER} {$ifndef NSSTATUSBAR_PAS_H} {$define NSSTATUSBAR_PAS_H}

//insert constants, records and other interface declarations with the exception of classes

{$endif} {$endif} {$ifdef CLASSES} {$ifndef NSSTATUSBAR_PAS_H} {$define NSSTATUSBAR_PAS_H}

//declaration of classes and forward declarations of classes

{$endif} {$endif} {$ifdef IMPLEMENTATION}

//insert implementation declarations here. The order is not important on the implementation, so don't use extra ifdefs.

{$endif} </delphi>