Difference between revisions of "PasCocoa"

From Lazarus wiki
Jump to navigationJump to search
Line 68: Line 68:
  
 
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 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.
 
Inclusion of headers in other frameworks should be removed, because the each framework is mapped to a pascal unit, and therefore all include files of a used framework are already accessible. Inclusion of headers of the same file framework should become include clauses which will used a C-styled ifdef mechanism to resolve in which order the include files will be added. This mechanism works fairly well and keeps the structure of the include files similar to the original one.
 
  
 
The include file has a total of 3 separate sessions: HEADER, CLASSES and IMPLEMENTATION
 
The include file has a total of 3 separate sessions: HEADER, CLASSES and IMPLEMENTATION
 
===HEADERS===
 
 
===CLASSES===
 
 
''Guidelines:'''
 
 
* All private members of classes should be removed
 
 
===IMPLEMENTATION===
 
 
===Examples===
 
  
 
A tipical include file should have this structure:
 
A tipical include file should have this structure:
Line 118: Line 104:
 
{$endif}
 
{$endif}
 
</delphi>
 
</delphi>
 +
 +
===HEADERS===
 +
 +
'''Guidelines:'''
 +
 +
* Inclusion of headers in other frameworks should be removed, because the each framework is mapped to a pascal unit, and therefore all include files of a used framework are already accessible. Inclusion of headers of the same file framework should become include clauses which will used a C-styled ifdef mechanism to resolve in which order the include files will be added. This mechanism works fairly well and keeps the structure of the include files similar to the original one.
 +
 +
===CLASSES===
 +
 +
'''Guidelines:'''
 +
 +
* Should include the same include files as the HEADERS section
 +
 +
* All private members of classes should be removed
 +
 +
===IMPLEMENTATION===

Revision as of 00:15, 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

Overview

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>

HEADERS

Guidelines:

  • Inclusion of headers in other frameworks should be removed, because the each framework is mapped to a pascal unit, and therefore all include files of a used framework are already accessible. Inclusion of headers of the same file framework should become include clauses which will used a C-styled ifdef mechanism to resolve in which order the include files will be added. This mechanism works fairly well and keeps the structure of the include files similar to the original one.

CLASSES

Guidelines:

  • Should include the same include files as the HEADERS section
  • All private members of classes should be removed

IMPLEMENTATION