Страница 1 из 1

Ошибка в Win-XP при вызове ShowMessage из lpr-файла

СообщениеДобавлено: 06.04.2016 17:59:38
shyub
При инициализации программы проверяю разрешение экрана, наличие запущенной копии и при помощи ShowMessage сообщаю об этом пользователю. В Windows-7 всё работает без проблем. Но в Windows-XP при попытке вызова ShowMessage возникает ошибка. Вот отрывок кода:
Код: Выделить всё
program project1;

{$mode objfpc}{$H+}

uses
  Dialogs,
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Interfaces, // this includes the LCL widgetset
  Forms, Unit1, Unit2, Unit3;

{$R *.res}

begin
  if (Screen.Width<>1366)or(Screen.Height<>768) then begin
    ShowMessage('Установите разрешение экрана монитора 1366 x 768.'); // Вызывает ошибку. !!!
  end;
  RequireDerivedFormResource := True;
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TForm2, Form2);
  Application.CreateForm(TForm3, Form3);
  Application.Run;
end.

Почему так происходит и как с этим бороться?

Re: Ошибка в Win-XP при вызове ShowMessage из lpr-файла

СообщениеДобавлено: 06.04.2016 18:19:48
Лекс Айрин
shyub, это старый прикол. Попробуйте использовать полную форму if
Код: Выделить всё
if (Screen.Width<>1366)or(Screen.Height<>768) then begin
    ShowMessage('Установите разрешение экрана монитора 1366 x 768.'); // Вызывает ошибку. !!!
  end else begin end;


Добавлено спустя 3 минуты 36 секунд:
Если поможет, то это просто баг, который никогда не уберут из-за привычки отлавливать исключения, не думая почему оно возникает.

Re: Ошибка в Win-XP при вызове ShowMessage из lpr-файла

СообщениеДобавлено: 06.04.2016 19:05:37
zub
Какая полная форма? Нету во фрипаскале с этим проблем, есть невнимательные програмисты.
просто стоит делать подобные проверки после Application.Initialize

Re: Ошибка в Win-XP при вызове ShowMessage из lpr-файла

СообщениеДобавлено: 06.04.2016 19:40:44
Лекс Айрин
zub писал(а): Нету во фрипаскале с этим проблем,


угу... у кого-то может и не было...

Re: Ошибка в Win-XP при вызове ShowMessage из lpr-файла

СообщениеДобавлено: 06.04.2016 20:52:09
shyub
Убрал конструкцию IF и написал просто:
...
Код: Выделить всё
begin
  ShowMessage('Установите разрешение экрана монитора 1366 x 768.'); // Вызывает ошибку. !!!
  RequireDerivedFormResource := True;
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
...

Результат - ошибка в Windows-XP, в Windows-7 проблем не возникает. (Использую Lazarus 1.6, FPC - 3.0.0) Оно особо-то и не принципиально, однако, хотелось бы понять, почему такое происходит.

Re: Ошибка в Win-XP при вызове ShowMessage из lpr-файла

СообщениеДобавлено: 06.04.2016 21:04:35
Little_Roo
или туплю после педсовета, или добавить в uses Windows :?:

Re: Ошибка в Win-XP при вызове ShowMessage из lpr-файла

СообщениеДобавлено: 06.04.2016 21:25:46
zub
попробуй
Код: Выделить всё
begin
  RequireDerivedFormResource := True;
  Application.Initialize;
  ShowMessage('Установите разрешение экрана монитора 1366 x 768.');
  Application.CreateForm(TForm1, Form1);
...

Re: Ошибка в Win-XP при вызове ShowMessage из lpr-файла

СообщениеДобавлено: 06.04.2016 21:40:50
shyub
Да, сделал вот так:
Код: Выделить всё
.....
begin
  RequireDerivedFormResource := True;
  Application.Initialize;
  ShowMessage('Проверка.');
  if (Screen.Width<>1366)or(Screen.Height<>768) then begin 
    ShowMessage('Установите разрешение экрана монитора 1366 x 768.');
  end;
  Application.CreateForm(TForm1, Form1);
.....

Всё заработало и в XP, и в Win-7. Спасибо.
И ещё такой вопрос. Я указал не полный текст, у меня ещё происходит проверка, чтобы не запустилась вторая копия приложения. Дело в том, что сразу же после запуска приложения происходит доступ к одним и тому же ресурсам (БД, COM-порту, реестру, файлам). Если у меня выполнится вот эта часть:
Код: Выделить всё
.....
begin
  RequireDerivedFormResource := True;
  Application.Initialize;
.....

но дело до создания формы не дойдёт, то не навредит ли оно уже работающей программе?

Re: Ошибка в Win-XP при вызове ShowMessage из lpr-файла

СообщениеДобавлено: 06.04.2016 21:54:16
zub
Думаю нет
Код: Выделить всё
Application.Initialize;

инициализация лцлного барахла.

Но до проверки выполнится код инициализации модулей в uses этого lpr-файла. Убедитесь что там нет ничего из
происходит доступ к одним и тому же ресурсам (БД, COM-порту, реестру, файлам).