Перейти к содержанию
Fire Monkey от А до Я
  • 0

Ищу несколько кросс-платформенных компонентов


giveaway

Вопрос

Пишу приложение, которое будет распространяться и для Винды, и для Мака. Под Винду все легко найти/сделать, а вот чтобы было кросс-платформенно - здесь трудности.

Итак нужно чем:

1) Осуществить контроль, что приложение запущено в единственном экземпляре (не давать запускать еще один такой же процесс)

2) Чем проверить, не сидит ли юзер за локальным прокси, чтобы в этом случае выдавать ему окно для ввода логина/пароля для допуска в Интернет

3) Чем определить кол-во свободного места на диске

Заранее благодарю!

 

Ссылка на комментарий

Рекомендуемые сообщения

  • 0
15 часов назад, giveaway сказал:

Пишу приложение, которое будет распространяться и для Винды, и для Мака. Под Винду все легко найти/сделать, а вот чтобы было кросс-платформенно - здесь трудности.

Итак нужно чем:

1) Осуществить контроль, что приложение запущено в единственном экземпляре (не давать запускать еще один такой же процесс)

2) Чем проверить, не сидит ли юзер за локальным прокси, чтобы в этом случае выдавать ему окно для ввода логина/пароля для допуска в Интернет

3) Чем определить кол-во свободного места на диске

Заранее благодарю!

 

Сильно я вам не подскажу, но программирую для винды и мака тоже. То что вы простите, это не компоненты, а функции. С прокси в маке я проблему просто решил. Даже по тупому. Просто в настройках пользователь сам указывает прокси и все. Есть в настройках - лезу по прости. Нет в настройках - не лезу. Но если нет интернета, по пишу сообщение, что сети нет, а не проси ли у вас?

Вопрос 1 - самого интересует

Вопрос 3 - скорее всего никак - ручками.

Изменено пользователем Vitaldj
Ссылка на комментарий
  • 0
27 минут назад, Vitaldj сказал:

Вопрос 1 - самого интересует

Для Windows как и в VCL можно использовать Mutex-ы:

// в dpr-е
uses
  FMX.Forms,
  Winapi.Windows,
  ...

{$R *.res}

var MUT: THandle;

begin
  MUT := OpenMutex(MUTEX_ALL_ACCESS, false, 'MySuperProgram');
  if MUT <> 0 then Application.Terminate;
  if MUT = 0 then  MUT := CreateMutex(nil, false, 'MySuperProgram');

  Application.Initialize;
  ...

 

Ссылка на комментарий
  • 0
  • Модераторы
16 часов назад, giveaway сказал:

1) Осуществить контроль, что приложение запущено в единственном экземпляре (не давать запускать еще один такой же процесс)

чтобы прям кросс, думаю такой код подойдёт

function StartGranted: boolean;
// uses  System.IOUtils
begin
  Result := not TFile.Exists(TPath.Combine(TPath.GetDocumentsPath, 'IamStarted'));
  TFile.WriteAllText(TPath.Combine(TPath.GetDocumentsPath, 'IamStarted'), '');
end;

в dpr пишем

begin
  if StartGranted then
  begin
    Application.Initialize;
    Application.CreateForm(TForm2, Form2);
    Application.Run;
  end;
end.

ну и в дестрое главной формы

procedure TForm2.FormDestroy(Sender: TObject);
//uses  System.IOUtils;
begin
  TFile.Delete(TPath.Combine(TPath.GetDocumentsPath, 'IamStarted'));
end;

Но это не точно, может есть и  аналог mutex'a в MacOS

Ссылка на комментарий
  • 0
2 часа назад, Vitaldj сказал:

Просто в настройках пользователь сам указывает прокси и все.

Т.е. если юзер не зашел/не увидел, что в программе надо самому настроить прокси, то он сам и виноват?)))

Ссылка на комментарий
  • 0

По 1-му вопросу для MacOS:

function CheckRunning: Boolean;
var
  sl: TStringList;
  iCount: Integer;
  s: String;
begin
  sl := TStringList.Create;
  try
    GetRunningAplications(sl);

    iCount := 0;
    for s in sl do
      if SameText(s, APP_BundleID) then  //  APP_BundleID - константа с BundleID приложения
        Inc(iCount);
        
    Exit(iCount < 2)
  finally
    sl.Free;
  end;
end;

procedure GetRunningAplications(AList: TStrings);
var
  WorkSpace: NSWorkSpace;
  App: NSRunningApplicationEx;
  i: Integer;
  list: NSArray;
begin
  WorkSpace := TNsWorkspace.Wrap(TNsWorkSpace.OCClass.SharedWorkspace);
  list := Workspace.runningApplications;
  if (list <> nil) and (list.count > 0) then
  begin
    for i := 0 to list.count-1 do
    begin
      App := TNSRunningApplicationEx.Wrap(list.objectAtIndex(i));
      if App.bundleIdentifier <> nil then
        AList.Add(string(App.bundleIdentifier.UTF8String))
      else
        AList.Add(String(App.executableURL.path.UTF8String));
    end;
  end;
end;

Ответ на 3-ий вопрос сам уже долго ищу

Изменено пользователем dnekrasov
Ссылка на комментарий
  • 0

Коллеги, по вопросу с прокси сервером вот что получается.

Использую компонент TIdHTTP. Для приложения под Винду делаю посредством TIdHTTP запрос в Сеть, если меня "обругивают", то я инициализирую открытие окна для заполнения настроек прокси-сервера. Если туда все правильно вбить, то соединение устанавливается норм.

А вот в случае с Маком TIdHTTP не возвращает никакой "ругани", а просто подвисает. Ну думаю ладно, сделаю сразу вывод окна настроек прокси. Ввожу их и такая же песня - TIdHTTP висит, соединения нет. Может он не очень кросс-платформенный?))

 

 

Ссылка на комментарий
  • 0
11 минуту назад, giveaway сказал:

Коллеги, по вопросу с прокси сервером вот что получается.

Использую компонент TIdHTTP. Для приложения под Винду делаю посредством TIdHTTP запрос в Сеть, если меня "обругивают", то я инициализирую открытие окна для заполнения настроек прокси-сервера. Если туда все правильно вбить, то соединение устанавливается норм.

А вот в случае с Маком TIdHTTP не возвращает никакой "ругани", а просто подвисает. Ну думаю ладно, сделаю сразу вывод окна настроек прокси. Ввожу их и такая же песня - TIdHTTP висит, соединения нет. Может он не очень кросс-платформенный?))

 

 

Ну если работает, то это уже кросс платформенный)) я тоже им пользуюсь. Хотя часть кода уже перевел на другой компонент. И старый наверно потихоньку переведу. NetHttp

Ссылка на комментарий
  • 0
13 минуты назад, Vitaldj сказал:

Ну если работает, то это уже кросс платформенный))

Так нормально работает только для Винды, а под Маком куда-то улетает в бесконечность))

А NetHTTP кросс-платформенный аналог TIdHTTP? С ним можно обспечить протокол HTTPS?

Изменено пользователем giveaway
Ссылка на комментарий
  • 0
  • Модераторы
12 минуты назад, giveaway сказал:

С ним можно обспечить протокол HTTPS?

да, T(Net)HTTPClient как раз и работает адекватно на всех платформах

40 минут назад, giveaway сказал:

А вот в случае с Маком TIdHTTP не возвращает никакой "ругани", а просто подвисает

при запуске проверить функцией CheckInet, если нету доступа показать окно с прокси

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

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