• 0
giveaway

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

Вопрос

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

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

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

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

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

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

 

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


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

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

  • 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;
  ...

 

Vitaldj и Равиль Зарипов (ZuBy) понравилось это

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


Ссылка на сообщение
Поделиться на других сайтах
  • 0
2 минуты назад, Rusland сказал:

uses FMX.Forms, Winapi.Windows, ...

winapi в маке?

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


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

Я же написал, что для Windows. Директивы никто не отменял. Для мака нужно искать другое решение

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

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


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

А пропустил, что вы для windows написали. Так в windows у меня есть код. Вопрос как это в маке сделать. 

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


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

 

8 минут назад, Vitaldj сказал:

А пропустил, что вы для windows написали. Так в windows у меня есть код. Вопрос как это в маке сделать. 

да я уж понял))

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


Ссылка на сообщение
Поделиться на других сайтах
  • 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

giveaway и Rusland понравилось это

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


Ссылка на сообщение
Поделиться на других сайтах
  • 0
2 часа назад, Vitaldj сказал:

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

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

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


Ссылка на сообщение
Поделиться на других сайтах
  • 0
1 час назад, giveaway сказал:

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

Точно!

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


Ссылка на сообщение
Поделиться на других сайтах
  • 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
giveaway и Rusland понравилось это

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


Ссылка на сообщение
Поделиться на других сайтах
  • 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, если нету доступа показать окно с прокси

Rusland, Kitty и Vitaldj понравилось это

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


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

Создайте аккаунт или войдите для комментирования

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

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу