Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.03.2016, 00:20   #1
tim21701
Пользователь
 
Регистрация: 16.01.2012
Сообщений: 67
Сообщение Помогите правильно составить if > then > else

При создании (OnCreate) формы "О программе" читаю dll и загружаю из него фона для окна.

Если about.dll существует - читаю и загружаю изображение.
Если файла не существует - вывожу сообщение.

Собственно сам листинг:
Код HTML:
procedure TAboutForm.FormCreate(Sender: TObject);
var
  LibHandle: THandle;
  info: Tbitmap;
begin
  LibHandle:=Loadlibrary('about.dll');
  if FileExists('about.dll')
    then
  try
    if LibHandle<>0 then
    begin
      info:=TBitmap.Create;
      info.LoadFromResourceName(LibHandle,'info');
      ImageGlobalFon.Canvas.Draw(0,0,info);
      end;
    finally
    end
  else
      begin
        Application.MessageBox
        ('Библиотека about.dll повреждена или не найдена.',
        'Ошибка чтения данных', MB_ICONERROR + MB_OK);
        Application.Terminate;
      end;
  FreeLibrary(LibHandle);
end;
Всё работает прекрасно, однако...
Если удалить about.dll и создав на его месте какой нибудь файл с таким же именем, получаем системное уведомление:
Цитата:
"С:\temp\Win32\Debug\about.dll" либо не предназначен для выполнения под управлением Windows или содержит ошибку. Попробуйте переустановить программу с помощью исходного установочного носителя или обратитесь к системному администратору или поставщику программного обеспечения за поддержкой.
После чего, программа не отвечает и остаётся висеть в процессах...

Как вместо этого, использовать своё сообщение - такое же, которое выводится при отсутствии файла?
Подскажите пожалуйста.
tim21701 вне форума Ответить с цитированием
Старый 09.03.2016, 05:06   #2
Filka
Форумчанин
 
Регистрация: 29.10.2015
Сообщений: 273
По умолчанию

Код:
procedure TAboutForm.FormCreate(Sender: TObject);
var
  LibHandle: THandle;
  Info: TBitmap;
  OldErrorMode: UINT;
begin
  try
    OldErrorMode := SetErrorMode(SEM_FAILCRITICALERRORS);
    try
      LibHandle := LoadLibrary('about.dll');
      if GetLastError <> ERROR_SUCCESS then // GetLastError = 193 
        Abort;
    finally
      SetErrorMode(OldErrorMode);
    end;

    if LibHandle <> 0 then
      try
        Info := TBitmap.Create;
        try
          Info.LoadFromResourceName(LibHandle, 'info');
          ImageGlobalFon.Canvas.Draw(0, 0, Info);
        finally
          Info.Free;
        end;
      finally
        FreeLibrary(LibHandle);
      end;
  except
    Application.MessageBox('Библиотека about.dll повреждена или не найдена.',
      'Ошибка чтения данных', MB_ICONERROR or MB_OK);
    Application.Terminate;
  end;
end;
Или:
Код:
procedure TAboutForm.FormCreate(Sender: TObject);
var
  LibHandle: THandle;
  Info: TBitmap;
  OldErrorMode: UINT;
begin
  OldErrorMode := SetErrorMode(SEM_FAILCRITICALERRORS);
  try
    LibHandle := LoadLibrary('about.dll');
  finally
    SetErrorMode(OldErrorMode);
  end;

  if LibHandle <> 0 then
    try
      Info := TBitmap.Create;
      try
        Info.LoadFromResourceName(LibHandle, 'info');
        ImageGlobalFon.Canvas.Draw(0, 0, Info);
      finally
        Info.Free;
      end;
    finally
      FreeLibrary(LibHandle);
    end
  else
  begin
    Application.MessageBox('Библиотека about.dll повреждена или не найдена.',
      'Ошибка чтения данных', MB_ICONERROR or MB_OK);
    Application.Terminate;
  end;
end;
?

Последний раз редактировалось Filka; 09.03.2016 в 05:42.
Filka вне форума Ответить с цитированием
Старый 09.03.2016, 06:35   #3
tim21701
Пользователь
 
Регистрация: 16.01.2012
Сообщений: 67
Хорошо

Filka огромное спасибо!)
Уже помогли, со всеми проверками

Код HTML:
procedure TAboutForm.FormCreate(Sender: TObject);
var
  LibHandle: hmodule;
  info: Tbitmap;
begin
  if not fileexists('about.dll') then
    with application do
    begin
      MessageBox('Библиотека about.dll не найдена.', 'Ошибка чтения данных',
        MB_ICONERROR + MB_OK);
      Terminate;
      exit;
    end;
  LibHandle := safeLoadlibrary('about.dll', SEM_FAILCRITICALERRORS);
  if LibHandle = 0 then
    with application do
    begin
      MessageBox('Библиотека about.dll повреждена.', 'Ошибка чтения данных',
        MB_ICONERROR + MB_OK);
      Terminate;
      exit;
    end;
  info := Tbitmap.Create;
  try
    info.LoadFromResourceName(LibHandle, 'INFO');
  except
    with application do
    begin
      MessageBox('Ресурс INFO не найден.', 'Ошибка чтения данных',
        MB_ICONERROR + MB_OK);
      Terminate;
      exit;
    end;
  end;
  ImageGlobalFon.Canvas.Draw(0, 0, info);
  info.Free;
  FreeLibrary(LibHandle);
end;

Последний раз редактировалось tim21701; 09.03.2016 в 07:00.
tim21701 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
помогите правильно составить формулу Людмила79 Microsoft Office Excel 16 12.12.2015 18:56
Правильно составить БД conflictogen PHP 11 13.05.2015 10:03
Правильно составить htaccess mego4el Помощь студентам 1 14.06.2013 12:17
правильно составить формулу everest88 Microsoft Office Excel 7 22.02.2011 10:16
Не могу правильно составить команду BoT_T Общие вопросы Delphi 5 22.09.2010 14:39