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

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

Ответить
shyub
постоялец
Сообщения: 112
Зарегистрирован: 25.11.2014 22:15:19

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

Сообщение 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.

Почему так происходит и как с этим бороться?
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

shyub, это старый прикол. Попробуйте использовать полную форму if

Код: Выделить всё

if (Screen.Width<>1366)or(Screen.Height<>768) then begin
    ShowMessage('Установите разрешение экрана монитора 1366 x 768.'); // Вызывает ошибку. !!!
  end else begin end;


Добавлено спустя 3 минуты 36 секунд:
Если поможет, то это просто баг, который никогда не уберут из-за привычки отлавливать исключения, не думая почему оно возникает.
zub
долгожитель
Сообщения: 2890
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

Какая полная форма? Нету во фрипаскале с этим проблем, есть невнимательные програмисты.
просто стоит делать подобные проверки после Application.Initialize
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

zub писал(а): Нету во фрипаскале с этим проблем,


угу... у кого-то может и не было...
shyub
постоялец
Сообщения: 112
Зарегистрирован: 25.11.2014 22:15:19

Сообщение 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) Оно особо-то и не принципиально, однако, хотелось бы понять, почему такое происходит.
Аватара пользователя
Little_Roo
энтузиаст
Сообщения: 639
Зарегистрирован: 27.02.2009 18:56:36
Откуда: Санкт-Петербург

Сообщение Little_Roo »

или туплю после педсовета, или добавить в uses Windows :?:
zub
долгожитель
Сообщения: 2890
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

попробуй

Код: Выделить всё

begin
  RequireDerivedFormResource := True;
  Application.Initialize;
  ShowMessage('Установите разрешение экрана монитора 1366 x 768.');
  Application.CreateForm(TForm1, Form1);
...
shyub
постоялец
Сообщения: 112
Зарегистрирован: 25.11.2014 22:15:19

Сообщение 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;
.....

но дело до создания формы не дойдёт, то не навредит ли оно уже работающей программе?
zub
долгожитель
Сообщения: 2890
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

Думаю нет

Код: Выделить всё

Application.Initialize;

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

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