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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.11.2012, 15:52   #1
GSirr
Пользователь
 
Регистрация: 13.05.2009
Сообщений: 42
По умолчанию (WebBrowser.Document as IPersistStreamInit).Load и AccessViolation

Добрый день уважаемые коллеги!
Есть поток (thread) который с помощью функции InternetGetConnectedState раз в секунду мониторит состояние интернет подключения. Форма подписана на события изменения состояний этого потока (OnConnectionLost и OnConnectionRestored).
Есть TWebBrowser c картами google (компонент от тмс-софтвэйр).
Есть форма, на которой есть TWebBrowser c картами и у которой есть функция BuildGUI, которая вызывается при потере/возобновлении интернет-соединения.

Задача - если соединение потеряно выводить в браузере сообщение об этом. Если соединение возобновлено - загружать гугл-карты по новой.

Проблема - Acess Violation внутри компонента, но только тогда, когда метод Launch(который загружает карту из потока (stream)) вызывается из процедуры BuildGUI. Если тот же код прописать на кнопке, все происходит правильно!

Код процедуры BuildGUI с комментариями:
Код:
procedure TfrmJobCard.BuildGUI;
begin
...
  if not frmGALAMain.ConnectionInfo.Connected then
    begin
      if not FMapDisconnected then
        begin
          FMapDisconnected := True; //Private переменная в форме
          wgmMap.WebBrowser.Navigate('about:blank'); // Вместо сообщения об отключении соединения
        end;
    end
  else
    begin
      if (FMapDisconnected) then
        begin
          FMapDisconnected := False;
          wgmMap.Launch; //Здесь Access Violation, Код этого метода приведу ниже
        end;
    end;
...
end;
Метод Launch:
Код:
function TWebGMaps.Launch:Boolean;
var
  aStream : TStream;
  AStreamAdapter: TStreamAdapter;
  AStreamInit: IPersistStreamInit;
  HtmlFile:String;
begin
  FLaunching := True;
  Result:=False;
  HtmlFile:=InitHtmlFile; // файл собирается по кусочкам, он корректный

  if FMapOptions.FPreloaderVisible then
  begin
    Preloader.Visible:=True;
    (Preloader.Picture.Graphic as TGifImage).Animate:=True;
    Application.ProcessMessages;
  end;

  try
    FWebBrowser.Navigate(HTML_BLANK_PAGE); // Константа 'about:blank'

    while FWebBrowser.ReadyState <> READYSTATE_COMPLETE do
    begin
      Application.ProcessMessages;
    end;

    if Assigned(FWebBrowser.Document) then
    begin
      aStream := TStringStream.Create(HtmlFile);
      try
        try
          AStreamAdapter := TStreamAdapter.Create(aStream);
          AStreamInit := FWebBrowser.Document as IPersistStreamInit;
          AStreamInit.Load(AStreamAdapter); //Здесь Access Violation
          bLaunchFinish:=False;
          Result:=True;
        except
          FLaunching := False;
          if Assigned(fOnWebGMapsError) then
            fOnWebGMapsError(Self,etGMapsProblem);
        end;

      finally
        FreeAndNil(aStream);
      end;
    end
    else
    begin
      if Assigned(fOnWebGMapsError) then
        fOnWebGMapsError(Self,etGMapsProblem);
    end;
  except
    FLaunching := False;
    if Assigned(fOnWebGMapsError) then
      fOnWebGMapsError(Self,etGMapsProblem);
  end;
  FLaunching := False;
end;
Сутки почти уже убил Поделитесь мыслями, почему так?
Спасибо
GSirr вне форума Ответить с цитированием
Старый 28.11.2012, 16:13   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

1. у IPersistStreamInit нету метода Init вы дергаете за не существующую ниточку.
2. По скольку вы дергаете интерфейс, а его экземпляра у владельца вы не получили, то вы стучитесь опять в закрытую дверь.
Человек_Борща вне форума Ответить с цитированием
Старый 28.11.2012, 16:40   #3
GSirr
Пользователь
 
Регистрация: 13.05.2009
Сообщений: 42
По умолчанию

Спасибо за ответ!
1) Вы имеете ввиду метод InitNew у IPersistStreamInit? Если да, то разве он не вызывается в методе Navigate TWebBrowser, который дергается выше?
2) Можно поподробнее?
Напомню, что когда я провожу эти операции вручную (т.е. ситуация 1 в 1, только вместо процедуры BuildGUI - 1 кнопка, которая прогоняет этот же код) все отлично!
GSirr вне форума Ответить с цитированием
Старый 29.11.2012, 06:17   #4
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Покажите, откуда вызывается BuildGUI
Наверное, как обычно, сперва в formcreate каком-нибудь вызываете билдгуи, а только потом создаёте экземпляр wgmMap.
Что говорит трассировка ?
phomm вне форума Ответить с цитированием
Старый 29.11.2012, 09:33   #5
GSirr
Пользователь
 
Регистрация: 13.05.2009
Сообщений: 42
По умолчанию

Нет, с такой детской ошибкой я бы не стал заходить на форум
Ошибка происходит когда форма уже создана и экземпляр wgmMap инициализирован. Трассировка говорит что указатели у aStream, AStreamAdapter, AStreamInit и FWebBrowser не пустые.

BuildGUI вызывается отсюда (форма-родитель)

Код:
procedure TfrmGalaMain.OnInternetConnectionLost(Sender: TObject);
const
  InternetConnectionLostAlarmText = 'Интернет-соединение потеряно';
  InternetConnectionLostAlarmCaption = 'Соединение потеряно';
begin
  TdxStatusBarTextPanelStyle(sbMain.Panels[0].PanelStyle).ImageIndex := 8;
  if FJobCardForm <> nil then
    begin
      FJobCardForm.BuildGUI;
    end;
end;

procedure TfrmGalaMain.OnInternetConnectionRestored(Sender: TObject);
begin
  TdxStatusBarTextPanelStyle(sbMain.Panels[0].PanelStyle).ImageIndex := 7;
  if FJobCardForm <> nil then
    begin
      FJobCardForm.BuildGUI;
    end;
end;
GSirr вне форума Ответить с цитированием
Старый 29.11.2012, 11:24   #6
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Ну, а что трассировка говорит про АВ ? на каком этапе, в каком модуле/строке. Тип АВ - чтение/запись, какой адрес "мусор" или "ноль" ?
phomm вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
load data kilogram SQL, базы данных 7 07.07.2012 12:40
WebBrowser.OleObject.Document.All.Item(i).InnerTex t очень долго tebeen Работа с сетью в Delphi 5 09.03.2010 14:04
WebBrowser работа с oleobject.document..... rangel Работа с сетью в Delphi 0 09.03.2010 14:01
Запуск Load.dll (бывшая Load.exe) в дереве проц-ов, Как запустить прогой на C# .dll-ку kapustin Общие вопросы .NET 10 23.09.2009 22:20