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

Есть ли аналог TCreateParams ?


Вадим Смоленский

Вопрос

Опубликовано

В своем VCL-проекте я использовал оригинальный способ застраховаться от повторного запуска приложения. Обычно это делают через Mutex. Но умные люди на experts-exchange.com много лет назад посоветовали мне следующее:

// в главном окне:
protected
  procedure CreateParams(var Params: TCreateParams); override;

procedure TMyApp.CreateParams(var Params: TCreateParams);
begin
 inherited CreateParams(Params);
 Params.WinClassName:='MyAPP String ID';  
end;

// В файле .dpr:
var AWnd, A1Wnd: HWND;

AWnd:=FindWindow('MyApp String ID',nil);
if IsWindow(AWnd) then
   begin
    A1Wnd := GetWindow(AWnd, GW_OWNER);
    if IsWindow(A1Wnd) then AWnd := A1Wnd;
    ShowWindow(AWnd, SW_RESTORE);
    SetForegroundWindow(AWnd);
  end else
begin
  Application.Initialize;
  .......
end

Способ хорош тем, что он не просто блокирует повторный запуск, а выводит уже запущенное приложение на передний план, тычет юзера в него носом. Но при переходе на FireMonkey возникла закавыка: компилятору не нравится TCreateParams. Говорит: undeclared identifier. Чем бы его заменить?

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

  • 0
Опубликовано

Ну хорошо. Должен одинаково на всех платформах. Но ведь не зря существуют фишки вроде {$IFDEF MSWINDOWS}. Разве нельзя добиться, чтобы это или что-то похожее работало хотя бы только под Windows?

  • 0
Опубликовано

Вопрос снят! Я попробовал еще один вариант, тоже порекомендованный мне одним экспертом 13 лет назад, и он отлично работает - по крайней мере, под Windows. При попытке повторного запуска приложение выводится на передний план.

Там много кода, я не буду его здесь воспроизводить. Если кому-то интересно, то вот ссылка на обсуждение (советует эксперт SaLz):

https://www.experts-exchange.com/questions/21225893/Disabling-second-run.html#a12728730

  • 0
Опубликовано

Искать по класс нейму окно, и утверждать, что оно ваше - это 5 балов. Особенно по стандартному названию, как из примера.

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

В остальном vcl = firemonkey с некоторыми оговорками через ifdef. Поэтому нет проблемы код из vcl проекта использовать под firemonkey и наоборот. Если нужно win api - пара слов в uses, и всё что надо доступно. Нужен android api - тоже самое.
 

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить на вопрос...

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

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

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

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

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

×
×
  • Создать...