Soms wil je dat jouw programma verbonden wordt met een bepaald bestandstype. Dus gewoon dubbel klikken van een bestand zorgt ervoor dat of jouw programma gestart wordt en het bestand wordt geladen, of dat als het programma al openstaat dat het betreffende bestand wordt geladen.
Dus ... hoe doen we dat onder MacOS X met Lazarus Pascal?
We hebben hier 2 stappen voor nodig.
1) Zorg ervoor dat jouw Mac het bestandstype met jouw applicatie associeert.
We doen dit door de Info.plist van jouw applicatie aan te passen - je vindt het door de applicatie package met rechts aan te klikken en te kiezen voor "Show package content" (een package is in feite een directory met de ".app" extensie welke MacOS X anders behandelt en weergeeft als een enkel bestand).
In de "Contents" folder vindt je dan de Info.plist file. Je kunt dit bestand met een tekst editor bewerken. Ik adviseer om eens naar TextWrangler te kijken, het is gratis in de Apple AppStore.
In de Info.plist, vindt je zoiets als dit:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
... // voor de leesbaarheid wat regels weggelaten
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
<key>CFBundleTypeOSTypes</key>
<array>
<string>fold</string>
<string>disk</string>
<string>*</string>
</array>
</dict>
</array>
<key>CFBundleIconFile</key>
<string>icon.icns</string>
<key>NSHighResolutionCapable</key>
<true/>
</dict>
</plist>
<array>
Hier moeten we een variable toevoegen. In mijn voorbeeld gebruik ik de extensie ".myextension".
Hiervoor moeten we de variable "CFBundleTypeExtensions", zoals je hieronder ziet, toevoegen. Vergeet niet dat de extensie ZONDER puntje ingevoerd moet worden. Meer plist informatie kan hier worden gevonden.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
... ///Voor de leesbaarheid even wat regels weggelaten
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
<key>CFBundleTypeExtensions</key>
<array>
<string>myextension</string>
</array>
<key>CFBundleTypeOSTypes</key>
<array>
<string>fold</string>
<string>disk</string>
<string>*</string>
</array>
</dict>
</array>
<key>CFBundleIconFile</key>
<string>icon.icns</string>
<key>NSHighResolutionCapable</key>
<true/>
</dict>
</plist>
<array>
2) Zorg ervoor dat jouw applicatie het bestand ook echt opent als MacOS X daarom vraagt.
Vroeger in Turbo Pascal (en Delphi) dagen, kon je hiervoor "ParamStr" gebruiken, maar dat werkt onder MacOS X gewoon niet.
Zet als eerste de property "AllowDropFiles" van jouw hood Form op TRUE.
Plaats vervolgens een TApplicationProperties op het TForm, en zet de "OnDropFiles" event. Bij dit event worden er filename(s) doorgegeven.
procedure TForm1.ApplicationProperties1DropFiles(Sender: TObject; const FileNames: array of String);
begin
if Length(Filenames)>0 then
begin
LoadMyFile(Filenames[0]);
// and do whatever is needed to handle the file
end;
end;
Ik ga in dit voorbeeld ervan uit dat er maar 1 bestand gestuurd wordt, maar Filenames kan meerdere bestanden bevatten.
Testen is wat lastiger, ik moest de gecompileerde applicatie naar de Applications folder slepen en daar een keer starten. Meteen daarna zie je dat de Finder nu het betreffende bestandsformaat meteen met jouw applicatie opent of dat jouw applicatie in de "Openen met" lijst verschijnt.