Cocoa Modul Serie
31 - Das Grauen hat zwei Namen...
...NSTableView und NSOutlineView! *grusel*
Zumindest sind die beiden Klassen mein persönliches Grauen, mit dem ich aber soeben abgeschlossen habe! Da sie ja nicht lauffähig sind, wenn man nicht zumindest die dazugehörenden Klassen und Protokolle mit wrappt, artet das ganze gleich in eine riesen Schlammschlacht aus. Bis auf die Sortierung der Einträge habe ich diese allerdings gewonnen! Mit der NSSortDescriptor Klasse, die zum Sortieren notwendig ist, lieg ich noch ein Bisschen im Klinsch, aber auch die krieg ich noch klein, JAWOLL!
Momentan habe ich mich allerdings, zur Entspannung, auf die NSFontManager Klasse gestürzt.
Zeit für ein kleines Update der Liste:
BlitzMax: [AUSKLAPPEN]
Include "classes/nslevelindicator.bmx"
Include "classes/nslevelindicatorcell.bmx"
Include "classes/nstableview.bmx"
Include "classes/nstableheaderview.bmx"
Include "classes/nstablecolumn.bmx"
Include "classes/nstableviewdatasource.bmx"
Include "classes/nsindexset.bmx"
Include "classes/nsoutlineview.bmx"
Include "classes/nsoutlineviewdatasource.bmx"
Include "classes/nsdragginginfo.bmx"
Include "classes/nsdraggingsource.bmx"
Include "classes/nsdraggingdestination.bmx"
Include "classes/nsdraggingsession.bmx"
Include "classes/nspasteboardwriting.bmx"
Include "classes/nsaffinetransform.bmx"
Include "classes/nsfontdescriptor.bmx"
Include "classes/nsfontmanager.bmx"
Btw. hat das Grauen noch mehr Namen! Ein weiterer Name wäre BlitzMaxIstTotalVeraltetMitSeinemSnowLeopardSDK! So kommt es mir zumindest vor. Manche feinen Neuerungen aus dem 10.7 SDK können einfach nicht realisiert werden. NSPopover z.B., oder die Vereinfachung des Drag&Drop Gedingsels. Bei letzterem wurde es dann auch schwierig die alte Dokumentation zu finden, weil Apple sie teilweise vom Server gefegt hat. Es gibt noch ein paar andere Features von Lion die nicht umgesetzt werden können - z.B. NSTextFinder oder View-basierende TableViews.
Fullscreen-Support funktioniert allerdings tadellos. Wahrscheinlich, weil Apple hier nur vorhandene Methoden mit neuen Konstanten füttert. Die dazu gehörenden Notifications funktionieren sowieso immer. :>
Wie auch immer, sollte Mark sich nicht dazu entscheiden auf die neue SDK umzusteigen, sehe ich keine große Zukunft mehr in BlitzMax auf dem Macces. Ich nehme sogar an, dass es durch den kompletten Wegfall von Carbon in Mountain Lion schon gar nicht mehr funktionieren wird. Warten wir einfach mal ab was die Zukunft bring.
Ich mach trotzdem mal so weiter wie bisher!
Gruße
30 - AAAAAAAAAAAAARGGGGLLLL
Hallo,
wie dumm kann ein Mensch alleine eigentlich sein? Also von mir kann ich jedenfalls mit Fug und Recht behaupten, dass ich einfach nur noch dumm bin! Ich hatte ja im letzten Post geschrieben, dass ich bei der Bug-Suche diverse Vorgehensweisen durch gespielt und durch getestet hatte... Nur eines hatte ich nie getan und auch nie vermutet:
Es gab da einen Aufruf namens scintilla.lineString(line) in einer For/Next Schleife. Dieser sollte mir eigentlich nur beim Iterieren der Schleife eben immer schön die zur line passenden Text in eine Variable packen, damit ich diese weiter verarbeiten kann. Hat es ja auch gemacht! Dummerweise muss aber in der Methode lineString der String vom CString (nein, kein NSString) in ein BBString konvertiert werden und den Speicher wieder freigegeben werden. Jetzt ratet mal warum die letzte Version 12Sek gebraucht hat. :>
Memo an den zukünftigen User: Lieber vor der Schleife den gesammten Text in ein String[] parken! Geht vieeeel viel schneller!
Nachdem ich das geändert hatte, hat sich nun der Speed drastisch erhöht! Bei den getesteten 150 Menüeinträgen, kam ich nun auf 80ms! Das ist sogar deutlich schneller als MaxGUI bzw. CocoaExt. Wobei ich aber für die Zahlen keine Gewähr übernehme, weil ich nicht weiß, was bei Tests noch im Hintergrund abging.
Jetzt ist es aber eh zu spät um alles wieder Rückgängig zu machen! Ich bin mit der neuen Version in manchen Bereichen schon wesentlich weiter als ich es mit der alten war. Dafür fehlen eben aber auch noch so Hammer-Controls wie NSTextView, NSTableView, NSOutlineView und noch ein paar kleinere wie NSScrollView, NSOpenGLView usw. Was ich allerdings wieder einbaute ist brl.reflections! Da der Schuldige ja nun anderweitig gefunden wurde, hab ich mich offiziell bei Mr.Reflection entschuldigt und ihn wieder in mein Modul-Team aufgenommen!
Also sind Actions nun wieder Methoden, Delegates, Notifications und eigene Actions werden nicht mehr vorgefertigt, sondern können vom Programmierer bei Bedarf im Controller oder in Subklassen implementiert werden usw.
Kurze Liste des aktuellen Gadget Standes (kopiert aus der include Phase des Moduls (man ist ja faul)):
BlitzMax: [AUSKLAPPEN]
Include "classes/nsobject.bmx"
Include "classes/nsgraphicscontext.bmx"
Include "classes/nserror.bmx"
Include "classes/nsdata.bmx"
Include "classes/nsurl.bmx"
Include "classes/nsdictionary.bmx"
Include "classes/nsattributedstring.bmx"
Include "classes/nsnumber.bmx"
Include "classes/nsvalue.bmx"
Include "classes/nsdate.bmx"
Include "classes/nscolor.bmx"
Include "classes/nscolorlist.bmx"
Include "classes/nscolorspace.bmx"
Include "classes/nsfont.bmx"
Include "classes/nsimage.bmx"
Include "classes/nsnotification.bmx"
Include "classes/nsnotificationcenter.bmx"
Include "classes/nsevent.bmx"
Include "classes/nsresponder.bmx"
Include "classes/nsapplication.bmx"
Include "classes/nscursor.bmx"
Include "classes/nslayoutconstraint.bmx"
Include "classes/nstrackingarea.bmx"
Include "classes/nspasteboard.bmx"
Include "classes/nspasteboarditem.bmx"
Include "classes/nspasteboarditemdataprovider.bmx"
Include "classes/nsfilewrapper.bmx"
Include "classes/nsscreen.bmx"
Include "classes/nsview.bmx"
Include "classes/nscontrol.bmx"
Include "classes/nscell.bmx"
Include "classes/nsactioncell.bmx"
Include "classes/nsshadow.bmx"
Include "classes/nsclipview.bmx"
Include "classes/nsscrollview.bmx"
Include "classes/nsmenu.bmx"
Include "classes/nsmenuitem.bmx"
Include "classes/nsmenuitemcell.bmx"
Include "classes/nswindow.bmx"
Include "classes/nspanel.bmx"
Include "classes/nscolorpanel.bmx"
Include "classes/nstext.bmx"
Include "classes/nsformatter.bmx"
Include "classes/nsbutton.bmx"
Include "classes/nsbuttoncell.bmx"
Include "classes/nspopupbutton.bmx"
Include "classes/nspopupbuttoncell.bmx"
Include "classes/nssound.bmx"
Include "classes/nsdocktile.bmx"
Include "classes/nsdrawer.bmx"
Include "classes/nstoolbar.bmx"
Include "classes/nstoolbaritem.bmx"
Include "classes/nswindowcontroller.bmx"
Include "classes/nsundomanager.bmx"
Include "classes/nssplitview.bmx"
Include "classes/nstabview.bmx"
Include "classes/nstabviewitem.bmx"
Include "classes/nsimageview.bmx"
Include "classes/nstextview.bmx"
Include "classes/nsuserdefaults.bmx"
Include "classes/nsbox.bmx"
Include "classes/nscolorwell.bmx"
Include "classes/nstextfield.bmx"
Include "classes/nstextfieldcell.bmx"
Include "classes/nssecuretextfield.bmx"
Include "classes/nssecuretextfieldcell.bmx"
Include "classes/nssearchfield.bmx"
Include "classes/nssearchfieldcell.bmx"
Include "classes/nstokenfield.bmx"
Include "classes/nstokenfieldcell.bmx"
Include "classes/nsanimation.bmx"
Include "classes/nsviewanimation.bmx"
Include "classes/nsstepper.bmx"
Include "classes/nssteppercell.bmx"
Include "classes/nsslider.bmx"
Include "classes/nsslidercell.bmx"
Include "classes/nsscroller.bmx"
Include "classes/nsgradient.bmx"
Include "classes/nsbezierpath.bmx"
Include "classes/nscharacterset.bmx"
Include "classes/nssegmentedcontrol.bmx"
Include "classes/nssegmentedcell.bmx"
Include "classes/nsrulerview.bmx"
Include "classes/nsrulermarker.bmx"
Dies sind noch nicht alle 100%ig fertig, aber schon mal als Klasse implementiert, um aus anderen Klassen darauf zugreifen zu können...
Die Todo-Liste muss ich euch nicht vorführen, da die sich eigentlich stündlich verlängert, wenn ich am programmieren bin. Wie man sieht habe ich keinen Masterplan sonder hacke wild vor mich hin!
Die Kompilier-Zeit des cocoa.appkit Moduls (ja, so heißt es nun...) könnte am Ende genau so lang sein wie die von wxMax! Dauert jetzt schon ziemlich. :>
Grüße!
P.S: cocoa.psmtabbarcontrol und cocoa.scintilla sind auch schon fertig!
29 - Back to the roots
Hallo zusammen,
eigentlich dachte ich cocoa.cocoa wäre so gut wie abgeschlossen und startete einen umfangreichen Test zum Thema Kompatibilität, allgemeines Zusammenspiel und dergleichen. Das hätte ich mal lassen sollen, denn dann könnte ich mit ruhigem Gewissen irgend etwas anderes machen!
Als ich versuchte ein größeres Textfile (den ScintillaView code) einzulesen, auszuwerten und für jede Funktion, jedes Type, jede Methode, jede Konstante und jede Globale einen Menü-Eintrag zu kreieren kam die große Ernüchterung. 12000ms! Wir reden hier vom Erstellen von gefühlten 150 Einträgen (keine Ahnung, habs nicht nachgezählt)... 12sek bei einem Menü, was vor dem Öffnen neu aufgebaut werden muss ist schon ziemlich happig...
Das wollte ich so nicht auf mir sitzen lassen und hab das ganze mit CocoaExt noch mal nachprogrammiert... 100ms! Immer noch lahm, aber doch deutlich schneller als cocoa.cocoa! Also ran ans Werk und Bremsen gesucht. Zwei bis drei Tests später, lieg ich immer noch bei 11000ms! Jetzt weiß ich erst mal keinen Rat mehr. Ich meine, ich hab nun wirklich nicht den lahmsten Mac der Welt, also kann ich das schon mal ausschließen. Ich will gar nicht wissen wie lange das auf meinem MacBook brauchen würde. Meine Vermutungen gehen ganz stark zum übermäßigen Einsatz des brl.reflections Modul. Das hat ja ohnehin den Ruf eine absolute Schnecke unter den Seinen zu sein. Da ich sogar beim Erstellen von Gadgets damit hantiere denke ich mal, dass es daran liegen mag.
Aus Trotz hab ich jetzt angefangen das ganze System umzubauen. Neben dem konsequenten Verzicht auf brl.reflections habe ich auch damit begonnen die ganzen Variablen-und Typenamen wieder mit NS (NextStep) beginnen zu lassen. Noch dazu halte ich mich nun weitestgehend an die original Methoden-Namen (eben bis auf die Doppelpunkte). Dafür verzichte ich allerdings auf das Copy-Paste-Spektakel beim erstellen der Dokumentation. Diese wird es nun nicht mehr geben, immerhin gibt es die ja auf developer.apple.com quasi vorgefertigt und geschenkt! Die Notifications und Delegates, die vorher per Reflections gesucht und ausgeführt wurden sind nun im Basis-Type (NSObject) schon integriert. Actions werden nun als Function-Callbacks übergeben, haben dafür aber einen Parameter mehr als das original. Während in der alten Version eine Action so aussah:
BlitzMax: [AUSKLAPPEN]
Method action(sender:CCObject)
'mach was tolles
End Method
Sieht sie jetzt eben so aus:
BlitzMax: [AUSKLAPPEN]
Function action(target:NSObject, sender:NSObject)
'mach was total tolles
End Function
Dies war nötig um die Actions auch an den passenden Plätzen unterbringen zu können. Bei den Vorgefertigten wird da nämlich eine Methode nach Objective-C gebeamt. Das funktioniert aber nur, wenn ich den pointer des targets habe. Da man bei Funktionen so schlecht auf Self zurückgreifen kann, hab ich eben den Parameter target:NSObject dazu geschmiert. Stört ja auch nicht weiter, finde ich...
Zwischenzeitlich habe ich noch versucht die libobjc nebst Wrapper von Nilium zu implementieren um weitestgehend auf das hin-und-her schieben von Funktions-Pointern zu verzichten, aber das scheiterte bereits beim ersten Struct. Ich bin, glaube ich, noch immer nicht gut genug um NSRect mittels objc_msgSend_stret und MemCopy direkt in ein Array oder Type auszulesen! Zumindest scheiterte es genau daran!
Momentaner Stand der Dinge:
- NSObject wird zum Dauerläufer und erst gegen Ende fertig
- NSResponder: Events funktionieren schon mal!
- NSEvent: fertig (Alles geht eh nicht, da BMax keine unsigned Datentypen unterstützt (oder?))
- NSColor: fertig
- NSDate: fertig (die gabs nicht mal in der letzten Version ...)
- NSNumber: fertig (ebenfalls ohne unsigned Datentypen)
- NSValue: fertig
- NSImage: fertig
- NSDictionary: Bis die Daten-Typen-Integration auch fertig. Die wächst mit dem Modul.
- NSNotification: fertig (Die Ausführende Funktion mal nicht eingerechnet)
- NSApplication: ca. 50%
- NSMenu: fertig
- NSMenuItem: fertig
- NSWindow: ca. 5%
- NSSchlagMichTot: Also alles andere ... noch nicht mal begonnen! (Bin ja auch erst 2 Tage dran)
Mit kurzen Worten: Alles begann von vorne! Geht aber schneller voran, da die Dokumentations-Kopiererei flach fällt!
Grüße
buggy
28 - OpenGL
Hallo zusammen,
da ich in den Kommentaren ja mal auf einen Max2D Treiber, bzw. einer OpenGLView angesprochen wurde, habe ich mich jetzt mal darauf gestürzt. Bisher handelt es sich dabei um eine 1:1 Umsetzung der NSOpenGLView, die von Hause aus bereits den OpenGL Kontext bereit stellt. Die ganze OpenGLView lebt vom subclassing. Ohne dem kann sie weder etwas darstellen noch sonst irgend etwas machen.
Da ich heute morgen erst damit anfing, kann ich eigentlich schon recht stolz darauf sein, dass es mir bereits gelungen ist das NEHE 5 Tutorial darzustellen. Bisher allerdings noch ohne Animation, da mir die NSTimer Klasse noch fehlt um das Neuzeichnen auszulösen! Man kann es wohl simulieren, in dem man das Fenster vergrößert bzw. verkleinert um den Neuaufbau zu erzwingen, aber das ist mir zu müßig.
Kleiner Code:
BlitzMax: [AUSKLAPPEN]
SuperStrict
Framework cocoa.cocoa
Import pub.opengl
'create global CCSampleController instance
Global controller:CCSampleController = New CCSampleController
'create global CCApplication instance
Global app:CCApplication = (New CCApplication).init()
'bind controller as delegate to the application
app.setDelegate(controller)
'start the applications main loop
app.run()
'Controller class
Type CCSampleController Extends CCObject
Field window:CCWindow
'use this method to initialize gadgets
Method CCApplicationDidFinishLaunchingNotification(notification:CCNotification)
'create window
Local frame:CCRect = CCMakeRect(100.0, 100.0, 640.0, 480.0)
window = CCWindow.documentWindow(frame)
window.setDelegate(Self)
window.setTitle(AppTitle)
window.center()
'create the OpenGL view.
window.setContentView(CCOpenGL.alloc().initWithFrame(window.contentView().frame()))
window.show()
End Method
'terminate application when last window is closed
Method applicationShouldTerminateAfterLastWindowClosed:Int()
Return YES
End Method
End Type
'Subclass of CCOpenGLView
Type CCOpenGL Extends CCOpenGLView
Function alloc:CCOpenGL()
Return New CCOpenGL
End Function
Method initWithFrame:CCOpenGL(frame:CCRect)
'Create Max2D default pixel format
Local pixelFormatAttributes:Int[] = [CCOpenGLDoubleBuffer, CCOpenGLDepthSize, 1, CCOpenGLNoRecovery]
Local pixelFormat:CCOpenGLPixelFormat = CCOpenGLPixelFormat.alloc().initWithAttributes(pixelFormatAttributes)
'initialize the view and attach the pixelformat to it
Super.initWithFramePixelFormat(frame, pixelFormat)
setLayout(CCAlignLeft | CCAlignTop | CCAlignWidthSizable | CCAlignHeightSizable)
Return Self
End Method
'draw nehe 5 tutorial to the view
Method DrawRect(rect:CCRect)
Global rtri:Float=0.0
Global rquad:Float=0.0
glClear GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT
glLoadIdentity
glTranslatef -1.5,0.0,-6.0
glRotatef rtri,0.0,1.0,0.0 '; Rotate The Triangle On The Y axis ( New )
glBegin GL_POLYGON
';Front
glColor3f 1.0,0.0,0.0 '; Red
glVertex3f 0.0, 1.0, 0.0 '; Top Of Triangle (Front)
glColor3f 0.0,1.0,0.0 '; Green
glVertex3f -1.0,-1.0, 1.0 '; Left Of Triangle (Front)
glColor3f 0.0,0.0,1.0 '; Blue
glVertex3f 1.0,-1.0, 1.0 '; Right Of Triangle (Front)
';Right
glColor3f 1.0,0.0,0.0 '; Red
glVertex3f 0.0, 1.0, 0.0 '; Top Of Triangle (Right)
glColor3f 0.0,0.0,1.0 '; Blue
glVertex3f 1.0,-1.0, 1.0 '; Left Of Triangle (Right)
glColor3f 0.0,1.0,0.0 '; Green
glVertex3f 1.0,-1.0, -1.0 '; Right Of Triangle (Right)
';Back
glColor3f 1.0,0.0,0.0 '; Red
glVertex3f 0.0, 1.0, 0.0 '; Top Of Triangle (Back)
glColor3f 0.0,1.0,0.0 '; Green
glVertex3f 1.0,-1.0, -1.0 '; Left Of Triangle (Back)
glColor3f 0.0,0.0,1.0 '; Blue
glVertex3f -1.0,-1.0, -1.0 '; Right Of Triangle (Back)
';Left
glColor3f 1.0,0.0,0.0 '; Red
glVertex3f 0.0, 1.0, 0.0 '; Top Of Triangle (Left)
glColor3f 0.0,0.0,1.0 '; Blue
glVertex3f -1.0,-1.0,-1.0 '; Left Of Triangle (Left)
glColor3f 0.0,1.0,0.0 '; Green
glVertex3f -1.0,-1.0, 1.0 '; Right Of Triangle (Left)
glEnd
glLoadIdentity
glTranslatef 1.5,0.0,-7.0 '; Move Right 1.5 Units And Into The Screen 1
glRotatef rquad,1.0,1.0,1.0 '; Rotate The Quad On The X axis ( New )
glColor3f 0.5,0.5,1.0 '; Set The Color To Blue One Time Only
glBegin GL_QUADS
glColor3f 0.0,1.0,0.0 '; Set The Color To Blue
glVertex3f 1.0, 1.0,-1.0 '; Top Right Of The Quad (Top)
glVertex3f -1.0, 1.0,-1.0 '; Top Left Of The Quad (Top)
glVertex3f -1.0, 1.0, 1.0 '; Bottom Left Of The Quad (Top)
glVertex3f 1.0, 1.0, 1.0 '; Bottom Right Of The Quad (Top)
glColor3f 1.0,0.5,0.0 '; Set The Color To Orange
glVertex3f 1.0,-1.0, 1.0 '; Top Right Of The Quad (Bottom)
glVertex3f -1.0,-1.0, 1.0 '; Top Left Of The Quad (Bottom)
glVertex3f -1.0,-1.0,-1.0 '; Bottom Left Of The Quad (Bottom)
glVertex3f 1.0,-1.0,-1.0 '; Bottom Right Of The Quad (Bottom)
glColor3f 1.0,0.0,0.0 '; Set The Color To Red
glVertex3f 1.0, 1.0, 1.0 '; Top Right Of The Quad (Front)
glVertex3f -1.0, 1.0, 1.0 '; Top Left Of The Quad (Front)
glVertex3f -1.0,-1.0, 1.0 '; Bottom Left Of The Quad (Front)
glVertex3f 1.0,-1.0, 1.0 '; Bottom Right Of The Quad (Front)
glColor3f 1.0,1.0,0.0 '; Set The Color To Yellow
glVertex3f 1.0,-1.0,-1.0 '; Top Right Of The Quad (Back)
glVertex3f -1.0,-1.0,-1.0 '; Top Left Of The Quad (Back)
glVertex3f -1.0, 1.0,-1.0 '; Bottom Left Of The Quad (Back)
glVertex3f 1.0, 1.0,-1.0 '; Bottom Right Of The Quad (Back)
glColor3f 0.0,0.0,1.0 '; Set The Color To Blue
glVertex3f -1.0, 1.0, 1.0 '; Top Right Of The Quad (Left)
glVertex3f -1.0, 1.0,-1.0 '; Top Left Of The Quad (Left)
glVertex3f -1.0,-1.0,-1.0 '; Bottom Left Of The Quad (Left)
glVertex3f -1.0,-1.0, 1.0 '; Bottom Right Of The Quad (Left)
glColor3f 1.0,0.0,1.0 '; Set The Color To Violet
glVertex3f 1.0, 1.0,-1.0 '; Top Right Of The Quad (Right)
glVertex3f 1.0, 1.0, 1.0 '; Top Left Of The Quad (Right)
glVertex3f 1.0,-1.0, 1.0 '; Bottom Left Of The Quad (Right)
glVertex3f 1.0,-1.0,-1.0 '; Bottom Right Of The Quad (Right)
glEnd
rtri = rtri + 0.02 '; Increase The Rotation Variable For The Triangle ( New )
rquad = rquad + 0.015 '; Decrease The Rotation Variable For The Quad ( New )
context().flushBuffer()
End Method
'prepare the OpenGL context
Method prepare()
Local frame:CCRect = frame()
glClearColor(0.0, 0.0, 0.0, 0.0)
glClearDepth(1.0)
glDepthFunc(GL_LESS)
glEnable(GL_DEPTH_TEST)
glFrontFace(GL_CW)
glShadeModel(GL_SMOOTH)
glViewport(0, 0, frame.size.width, frame.size.height)
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective(45.0, frame.size.width / frame.size.height, 1.0, 100.0)
glMatrixMode(GL_MODELVIEW)
End Method
End Type
Foto:
Wie man sieht, muss in der Methode view.drawRect(rect:CCRect) gezeichnet werden. Das ist nun mal so bei Cocoa! Gezeichnet wird ausschließlich in draw* Methoden! Wenn ich einen Max2D Treiber schreibe, wird sich das schon noch ändern!
Grüße
buggy
27 - TokenField und Combobox
Hallo zusammen,
nachdem ich nun das Scintillamonster gebändigt habe, widme ich mich mal wieder den Cocoa Klassen. Als erstes sind dabei CCDockTile, CCTokenField und CCCombobox raus gekommen.
CCTokenField
Im Prinzip kennt die Dinger jeder Mac User aus der Adresszeile von Apple-Mail. Kurz gesagt werden hier Eingaben in Tokens umgewandelt. Gibt man bei Mail z.B. eine Mail-Adresse ein wird sie in den Namen des Kontakts aus dem Adressbuch umgewandelt. Sowas können wir nun auch!
BlitzMax: [AUSKLAPPEN]
Local tokenField:CCTokenField = CCTokenField.alloc().initWithFrame(frame)
tokenField.setLayout(CCAlignTop | CCAlignLeft | CCAlignWidthSizable)
tokenField.setDelegate(Self)
tokenField.setText("Hund")
view.addSubView(tokenField)
Obriger Code baut ein TokenField und setzt das Token "Hund" aus dem dann "hund@wuff.de" wird (siehe Bild). Wie man das umwandelt, sieht man im nächsten Code:
BlitzMax: [AUSKLAPPEN]
Method tokenFieldDisplayStringForRepresentedObject:String(tokenField:CCTokenField, representedObject:String)
Select representedObject
Case "Hund"
Return "hund@wuff.de"
End Select
Return representedObject
End Method
Außerdem kann man den Tokens noch ein Menü zuweisen was wie folgt passieren kann:
BlitzMax: [AUSKLAPPEN]
Method tokenFieldHasMenuForRepresentedObject:Int(tokenField:CCTokenField, representedObject:String)
Select representedObject
Case "Hund"
Return YES
End Select
Return NO
End Method
Method tokenFieldMenuForRepresentedObject:CCMenu(tokenField:CCTokenField, representedObject:String)
Global menu:CCMenu
Local item:CCMenuItem
Select representedObject
Case "Hund"
If Not menu
menu = CCMenu.menu()
menu.addItemWithTitle("Hund",CCNullAction,"",CCNullTarget)
menu.addItemWithTitle("Katze",CCNullAction,"",CCNullTarget)
menu.addItemWithTitle("Maus",CCNullAction,"",CCNullTarget)
EndIf
Return menu
End Select
Return Null
End Method
CCComboBox
Wer kennt nicht die Eingabezeile mit Popup-Menü? Wer die Hand hebt wird erschossen! Jedenfalls gibts die jetzt auch in cocoa.cocoa:
BlitzMax: [AUSKLAPPEN]
Local comboBox:CCComboBox = CCComboBox.alloc().initWithFrame(frame)
comboBox.setLayout(CCAlignTop | CCAlignLeft | CCAlignWidthSizable)
comboBox.setDelegate(Self)
comboBox.addValues(["Hund", "Katze", "Maus", "Pferd", "Elefant", "Erdnuckel"])
comboBox.insertValue("Nashorn", 2)
comboBox.selectValue("Maus")
view.addSubView(comboBox)
Auch hierzu findet man alles im Bild:
CCDockTile
Das Ding ist auch aus AppleMail bekannt. Es zeigt einem die ungelesenen Mails als weiße Zahl in rotem Kreis im DockIcon an. So wirds gemacht:
BlitzMax: [AUSKLAPPEN]
Local dockTile:CCDockTile = app.dockTile()
dockTile.setBadgeLabel("200")
und so siehts bei maximalen Dock-Zoom Effekt aus (sonst sieht man ja nichts...):
Das reicht dann erst mal wieder für heute!
buggy
26 - Umstrukturierung und Neues
Hallo zusammen,
da ich anscheinend zu viel Zeit habe gab es eine paar Umbaumaßnahmen im cocoa.scintilla Modul.
- SCNMarker wurde durch passende Methoden in der eigentlichen SCNScintillaView Klasse ersetzt.
- Es kam eine neue Klasse namens SCNLanguageDefinition hinzu. Diese ermöglicht es einem durch Subclassing diverse Anpassungen an den Sprachen die man Unterstützen möchte (siehe Sample) vorzunehmen.
- SCNKeyword wurde komplett gelöscht und in SCNLanguageDefinition integriert.
- Unterstützung für Indikatoren kam in SCNScintillaView hinzu.
- Unterstützung für Multiselection kam in SCNScintillaView hinzu.
- Such-Funktionalität kam in SCNScintillaView hinzu.
- Vorgefertigtes Quote-Completion kam mit SCNLanguageDefinition hinzu.
- Vorgefertigtes Brace-Completion kam mit SCNLanguageDefinition hinzu.
- Vorgefertigtes Einrücken kam mit SCNLanguageDefinition hinzu.
- Vorgefertigtes Einrücken für Keywords kam mit SCNLanguageDefinition hinzu.
- Delegate Methoden für AutoCompletion wurden entfernt und durch Methoden in SCNLanguageDefinition ersetzt.
- Delegate zum initialisieren von SCNScintillaView nach dem setzen der Sprache mittels scintilla.setLanguage(lang:SCNLanguageDefinition) hinzu. Damit man nicht wie doof da steht weil das Folding nicht mehr funktioniert. So ist es mir passiert, weil ich die Reihenfolge der Initialisierung im Sample änderte.
So, dass wars auch im großen und ganzen. Im Moment bin ich dabei die Style-Methoden von Scintilla auch mal in die SCNScintillaView zu übernehmen. Danach wird wohl auch die SCNStyle-Klasse vereinfacht werden bzw. entfallen. Vielleicht werd ich sie aber auch mit in SCNLanguageDefinition packen. Dann hat man alles auf einem Fleck und kann recht einfach eine Sprache implementieren.
Außerdem habe ich noch auf BlitzMax 1.47 nebst XCode 4.3.1 geupdated. Erstaunlicher Weise war das total einfach. Nach dem letzten Disaster hatte ich eigentlich tonnenweise Abstürze, Inkompatibilitäten und dergleichen erwartet. Allerdings kam da gar nichts!
So, jetzt noch ein Sample der neusten Umstrukturierungen. Hier mit der BlitzMax Erweiterung von SCNLanguageDefinition.
BlitzMax: [AUSKLAPPEN]
SuperStrict
Framework cocoa.scintilla
Import brl.pngloader
Import brl.textstream
Global testText:String = LoadText("test.bmx")
'create global CCSampleController instance
Global controller:CCSampleController = New CCSampleController
'create global CCApplication instance
Global app:CCApplication = (New CCApplication).init()
'bind controller as delegate to the application
app.setDelegate(controller)
'start the applications main loop
app.run()
'Controller class
Type CCSampleController Extends CCObject
Global completions:TList
Field window:CCWindow
Field view:SCNScintillaView
'use this method to initialize gadgets
Method CCApplicationDidFinishLaunchingNotification(notification:CCNotification)
'create the style for the BlitzBasic lexer
Local style:SCNStyle = SCNStyle.alloc().init()
style.setLexerStyle(SCLEX_BLITZMAX, CCFont.systemFontOfSize(CCFont.systemFontSize()), CCColor.textBackgroundColor(), CCColor.textColor())
style.setKeywordStyle(SCE_BMX_KEYWORD, CCColor.blueColor(), YES, NO, NO)
style.setKeywordStyle(SCE_BMX_NUMBER, CCColor.orangeColor(), NO, NO, NO)
style.setKeywordStyle(SCE_BMX_COMMENT, CCColor.grayColor(), NO, NO, NO)
style.setKeywordStyle(SCE_BMX_MULTICOMMENT, CCColor.grayColor(), NO, NO, NO)
style.setKeywordStyle(SCE_BMX_LABEL, CCColor.orangeColor(), NO, NO, NO)
style.setKeywordStyle(SCE_BMX_STRING, CCColor.greenColor(), NO, NO, NO)
style.setKeywordStyle(SCE_BMX_OPERATOR, CCColor.textColor(), NO, NO, NO)
style.setKeywordStyle(SCE_BMX_PREPROCESSOR, CCColor.orangeColor(), NO, NO, NO)
style.setKeywordStyle(SCE_BMX_COMPILER, CCColor.orangeColor(), NO, NO, NO)
'create window
Local frame:CCRect = CCMakeRect(0.0, 0.0, 800.0, 800.0)
window = CCWindow.documentWindow(frame)
window.setDelegate(Self)
window.setTitle(StripAll(AppFile))
window.center()
'create and intitalize Scintilla view
view = SCNScintillaView.alloc().initWithFrame( window.contentView().frame())
view.setDelegate(Self)
view.setLayout(CCAlignLeft | CCAlignTop | CCAlignWidthSizable | CCAlignHeightSizable)
'set the language to use in the current scintilla instance
'this must be done before the folding is initialized. Otherwise the folding does not show.
view.setLanguage(SCNBlitzMax.alloc().init())
'add scintilla to the windows content view
window.contentView().addSubView(view)
window.show()
'set the loaded text to scintilla
view.setText(testText)
'set some annotations
view.setAnnotation(4, "Hund~nKatze", "1")
view.setAnnotation(5, "Hundefutter~nKatzenfutter~nErdnuckelfutter", "2")
'set some indicators
view.indicatorSetStyle(1, INDIC_STRAIGHTBOX)
view.indicatorSetForegroundColor(1, CCColor.redColor())
view.indicatorSetCurrent(1)
view.indicatorFillRange(10,10)
view.indicatorFillRange(30,10)
view.setMultipleSelection(NO)
End Method
'use this delegate to initialize scintilla after changing the language (lexer)
Method scintillaDidChangeLanguage(view:SCNScintillaView, language:SCNLanguageDefinition)
'set word chars
view.setWordChars("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")
'enable caret line
view.setShowsCaret(YES)
'enable white spaces
view.setShowsWhiteSpaces(NO)
'disable linefeeds
view.setShowsLineFeeds(NO)
'initialize line-number margin
view.marginSetType(1, SC_MARGIN_NUMBER)
view.marginSetWidth(1, view.TextWidth(STYLE_LINENUMBER, "_99999"))
'initialize folding-margin
view.marginSetType(2, SC_MARGIN_SYMBOL)
view.marginSetMask(2, SC_MASK_FOLDERS)
view.marginSetWidth(2, 16)
view.marginSetSensitive(2, YES)
'initialize folding markers
view.markerDefine(SC_MARKNUM_FOLDER, SC_MARK_ARROW)
view.markerDefine(SC_MARKNUM_FOLDEROPEN, SC_MARK_ARROWDOWN)
view.markerDefine(SC_MARKNUM_FOLDEREND, SC_MARK_EMPTY)
view.markerDefine(SC_MARKNUM_FOLDERMIDTAIL, SC_MARK_EMPTY)
view.markerDefine(SC_MARKNUM_FOLDEROPENMID, SC_MARK_EMPTY)
view.markerDefine(SC_MARKNUM_FOLDERSUB, SC_MARK_EMPTY)
view.markerDefine(SC_MARKNUM_FOLDERTAIL, SC_MARK_EMPTY)
view.markerSetBackgroundColor(SC_MARKNUM_FOLDER, CCColor.grayColor())
view.markerSetForegroundColor(SC_MARKNUM_FOLDER, CCColor.grayColor())
view.markerSetBackgroundColor(SC_MARKNUM_FOLDEROPEN, CCColor.grayColor())
view.markerSetForegroundColor(SC_MARKNUM_FOLDEROPEN, CCColor.grayColor())
'set folding properties
view.setProperty("fold","1") 'enables folding
view.setProperty("fold.compact","0")
'enable indentation guides
view.setShowsIndentationGuides(YES)
End Method
'terminate application when last window is closed
Method applicationShouldTerminateAfterLastWindowClosed:Int()
Return YES
End Method
Method CCTextDidChangeNotification(notification:CCNotification)
End Method
End Type
'This is the language definition for BlitzMax
Type SCNBlitzMax Extends SCNLanguageDefinition
Function alloc:SCNBlitzMax()
Return New SCNBlitzMax
End Function
Method lexer:Int()
Return SCLEX_BLITZMAX
End Method
'returns YES if the char is a brace
Method charIsBrace:Int(char:Int)
Select char
Case 40,41,91,93,123,125
Return YES
End Select
Return NO
End Method
'returns YES if the char is a quote
Method charIsQuote:Int(char:Int)
Return char = 34
End Method
'returns YES on indentation of "Function", "Method" and "Type"
Method indentsForLine:Int(lineString:String)
Select lineString.Trim().split(" ")[0].toLower()
Case "function","method","type"
Return YES
End Select
Return NO
End Method
Method init:SCNBlitzMax()
Return Self
End Method
'returns YES if the current style is a comment
Method isComment:Int(style:Int)
Select style
Case SCE_BMX_MULTICOMMENT, SCE_BMX_COMMENT
Return YES
End Select
Return NO
End Method
'returns the keywords for a given lexer constant
'the list argument depends on the lexer.
'in BlitzMax list numbers are: 0 = SCE_BMX_KEYWORD ; 1 = SCE_BMX_KEYWORD2 ; 2 = SCE_BMX_KEYWORD3 ; 3 = SCE_BMX_KEYWORD4
'there can be up to 7 different keyword lists which depends on the lexer too.
Method keywords:String(list:Int)
Select list
Case 0
Return "function method type end local global if"
End Select
End Method
'returns YES if brace matching is supported
Method supportsBraceMatching:Int()
Return YES
End Method
Method supportsBraceCompletion:Int()
Return YES
End Method
'returns YES if indentation is supported
Method supportsIndentation:Int()
Return YES
End Method
'returns YES if indentation for language keywords is supported
Method supportsKeywordIndentation:Int()
Return YES
End Method
'returns YES if quote completion is supported
Method supportsQuoteCompletion:Int()
Return YES
End Method
'returns YES for unindentation of "EndFunction", "End Function", "EndMethod", "End Method"...
Method unindentsForLine:Int(lineString:String)
Local lineArray:String[] = lineString.Trim().toLower().split(" ")
Select lineArray[0]
Case "endfunction","endmethod","endtype"
Return YES
Case "end"
Select lineArray[1]
Case "function","method","type"
Return YES
End Select
End Select
Return NO
End Method
End Type
Heute mal ohne Bild, denn das lohnte sich nicht.
Grüße!
25 - Annotations und Brace-Matching
Hallo zusammen,
heute gibts noch nicht all zu viel zu berichten.
Annotations
Das ist eine Art Notiz, die zwischen Zeilen gequetscht wird.
Man kann bis zu 256 Annotation Style-Kategorien im SCNDefaultStyle anlegen. Sie sollten als Key folgenden Namen haben: "annotationStyle0" oder "annotationStyle12" usw.
BlitzMax: [AUSKLAPPEN]
SCNDefaultStyle.setKeywordStyle("annotationStyle0", CCColor.colorFromRGB($000000), NO, YES, NO, SC_CASE_MIXED, CCFont.systemFontOfSize(CCFont.smallSystemFontSize()), CCColor.colorFromRGB($efefef))usw... (Das YES soll übrigens heißen, dass das in Italic dargestellt werden soll. Macht die Sau aber nicht!)
Mit textView.setAnnotation(line, text, style) kann man dann den Style zuweisen. Dabei wird allerdings nur der Index angegeben. Bei den Beispielen also "0" oder "12". Sollte es mir irgendwann gelingen einen String auch in eine gültiges char array zu konvertieren, dann kann man für jeden Char einen eigenen Style angeben. Unnötig? Naja, man kann dann eben verschiedene Arten von Notizen zeilenweise unterschiedlich einfärben, oder dergleichen eben. Scintilla bietet das ja schon an, allerdings bekomme ich eben die Konvertierung nicht hin.
BlitzMax: [AUSKLAPPEN]
textView.setAnnotation(4, "Hund~nKatze", "1")
textView.setAnnotation(5, "Hundefutter~nKatzenfutter~nErdnuckelfutter", "2")
Brace-Matching
Naja, dazu gibt es nun echt nicht viel zu sagen. Scintilla vergleicht eben die Anzahl der einleitenden Klammern mit der Anzahl der schließenden Klammern und malt sie bunt, wenn es passt oder anders bunt wenn es nicht passt. Dazu kann für jeden Lexer ein String mit den Klammern gesetzt werden. Ist der String nicht vorhanden, wird eben das Brace-Matching nicht ausgeführt.
BlitzMax: [AUSKLAPPEN]
textView.setBraces(SCLEX_BLITZMAX, "()[]{}")
Das ist auch schon alles.
Grüße!
24 - Jetzt kommt Farbe ins Spiel!
Hallo zusammen,
nachdem ich jetzt mehrere Tage gehext habe, präsentiere ich nun die neusten Ergebnisse:
- Das Notification-System ist implementiert. Hier wird bei jeder kleinen Aktion von Scintilla die CCTextDidChangeNotification ausgelöst die eine Erweiterung der CCNotification-Klasse ist und alle Variablen des Scintilla eigenen SCNotification Structs enthält.
- Die Styles wurden noch mal komplett umgeschrieben. Es kann jetzt einen Style pro Lexer geben, der beim setzen des Lexers mittels scintilla.setLexer(LEXER) automatisch gesetzt wird. Dazu gibts noch einen Style, der die Umgebungs-Farben und Fonts enthält (z.B. Zeilennummerierung usw.)
- Die Keywords wurden ebenfalls noch mal angepasst. Auch die werden jetzt automatisch mit scintilla.setLexer(LEXER) gesetzt.
- Folding ist jetzt auch drin! Allerdings nur als Standbild, denn anklicken kann man da noch nichts.
- Da das Framework keinen BlitzMax Lexer hatte, habe ich den jetzt auch noch eingefügt. Hierbei habe ich mich unverschämter weise an Bruceys wxScintilla Lexer vergangen. Dieser wurde zwar für eine ältere Version von Scintilla geschrieben, konnte aber durch anpassen der Includes zum laufen gebracht werden. Ein zwei Änderungen daran habe ich allerdings auch noch vorgenommen. Folding für Rem-Blöcke und diverse Konstanten sind extra!
Ergebnis des ganzen:
BlitzMax: [AUSKLAPPEN]
SuperStrict
Framework cocoa.scintilla
Import brl.pngloader
'create global CCSampleController instance
Global controller:CCSampleController = New CCSampleController
'create global CCApplication instance
Global app:CCApplication = (New CCApplication).init()
'bind controller as delegate to the application
app.setDelegate(controller)
'start the applications main loop
app.run()
'Controller class
Type CCSampleController Extends CCObject
Global completions:TList
Field window:CCWindow
Field textView:SCNScintillaView
'use this method to initialize gadgets
Method CCApplicationDidFinishLaunchingNotification(notification:CCNotification)
'create some keywords for the BlitzBasic lexer
Local keyword:SCNKeyword
keyword = SCNKeyword.alloc().init(SCLEX_BLITZMAX, 0, "Function")
keyword = SCNKeyword.alloc().init(SCLEX_BLITZMAX, 0, "End")
keyword = SCNKeyword.alloc().init(SCLEX_BLITZMAX, 0, "Type")
keyword = SCNKeyword.alloc().init(SCLEX_BLITZMAX, 0, "If")
keyword = SCNKeyword.alloc().init(SCLEX_BLITZMAX, 0, "Local")
keyword = SCNKeyword.alloc().init(SCLEX_BLITZMAX, 0, "Int")
keyword = SCNKeyword.alloc().init(SCLEX_BLITZMAX, 0, "String")
'create the style for the BlitzBasic lexer
Local style:SCNStyle = SCNStyle.alloc().init()
style.setLexerStyle(SCLEX_BLITZMAX, CCFont.systemFontOfSize(CCFont.systemFontSize()), CCColor.textBackgroundColor(), CCColor.textColor())
style.setKeywordStyle(SCE_BMX_KEYWORD, CCColor.blueColor(), YES, NO, NO)
style.setKeywordStyle(SCE_BMX_NUMBER, CCColor.orangeColor(), NO, NO, NO)
style.setKeywordStyle(SCE_BMX_COMMENT, CCColor.grayColor(), NO, NO, NO)
style.setKeywordStyle(SCE_BMX_MULTICOMMENT, CCColor.grayColor(), NO, NO, NO)
style.setKeywordStyle(SCE_BMX_LABEL, CCColor.orangeColor(), NO, NO, NO)
style.setKeywordStyle(SCE_BMX_STRING, CCColor.greenColor(), NO, NO, NO)
style.setKeywordStyle(SCE_BMX_OPERATOR, CCColor.textColor(), NO, NO, NO)
style.setKeywordStyle(SCE_BMX_PREPROCESSOR, CCColor.orangeColor(), NO, NO, NO)
style.setKeywordStyle(SCE_BMX_COMPILER, CCColor.orangeColor(), NO, NO, NO)
'create window
Local frame:CCRect = CCMakeRect(0.0, 0.0, 640.0, 200.0)
window = CCWindow.documentWindow(frame)
window.setDelegate(Self)
window.setTitle(StripAll(AppFile))
window.center()
textView = SCNScintillaView.alloc().initWithFrame( window.contentView().frame())
textView.setDelegate(Self)
textView.setLayout(CCAlignLeft | CCAlignTop | CCAlignWidthSizable | CCAlignHeightSizable)
textView.setWordChars("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")
'enable caret line
textView.setShowsCaret(YES)
'enable white spaces
textView.SetShowsWhiteSpaces(YES)
'disable linefeeds
textView.setShowsLineFeeds(NO)
'enable line numbers
textView.setShowsLineNumbers(YES)
'enable folding margin
textView.setShowsFolding(YES)
'set the lexer (this applies the style and keywords for this lexer too)
textView.setLexer(SCLEX_BLITZMAX)
textView.setProperty("fold","1")
textView.setProperty("fold.compact","0")
window.contentView().addSubView(textView)
window.show()
'textView.setSelected(textView.positionFromLine(1)+3,textView.positionFromLine(1)+3)
'textView.autocomplete()
End Method
'terminate application when last window is closed
Method applicationShouldTerminateAfterLastWindowClosed:Int()
Return YES
End Method
'return a modified list of suggestions for auto-completion
Method scintillaViewCompletionsForPartialWord:TList(view:SCNScintillaView, word:String, suggestions:TList)
Return suggestions
End Method
'use this delegate to avoid completions in a unwanted range; return YES to allow completion, otherwise NO
Method scintillaViewShouldShowCompletionsForWordAtRange:Int(view:SCNScintillaView, word:String, range:CCRange)
Return YES
End Method
Method CCTextDidChangeNotification(notification:CCNotification)
Local scn:SCNNotification = SCNNotification(notification)
Select scn.code
Case SCN_PAINTED, SCN_UPDATEUI
Default
CCLog(scn)
End Select
End Method
End Type
Alles so schön bunt jetzt... So richtig funktioniert es eh noch nicht, aber daran wird weiter gearbeitet!
Nad dann, schönen Restsonntag wünsch ich noch,
buggy
23 - AutoCompletion und Keywords
Hallo zusammen,
letzterdings hab ich mich mal mit AutoCompletion in Scintilla auseinander gesetzt! Dazu benötigt es natürlich auch ein paar Keywords, aus denen Scintilla auswählen kann. Hierzu gibt es nun die SCNKeyword Klasse.
SCNKeyword wird in einem CCDictionary gespeichert das wiederum in einem Array mit der Lexer-Nummer abgelegt ist. Somit kann man x-beliebig viele Keywords pro Lexer definieren. SCNKeyword selbst beinhaltet ein paar Daten für Scintilla und evtl. Erweiterungen. Als Vorlage nahm ich hier die Keyword-Klasse von ChaosEdit, die auch den Link zur Hilfe, die Parameter der etwaigen Funktion, die Keyowrd-Konstante von Scintilla und die Beschreibung des Befehls enthält. Wie man das jetzt nutzt bleibt jedem selbst überlassen. Momentan werden Keywords noch nicht eingefärbt, aber das wird sich bald legen.
Eine Keyword-Definition könnte so aussehen...
BlitzMax: [AUSKLAPPEN]
Local keyword:SCNKeyword = SCNKeyword.alloc().init(SCLEX_BLITZBASIC, SCE_B_KEYWORD, "Erdnuckel")
... kann aber durch Subclassing von SCNKeyword top angepasst werden.
Nach den Keywords hab ich dann direkt AutoCompletion integriert. Dazu musste ich mir erst mal ein Update des scintilla.frameworks organisieren, weil in meinem veralteten Stand so einiges noch fehlte. Unter anderem auch die Table-View für die AutoCompletion-Liste...
BlitzMax: [AUSKLAPPEN]
'Den Cursor hinter die ersten drei Buchstaben von Hund bewegen...
textView.setSelected(textView.positionFromLine(1)+3,textView.positionFromLine(1)+3)
'Triggern der AutoCompletion-Liste
textView.autocomplete()
Yep! Yep! Das wars auch schon wieder...
buggy
P.S.: Kleiner Aufruf:
KLEPTOOOOOOO ich brauch noch mal deinen BlitzMax Lexer! Also die .cxx Datei... Hab den vom letzten mal verschlampt. :/
22 - Problem erkannt, Problem gebannt
Hallo zusammen,
einem Update auf XCode 4.3 und mehrfachem lesen der folgenden Threads von bb.com...
http://www.blitzbasic.com/Comm...opic=96997
http://www.blitzbasic.com/Comm...opic=96152
http://www.blitzbasic.com/Comm...opic=96562
...einem erneuten Downgrade auf XCode 4.2.1 und einem Upgrade auf BlitzMax 1.46 kann ich nun folgendes Berichten:
BlitzMax 1.44, auf dem ich bislang die Cocoa Module schrieb, funktioniert jetzt nicht mehr! XCode 4.3 und BlitzMax 1.46 funktionieren ebenfalls nicht zusammen, aber XCode 4.2.1 und BlitzMax 1.46 verrichten ihren Dienst wieder.
Die besagten Fehler blieben aber auch nach der Installations-Orgie erhalten... :/
Also hab ich mich noch mal durch den Code gefressen und mir ist aufgefallen, dass der Fehler immer nur dann Auftrat, wenn ich die Methode frame() aufgerufen habe. Komisch! Also mal die ganze Frame-Geschichte näher Untersucht. In core.m wurde ich dann fündig.
Statt:
Code: [AUSKLAPPEN]
objc_msgSend_stret(&result, obj, NSSelectorFromString(NSStringFromBBString(message)));
return CCRectFromNSRect(result);}
müsste es eigentlich:
Code: [AUSKLAPPEN]
return CCRectFromNSRect(result);
Na gut... Ich gebe zu, dass ich beides aus dem Netz gezogen habe ohne zu wissen, was ich da tu.
Wie dem auch sei, das Problem ist hiermit behoben! Warum die Fehlermeldung auf brl.reflections zeigte ist mir nach wie vor nicht klar, spielt aber auch keine Rolle mehr! Jedenfalls muss ich jetzt keine größeren Änderungen mehr vornehmen und kann weiter machen wie gehabt. \o/
Grüße
Gehe zu Seite 1, 2, 3, 4 Weiter



