Carbon interface internals/de
│ Deutsch (de) │ English (en) │
Dieser Artikel behandelt ausschließlich macOS.
Siehe auch: Multiplatform Programming Guide/de
Dieser Artikel behandelt ausschließlich iOS.
Siehe auch: Multiplatform Programming Guide/de
Diese Seite bietet einen Überblick über die LCL Carbon Schnittstelle für Mac OS X und soll neuen Entwicklern helfen.
Für die Installation und Erzeugung einer ersten Carbon Anwendung lesen sie zunächst Carbon Interface.
Dokumentation über Carbon
"Learning Carbon" sample book chapter
Die Carbon API unit von FreePascal ist FPCMacOSAll.pas in /usr/local/share/fpcsrc/packages/extra/univint.
Carbon Schnittstelle Entwicklungs-Grundlagen
- Die Mac OS X Zielversion ist 10.4
- Vermeiden sie die Verwendung von veralteten oder ausgemusterten APIs und Funktionen (z.B. QuickDraw vs. Quartz 2D)
- Verwenden sie den Objektansatz
- Prüfen sie die Ergebnisse von Carbon Aufrufen mit der OSError Funktion
- erwenden Sie UTF-8 kodierte Zeichenketten zwischen LCL und dem Carbon widgetset (für zukünftige Lazarus Unicode Unterstützung)
Was funktioniert bereits ?
- Features - siehe Roadmap#Status_of_features_on_each_widgetset
- Formulare und Bedienelemente - siehe Roadmap Widgetset dependent components
- Erstellen von TOpenGLControl mit AGL Kontext (siehe components/opengl/)
- Maus Ereignisse
- Tastatur Ereignisse (VK_ mapping für fremde Tastaturen muss noch getestet werden)
Was muss als nächstes getan werden ?
Item | Anmerkung | Abhängigkeiten | Verantwortlich |
---|---|---|---|
Mouse Capture releasing | |||
TBrush Patterns | CGPatternCreate | ||
StretchMaskBlt | Implement: ROP, stretch mode | ||
TCalendar | no counterpart | ||
TFontDialog | FPShowHideFontPanel | Tombo | |
TListView | CreateDataBrowserControl | Tombo | |
TScrollBox, TCustomControl with scrollbars, TScrollingWinControl | HIScrollViewCreate | Tombo | |
IDE form designer | kOverlayWindowClass | ||
TPageSetupDialog | PMSessionPageSetupDialog | ||
TPrintDialog, TPrinterSetupDialog | PMSessionPrintDialog |
Bugs
Item | Anmerkung | Abhängigkeiten | Verantwortlich |
---|---|---|---|
TCustomControl - keyboard focus | |||
TCustomEdit.CharCase | Is ignored when typing text | ||
TMemo.WordWrap | persistent bug, when word wrap is disabled the memo doesn't scroll to caret | ||
TMaskEdit | Every typed char is doubled | ||
TStringGird | Crashes sometimes when userinput is to fast |
Carbon IDE Bugs
Item | Anmerkung | Abhängigkeiten | Verantwortlich |
---|---|---|---|
Synedit | 1. Font metrics 2. No caret | ||
Mouse | Wrong position is reported when mouse over component toolbar | ||
PageControl | No arrows to switch tabs | ||
PageControl | IDE crash when quit appears to be related to PageControl | ||
ListView | IDE crash in dialogs that use TListView (not yet implemented) | ||
Bitmap stretching | Help->About lazarus dialog shows image bigger than needed | ||
'...' buttons in dialogs | When button is too small '...' text painted at the bottom of button | ||
OK/Cancel | Many dialogs have non-Mac check-X glyphs | ||
Compiler Options | Missing controls on Linking tab | ||
Snapshot | Symlink in lazarus.app is broken | ||
Menu bar | Too wide for 1024x768 display resolution | ||
Lazarus menu | Help About and app prefs (Environment options) should be accessible here | ||
Installed Packages | Package Info box not tall enough | ||
Form designer | Selected control doesn't show any visual change | ||
Open Package File | Filter (*.lpk) is ignored. |
Kompatibilitätsprobleme
Tastatur
- Apple Command key is mapped to ssCtrl due to Apple Guidelines
- Apple control key is mapped to ssMeta
- Apple option key is mapped to its inscription, i.e. ssAlt
- Virtual key codes mapping (depends on keyboard language layout!)
- Shortcuts indication (ampersand)
Zeichnen auf dem Canvas außerhalb eines OnPaint Events
- wird nicht implementiert werden
Drawing on screen device context
- wird nicht implementiert werden
TControl.Color
- der Hintergrund von Carbon Bedienelementen ist transparent
Wie man ein neues Bedienelement hinzufügt
Zum Beispiel TButton.
TButton wird definiert in lcl/buttons.pp. Dies ist der plattformunabhängige Teil der LCL, welcher vom normalen LCL Programmierer benutzt wird.
Seine widgetset Klasse befindet sich in lcl/widgetset/wsbuttons.pp. Dies ist die plattformabhängige Basis für alle widgetsets (carbon, gtk, win32, ...).
Seine Carbon Schnittstellenklasse ist in lcl/interfaces/carbon/carbonwsbuttons.pp:
TCarbonWSButton = class(TWSButton) private protected public class function CreateHandle(const AWinControl: TWinControl; const AParams: TCreateParams): TLCLIntfHandle; override; end;
Jede WS Klasse, die tatsächlich etwas implementiert, muss registriert werden. Schauen sie sich den initialization Abschnitt am Ende der carbonwsXXX.pp Unit an:
RegisterWSComponent(TCustomButton, TCarbonWSButton);
TCarbonWSButton setzt CreateHandle außer Kraft und erzeugt eine Carbon-Schaltfläche-Helfer-Klasse namens TCarbonButton in carbonprivate.pp, die die Schaltfläche in Carbon erzeugt und die Event-Handler installiert.