Вопросы

Доброго времени суток, форумчане!

Есть программка, которая имеет свой конфиг. И если на винде, я могу спокойно складировать этот конфиг в папку C:\ProgramData, то с маком всё сложнее. Просто так записать конфиг и папку в /Library/Application Support/ не получится, требуются права администратора. Замучавшись с попытками сохранения конфига в эту папку, я решила пойти другим путём и заставила программу сохранять этот конфиг (вместе с последующими генерируемыми программой файлами) внутрь себя (MyProgramm.app/Contents/MacOS). Первое время всё работало нормально, файлы сохранялись, генерировались в саму программу. Но, как обычно бывает, что-то пошло не так и... В результате, сейчас я имею то, что программа при первом запуске из RAD генерирует первый конфиг в себя (MyProgramm.app/Contents/MacOS/Config.cfg), запускается при запуске из RAD. НО, стоит мне запустить её независимо от студии (в надеждах, что она считает конфиг внутри себя, как она делала раньше), как она просто падает. Добавив небольшое ShowMessage(FileExists('Config.cfg').ToString()); в качестве отладки, я узнаю, что она падает из-за того, что НЕ МОЖЕТ НАЙТИ ФАЙЛ КОНФИГА, ЧТО НАХОДИТСЯ В НЕЙ САМОЙ. Затем, методом тыка было обнаружено, где именно он пытается найти этот файл - в корне диска с системой. Вопрос к вам, как пофиксить это дерьмо? 

Сразу скажу, код со вчерашнего дня вообще не менялся. Фрагмент работы с конфигом я приложила ниже.

procedure TForm1.FormCreate(Sender: TObject);
var
	PRGP, OUTP: String;
    i: Integer;
begin
{тут находится код для MSWINDOWS}
{$IFDEF POSIX}
AssignFile (CFG, 'AErenderConfiguration.cfg');			//Привязка файла, что по идее должен быть внутри софта
if FileExists ('AErenderConfiguration.cfg') then		//Тут ошибка вылезает, потому что он не может найти файл в корне диска
	begin												//Чтение самого конфига
    	Reset (CFG);
        Readln (CFG, LANG);
        Readln (CFG, PRGP);
        Readln (CFG, OUTP);
        Readln (CFG, AERPATH);
        Readln (CFG, DEFPRGPATH);
        Readln (CFG, DEFOUTPATH);
        projectPath.Text := PRGP;
        outputPath.Text := OUTP;
        Lang1.Lang := LANG;
        CloseFile (CFG);
    end
else
	begin		//Действия, если конфиг не существует. Тоже ошибка, потому что в macOS корень диска заблокирован для записи.
    	Rewrite (CFG);
        for i := 1 to 6 do
        	Writeln (CFG, ' ');
        LANG := 'EN';
        Lang1.Lang := LANG;
        CloseFile (CFG);
    end;
{$ENDIF POSIX}

RAD Studio 10.3 Rio (26.0.32429.4364), PAServer 20.0, macOS 10.13.6 High Sierra (MacBook 13" Mid 2010). 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 ответа на этот вопрос

  • 0
19 часов назад, Равиль Зарипов (ZuBy) сказал:

попробуйте указать


./AErenderConfiguration.cfg

Попробовала - та же проблема. Первый запуск нормально, последующие - пытается найти файлы в корне диска.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 1

Добрый день. А вы не пробовали указывать не только имя файла, но и путь к нему? Я недавно с FM познакомился, не самый большой специалист по Маку ), но я бы не полагался на указание файла без каталога. У меня сделано так, например:

function GetAppPath(): string;
begin
    Result := TPath.GetDirectoryName(ParamStr(0));
end;
 

function MakeSettingsFileName(aInsideApp: boolean): string;
var
    lFileName: string;
begin
    lFileName := TPath.GetFileNameWithoutExtension(ParamStr(0)) + '.ini';
    if (aInsideApp) then
        Result := GetAppPath()
    else
        Result := TPath.GetDocumentsPath();
    Result := TPath.Combine(Result, lFileName);
end;

Смысл такой: поскольку приложение в macOS распространяется через dmg-пакет, я включаю конфигурационный файл внутрь Program.app, как раз в папку Contents/MacOS/, чтобы программе было с чем запуститься в первый раз (всяческие настройки соединения с сервером, БД, ну вы понимаете). В самой программе, я сначала делаю проверку наличия конфигурационного файла, сформировав путь до него вызовом функции MakeSettingsFileName(false). В этом случае, конф. файл ищется в каталоге Документы. Это, на самом деле, не так и важно, где он может лежать снаружи, идея тут в том, что в процессе работы конф. файл меняется и при выходе из программы всегда сохраняется снаружи, чтобы иметь возможность пользоваться им после замены dmg-пакета и инсталляции новой версии программы, которая опять будет содержать внутри себя "пустой" конф. файл. Если файл снаружи не нашелся, формируем повторным вызовом MakeSettingsFileName(true) путь к нему "внутри". Надеюсь, что понятно объяснил.

Изменено пользователем Andrey Yakovlev

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Похожий контент

    • От long_island
      Всем привет. Встал вопрос после обновления MacOS до High Sierra. Ранее для работы приложения через https из коробки работал Indy в RAD Studio 10.0. После обновления MacOS стала появляться ошибка о невозможности подгрузить библиотеку OpenSSL. Понял, что в обновленной MacOS теперь используется LibreSSL и из коробки теперь не работает. Перерыл тонну материала, но вопрос остался не решенным. Надеюсь, что кто - то имеет какие - то догадки в этом направлении.
    • От AliZairov
      Привет. Я сделал macos установку web installer с Delphi Berlin.

      Программа дает .bpl ошибка открытия файла.

    • От notricky
      Собственно зазипованый файл качается, разархивируется и все файлы помещаются в папку.
      Ну а дальше приложение не запускается, хотя:
       - Настройки безопасности настроены на установку из любых мест
       - Встроенный архиватор разархивирует в папку и "из-под" него приложение запускается (до настроек безопасности просто выдавало ошибку "неизвестный автор" и "у вас настроено только на аппстор или известных авторов").
       - Разумеется при деплое приложения работают. Если их просто скопировать на флешку и потом закопировать обратно - тоже работают.
      Следовательно проблема при разархивировании программно. Что-то нужно добавить. Есть понимание что именно? 
      Сам нетривиальный код:
      var z: TZipFile; begin try {$IFDEF MSWINDOWS} RenameFile(ParamStr(0),ExtractFileName(ParamStr(0)) + '.old'); Application.ProcessMessages; {$ENDIF} SetLength(Result, 1); Result[0] := ''; z := TZipFile.Create; z.Open(ZipFile, zmRead); z.ExtractAll(ExtractTo); Result := z.FileNames; finally z.Close; z.Free; end; end; В архив кладу:
       - .app взятый с мака (а по другому никак)
       - .entitlements
       - .DS_Store 
      В надобности последнего я сильно сомневаюсь.
       
    • От Alex7wrt
      На MacOS и iOS вылетает приложение при попытке чтения из ресурса.
      Этот код нормально работает на Windows и Android, а на MacOs и iOS приводит к вылету приложения.
      procedure TForm1.Button1Click(Sender: TObject); var rs: TResourceStream; begin rs:=TResourceStream.Create(0,'png1',PChar(RT_RCDATA)); image1.Bitmap.LoadFromStream(rs); rs.Free; end;
      В чем может быть причина?
    • От Alex7wrt
      Добрый день.
      Пытаюсь запустить приложение на IOS симуляторе. При компиляции выскакивает сообщение:

      При этом на MacOS приложения запускаются нормально.
      В чем может быть проблема?
      Berlin Update 1. XCode 8.1. PAServer 18.0
    • От Равиль Зарипов (ZuBy)
      DeviceInfo - модуль для получения информации о девайсе
      Android || Windows || IOS || MAC OS
        

      Intel планшет

      для Андроида нужно включить разрешения (permission)
      Ссылка на GitHub
    • От Равиль Зарипов (ZuBy)
      Шаблон проекта с кастомным шрифтом FontAwesome
      Намного удобней и менее затратно использовать Шрифт с Иконками, чем заботиться о качестве картинок, скейлах, их хранении и загрузке
      Поэтому давно перешел на шрифты, пару скриншотов (без использования картинок)

      Seattle CustomFont.7z
      Berlin CustomFont(Berlin).zip
       
      WINDOWS/MACOS - установить шрифт в систему
      IOS - в деплой добавить шрифт и с помощью IOS9Fix прописать в .plist следующее:
      ANDROID - в деплой добавить шрифт (Remote Path -> assets\internal) и подключить к проекту измененные файлы FMX.FontGlyphs.Android.pas, FMX.FontGlyphs.pas
    • От AndreyS
      Доброго всем дня! У меня в  самый неподходящий момент возникла следующая проблема:
       
      Есть приложение для Win и Mac. Работает с SQLite (Через FDQuery).
      Естественно, в базе куча данных с кириллицей. Так вот, на Win - все нормально, на одном Mac(10.10) - тоже все хорошо. Попробовал поставить на второй Mac(10.9.5) - b и вот там уже начались проблемы с кодировкой. Причем, читает из таблицы 
      S := Query.FieldByName('Title').AsString; //Без проблем а вот при записи в таблицу
      Query.ParamByName('Title').AsString := 'Заголовок'; В таблицу записывается '????????' (Причем именно запись идет неправильно). При подключении к базе Указываю, что StringFormat=Unicode.
       
      Может кто-то сталкивался с таким уже?
       
      Есть подозрения, что на 10.9.5 какая-то старая dylib, которая неправильно работает с кириллицей. тогда, наверное, нужно подключать свою к приложению, но опять же, где ее взять и как подключить? 
    • От AndreyS
      Друзья, подскажите, пожалуйста, каким образом можно ассоциировать программу для MacOS c с определенным типом файлов? Таким образом, чтобы при двойном клике выбранный файл открывался именно в этой программе. Для Windows это делается просто, прописываешь в реестр нужные ключи (при установке) и обрабатываешь через ParamStr(1). Но для маков, насколько я знаю, это все происходит по-другому сценарию. В инете нашел инструкцию как это сделать (https://delphihaven.wordpress.com/2012/08/10/associating-a-file-type-on-osx-part1/), но там для XE2, сейчас многое уже поменялось даже в реализации основного интерфейса от которого идет вся работа. Может кто-то знает как теперь правильно все это реализовать?
       
      Заранее благодарен.
    • От Vitaldj
      Добрый день. Несколько дней пытался решить вопрос с использованием embedded сервера в программе на fmx. Пробую писать универсальную программу под win32/64 и MacOs. Использую компоненты mydac. При компиляции под виндовс проблем не возникает, в директорию ложу и libmysqld.dll и все нужные файлы (data и тд.). Встроенная в приложение база данных работает без нареканий. И совсем ничего не получается под MacOs. В дистрибьютиве mysql под MacOs не нахожу файл встроенной библиотеки libmysqld.dylib  (перерыл все директории). Так же пытался переименовывать разные файлы-библиотеки на libmysqld.dylib - безрезультатно. Дельфи говорит об ошибке. Ну типи того, что файл (библиотека) не тот, не может найти вход и все такое. Что делать? Где взять libmysqld.dylib? Помогите, без этого смысл писать на FMX не вижу ((((
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу