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

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

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.08.2014, 07:04   #1
Rockot
Форумчанин
 
Аватар для Rockot
 
Регистрация: 01.06.2012
Сообщений: 139
Печаль Проверка наличия соединения с интернетом.

Доброе утро всем, у меня вот такая вот проблемка. Соединяюсь с Mysql базой с помощью FireDAC, написал уже всю программу, всё хорошо, но вот если нет соединения с интернетом, то она просто вылетает с ошибкой. Какое событие обрабатывать, что почитать может?

Просто я не пойму почему приложение даже не запускается, то есть я отключаю Connection = False; и всё равно, кстати ошибка -
Exception EMySQLNativeException in module "Project.exe" at 0025FCDE
[FireDAC][Phys][MySQL] Unknown MySQL server Hosr '1gb.ru' (11004)

Интернет отключал просто выключив адаптер в "Сетевые подключения".

Самое странное, что по formCreate я не произвожу подключение к БД. И не выполняю никаких запросов.
Следствие: 99% проблем, сваливаемых на Microsoft, является следствием тупости самих программистов.
Rockot вне форума Ответить с цитированием
Старый 30.08.2014, 09:00   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Там где соединение поставь try except
Код:
try
 соединяемся
except
 on e:Exception do begin
  e.message - текст ошибки
  exit; //Выходим из процедуры
 end;
end;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.08.2014, 10:03   #3
Rockot
Форумчанин
 
Аватар для Rockot
 
Регистрация: 01.06.2012
Сообщений: 139
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Там где соединение поставь try except
Код:
try
 соединяемся
except
 on e:Exception do begin
  e.message - текст ошибки
  exit; //Выходим из процедуры
 end;
end;
Да я примерно так же сделал, но после такого кода я себя программистом не чувствую)))

Код:
procedure TAuthorization_f.FDConnection1Error(ASender: TObject;
  const AInitiator: IFDStanObject; var AException: Exception);
begin
if (AException.Message = Authorization_f.Error1.Caption) or (AException.Message = Authorization_f.Error2.Caption) then
AException.Message:= 'Проверьте соединение с интернетом.';
end;
У FireDac Connection есть событие OnError в общем там есть переменная AException, в итоге я чего сотворил, я вытаскиваю ошибку из этой переменной, которая лежит в TLabel = (Name = Error1)

Ошибка вот такая вот - [FireDAC][Phys][MySQL] Unknown MySQL Server Host 'gb.ru' (11004)

И я сделал типо

Если Ошибка = [FireDAC][Phys][MySQL] Unknown MySQL Server Host 'gb.ru ТО

Говорить = Проверьте соединение с тырнетом.

Мне кажется более дибильного решения я никогда не писал... Вот думаю, может кто чего знает...

Кстати и решил проблему теперь приложение запускается, до это не запускалось из-за свойства у FDConnection.Connection = TRUE, я просто не заметил его.
Следствие: 99% проблем, сваливаемых на Microsoft, является следствием тупости самих программистов.

Последний раз редактировалось Stilet; 30.08.2014 в 11:16.
Rockot вне форума Ответить с цитированием
Старый 30.08.2014, 11:23   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Да я примерно так же сделал, но после такого кода я себя программистом не чувствую)))
О лала... Ну тогда я почетный быдлокодер Академии IE... Я вот try-ить все у себя поставил. Впрочем эта зараза себя оправдывает в моих проектах уже который раз...
потому и посоветовал.
Цитата:
Мне кажется более дибильного решения я никогда не писал...
Не ну логично, но всетки сравнивать с заранее приведенным текстом не камильфо (или кОмильфо...).
Код:
procedure TAuthorization_f.FDConnection1Error(ASender: TObject;
  const AInitiator: IFDStanObject; var AException: Exception);
begin
 AException.Message:= 'Ошибка: '+AException.Message+#13#10+' Рекомендация: Проверьте соединение с интернетом.';
end;
Вот я бы так и сделал: Сохранил текст ошибки + свою рекомендацию.

А и еще: (AException.Message = Authorization_f.Error1.Caption)
У AException должно быть свойство кода ошибки. Вот лучше проверять его а не сравнивать строки, которые могут быть различными хотя бы из-за локалей ОС. А код ошибки - число.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.08.2014, 11:40   #5
Rockot
Форумчанин
 
Аватар для Rockot
 
Регистрация: 01.06.2012
Сообщений: 139
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
О лала... Ну тогда я почетный быдлокодер Академии IE... Я вот try-ить все у себя поставил. Впрочем эта зараза себя оправдывает в моих проектах уже который раз...
потому и посоветовал.

Не ну логично, но всетки сравнивать с заранее приведенным текстом не камильфо (или кОмильфо...).
Код:
procedure TAuthorization_f.FDConnection1Error(ASender: TObject;
  const AInitiator: IFDStanObject; var AException: Exception);
begin
 AException.Message:= 'Ошибка: '+AException.Message+#13#10+' Рекомендация: Проверьте соединение с интернетом.';
end;
Вот я бы так и сделал: Сохранил текст ошибки + свою рекомендацию.

А и еще: (AException.Message = Authorization_f.Error1.Caption)
У AException должно быть свойство кода ошибки. Вот лучше проверять его а не сравнивать строки, которые могут быть различными хотя бы из-за локалей ОС. А код ошибки - число.
Да ты прав, надо покопать)), а то не комильфо такой код)) Спасибо за помощь))
Следствие: 99% проблем, сваливаемых на Microsoft, является следствием тупости самих программистов.
Rockot вне форума Ответить с цитированием
Старый 08.09.2014, 16:36   #6
vovs
Новичок
Джуниор
 
Регистрация: 26.03.2013
Сообщений: 2
По умолчанию

Как вариант:
Код:
uses Winsock;
//------------------ Структура ай-пи для ICMP --------------------------------
  type
  IPINFO = record
    Ttl: char;
    Tos: char;
    IPFlags: char;
    OptSize: char;
    Options: ^char;
  end;

type
  ICMPECHO = record
    Source: longint;
    Status: longint;
    RTTime: longint;
    DataSize: Shortint;
    Reserved: Shortint;
    pData: ^variant;
    i_ipinfo: IPINFO;
  end;

  TIcmpCreateFile = function(): integer; {$IFDEF WIN32}stdcall; {$ENDIF}
  TIcmpCloseHandle = procedure(var handle: integer); {$IFDEF WIN32}stdcall; {$ENDIF}
  TIcmpSendEcho = function(var handle: integer; endereco: DWORD; buffer: variant; tam: WORD; IP: IPINFO; ICMP: ICMPECHO; tamicmp: DWORD; tempo: DWORD): DWORD; {$IFDEF WIN32}stdcall; {$ENDIF}
//------------------------------------------------------------------------------
//main                                                                         /

procedure Ping;
var


 wsadt: wsadata;
  icmp: icmpecho;
  HNDicmp: integer;
  hndFile: integer;
  Host: PHostEnt;
  Destino: in_addr;
  Endereco: ^DWORD;
  IP: ipinfo;
  Retorno: integer;
  dwRetorno: DWORD;
  x: integer;



  IcmpCreateFile: TIcmpCreateFile;
  IcmpCloseHandle: TIcmpCloseHandle;
  IcmpSendEcho: TIcmpSendEcho;

begin

  HNDicmp := LoadLibrary('ICMP.DLL');
  if (HNDicmp <> 0) then
    begin
      @IcmpCreateFile := GetProcAddress(HNDicmp, 'IcmpCreateFile');
      @IcmpCloseHandle := GetProcAddress(HNDicmp, 'IcmpCloseHandle');
      @IcmpSendEcho := GetProcAddress(HNDicmp, 'IcmpSendEcho');
      if (@IcmpCreateFile = nil) or (@IcmpCloseHandle = nil) or (@IcmpSendEcho = nil) then
        begin
          Application.MessageBox('Erro pegando endereзos ICMP', 'Error', MB_OK);
          FreeLibrary(HNDicmp);
        end;
    end;
  Retorno := WSAStartup($0101, wsadt);

  if (Retorno <> 0) then
    begin
      Application.MessageBox('Nгo foi possнvel carregar WinSockets', 'WSAStartup', MB_OK);
      WSACleanup();
      FreeLibrary(HNDicmp);
    end;

  Destino.S_addr := inet_addr('213.180.204.3');
  if (Destino.S_addr = 0) then
    begin
      Host := GetHostbyName('ya.ru');
    end
  else
    begin
      Host := GetHostbyAddr(@Destino, sizeof(in_addr), AF_INET);
    end;

  if (host = nil) then
    begin
      ShowMessage('Непингуется  сервер');
      WSACleanup();
      FreeLibrary(HNDicmp);
      exit;
    end;

  Endereco := @Host.h_addr_list;

  HNDFile := IcmpCreateFile();
  for x := 0 to 4 do
    begin
      Ip.Ttl := char(255);
      Ip.Tos := char(0);
      Ip.IPFlags := char(0);
      Ip.OptSize := char(0);
      Ip.Options := nil;

      dwRetorno := IcmpSendEcho(
        HNDFile,
        Endereco^,
        null,
        0,
        Ip,
        Icmp,
        sizeof(Icmp),
        DWORD(5000));
      Destino.S_addr := icmp.source;
     Showmessage('internet ok');
    end;

  IcmpCLoseHandle(HNDFile);
  FreeLibrary(HNDicmp);
  WSACleanup();
end;
vovs вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проверка наличия соединения tocsik C/C++ Сетевое программирование 2 02.07.2014 10:43
Проверка соединения с интернетом 2. ZeitGeist7 Работа с сетью в Delphi 5 02.02.2012 14:59
Проверка соединения с интернетом по таймеру Ёжик в тумане Общие вопросы Delphi 2 22.10.2011 11:19
Проверка соединения с интернетом. Проблема Djem1991 Работа с сетью в Delphi 12 10.06.2010 22:02
Проверка соединения с интернетом. boostman Работа с сетью в Delphi 4 19.02.2009 12:05