Перейти к содержанию
  • Регистрация
  • 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

Нет, аналога нет. Так как кода должен одинаково работать на всех платформах, а CreateParams сугубо виндовая вещь.

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


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

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


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

Который из вариантов вызвал ваш сарказм: процитированный в исходном посте или доступный по ссылке в последнем комментарии?

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


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

Я на форуме где-то выкладывал такое решение, но по быстрому найти не смог

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


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

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

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

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

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

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

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

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

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


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

    • От Вадим Смоленский
      Наверное, детский вопрос задам, и все-таки. Вдруг обнаружил, что в моем проекте никакие блоки try...except не срабатывают. Видимо, дело в каких-то настройках — но в каких именно? Иду в Options => Debugger Options => Embarcadero Debuggers => Native OS Exceptions, пробую там менять установки, толку никакого. Более того — пытаюсь искусственно спровоцировать падение делением на ноль — и вообще никакого падения не происходит, деление на ноль дает ноль! Такая же примерно ерунда с попыткой устроить переполнение.
      Ткните меня в причину носом кто-нибудь, пожалуйста.
      UPD  Через два дня хаотичных экспериментов с настройками всё прочихалось, и exceptions благополучно работают. В чем было дело, так и не понял.
    • От Вадим Смоленский
      У одного из тестировщиков, под Windows, моя сборка регулярно падает с такой ошибкой:
      Cannot create rendering target for 'TCanvas2D2'
      В свое время я и сам с этим сталкивался. У себя поборол уменьшением размеров всех TBitmap ниже некоторого предела. Померили максимальный размер TBitmap на компьютере тестировщика функцией TCanvasManager.DefaultCanvas.GetAttribute(TCanvasAttribute.MaxBitmapSize), получилось 8192. На моем компьютере столько же — однако у него падает, а у меня нет. Причем падает не при отрисовке изображения, а уже потом, при каких-то случайных действиях, с отрисовкой не связанных. Всякий раз непредсказуемо. Но он заметил, что если на форму выведено больше крупных изображений, то падает быстрее.
      Как это трактовать и что с этим делать?
    • От Вадим Смоленский
      Узнал, что в UWP API включены средства для получения уникального идентификатора компьютера. Это юнит Windows.System.Profile, класс HardwareIdentification, метод getPackageSpecificToken. Существуют ли способы обратиться к этим средствам из Delphi?
      Вообще, я привык считать, что такая идентификация компьютера в принципе невозможна, в отличие от мобильных устройств. Но прогресс, как известно, не остановить.
    • От Вадим Смоленский
      Для задач, связанных с вводом японского текста, мне нужно научиться перехватывать системное сообщение WM_IME_NOTIFY. Насколько могу судить, в FireMonkey эти вещи делаются (если вообще делаются) принципиально иначе, нежели в VCL. Конкретного ничего не нагуглил. Не поможет ли кто?
    • От slav_z
      У меня для приложений написанных на FireMonkey не вызывается меню игры windows. Для VCL все в порядке. XE8. Если у кого есть решение этой проблемы, поделитесь пожалуйста. (комбинация клавиш Win+G при запущенном приложении)
    • От POV
      Винда 10, два компа (рабочий ноут и планшет от мелкософта - у первого 100% экран, у другого 200%).
      Исходя из габаритов разных там компонентов и другой формы, рассчитываю Top и Left интересующей меня формы. На ноуте выводится где и хотел, а на планшете выше и левее. Смещение не кратно никак масштабу. В доступе планшета нет, как отлаживать не придумаю.
      Косяк всё же в в масштабе может быть или иное?
    • От Вадим Смоленский
      В феврале я сетовал, что мое Windows-приложение не хочет нормально запускаться в Linux под Wine 3.0. Но время идет, вышел Wine 3.6 - и теперь один из тестировщиков радостно сообщил, что всё заработало, за вычетом одного досадного момента. А именно: приложение способно сохранять фокус ввода лишь долю секунды, потом теряет. Соответственно, невозможно ничего ввести в текстовые боксы, разве только одну-две буквы. Можно щелкнуть по заголовку приложения, оно опять получит фокус - и через мгновение снова потеряет. Куда именно при этом переходит фокус, непонятно. Тестировщик утверждает, что только мое приложение ведет себя так, все остальные работают нормально.
      Нет ли у кого-нибудь идей? Что нужно проверить?
    • От Вадим Смоленский
      В декабре я задавал здесь вопрос о борьбе с перехватами нажатий клавиш компонентом TWebBrowser. Продвинутый пользователь Kami посоветовал тогда, раз уж меня интересует только Windows, поставить хук на клавиатуру. Поделился полезной ссылкой. Добавил, что можно еще много чего нагуглить. Что-то действительно нагуглилось - но не в том объеме, чтобы я смог четко понять, как это следует делать. Вопросов много. Куда именно должна быть воткнута функция KeyboardProc? Что в ней должно содержаться, чтобы управление передавалось уже написанному обработчику события FormKeyDown? Многие также упоминают о возникающих проблемах с юникодом, и хорошо было бы понять, как уберечься от них.
      Буду очень признателен, если кто-нибудь осветит эту темную для меня материю.
    • От Вадим Смоленский
      Как преобразовать тип HString в обычную строку?
      Нагуглил упоминания о функции TWindowsString.HStringToString, которая должна находиться в System.WinrtHelpers. Но такого юнита в поставке Delphi не наблюдаю. Может, его можно где-нибудь раздобыть? Или существуют иные способы?
    • От Вадим Смоленский
      Пытаясь разобраться с проблемой размещения файлов в UWP-приложениях, пришел к необходимости создать в своем коде объект класса ApplicationData. Этот класс описан на соответствующей странице майкрософтовской документации, где в самом начале обозначено следующее:
      Namespace:  Windows.Storage
      Assemblies:  Windows.Storage.dll, Windows.dll
      Юнита с именем Windows.Storage или Winapi.Windows.Storage я в поставке Delphi не наблюдаю. Неудивительно, что попытки вставить соответствующие идентификаторы в раздел uses ни к чему не ведут. Как в таких случаях поступают? Откуда берут необходимое?
  • Последние посетители   0 пользователей онлайн

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

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