Mac Preferences Read and Write

From Lazarus wiki
Logo OSX.png

This article applies to macOS only.

See also: Multiplatform Programming Guide

For those who want to read and write preferences for a macOS application, this can be done using the following methods:

CODE FOR READING PREFERENCES
  uses MacOSAll, CFPreferences;

  var
    IValid: Boolean;
    Pref: Integer;

  procedure TForm1.FormCreate(Sender: TObject);
  begin
    try
       Pref := CFPreferencesGetAppIntegerValue(CFStr('Check1'),kCFPreferencesCurrentApplication,IValid);
       if (Pref = 1) then
       begin
          CheckBox1.Checked := true;
       end
       else begin
          CheckBox1.Checked := false;
       end;
       Pref := CFPreferencesGetAppIntegerValue(CFStr('Check2'),kCFPreferencesCurrentApplication,IValid);
       if (Pref = 1) then
       begin
          CheckBox2.Checked := true;
       end
       else begin
          CheckBox2.Checked := false;
       end;
       Pref := CFPreferencesGetAppIntegerValue(CFStr('Check3'),kCFPreferencesCurrentApplication,IValid);
       if (Pref = 1) then
       begin
          CheckBox3.Checked := true;
       end
       else begin
          CheckBox3.Checked := false;
       end;
       Pref := CFPreferencesGetAppIntegerValue(CFStr('Check4'),kCFPreferencesCurrentApplication,IValid);
       if (Pref = 1) then
       begin
          CheckBox4.Checked := true;
       end
       else begin
          CheckBox4.Checked := false;
       end;
    except
      on E : Exception do
        ShowMessage(E.ClassName+' error raised, with message : '+E.Message);
    end;
  end;


CODE FOR WRITING PREFERENCES
  uses MacOSAll, CFPreferences;

  var
    ItemName: CFStringRef;
    ItemVal: CFPropertyListRef;

  procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
  begin
    try
       if (CheckBox1.Checked) then
       begin
          ItemName := CFStr('Check1');
          ItemVal := CFStringCreateWithPascalString(kCFAllocatorDefault,'1',kCFStringEncodingUTF8);
          CFPreferencesSetAppValue(ItemName,ItemVal,kCFPreferencesCurrentApplication);
       end
       else begin
          ItemName := CFStr('Check1');
          ItemVal := CFStringCreateWithPascalString(kCFAllocatorDefault,'0',kCFStringEncodingUTF8);
          CFPreferencesSetAppValue(ItemName,ItemVal,kCFPreferencesCurrentApplication);
       end;
       if (CheckBox2.Checked) then
       begin
          ItemName := CFStr('Check2');
          ItemVal := CFStringCreateWithPascalString(nil,'1',kCFStringEncodingUTF8);
          CFPreferencesSetAppValue(ItemName,ItemVal,kCFPreferencesCurrentApplication);
       end
       else begin
          ItemName := CFStr('Check2');
          ItemVal := CFStringCreateWithPascalString(kCFAllocatorDefault,'0',kCFStringEncodingUTF8);
          CFPreferencesSetAppValue(ItemName,ItemVal,kCFPreferencesCurrentApplication);
       end;
       if (CheckBox3.Checked) then
       begin
          ItemName := CFStr('Check3');
          ItemVal := CFStringCreateWithPascalString(kCFAllocatorDefault,'1',kCFStringEncodingUTF8);
          CFPreferencesSetAppValue(ItemName,ItemVal,kCFPreferencesCurrentApplication);
       end
       else begin
          ItemName := CFStr('Check3');
          ItemVal := CFStringCreateWithPascalString(kCFAllocatorDefault,'0',kCFStringEncodingUTF8);
          CFPreferencesSetAppValue(ItemName,ItemVal,kCFPreferencesCurrentApplication);
       end;
       if (CheckBox4.Checked) then
       begin
          ItemName := CFStr('Check4');
          ItemVal := CFStringCreateWithPascalString(kCFAllocatorDefault,'1',kCFStringEncodingUTF8);
          CFPreferencesSetAppValue(ItemName,ItemVal,kCFPreferencesCurrentApplication);
       end
       else begin
          ItemName := CFStr('Check4');
          ItemVal := CFStringCreateWithPascalString(kCFAllocatorDefault,'0',kCFStringEncodingUTF8);
          CFPreferencesSetAppValue(ItemName,ItemVal,kCFPreferencesCurrentApplication);
       end;
       CFPreferencesAppSynchronize(kCFPreferencesCurrentApplication);
     except
     on E : Exception do
         ShowMessage(E.ClassName+' error raised, with message : '+E.Message);
     end;

Prefs1.png


See also