Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: ActiveX/СОМ/CORBA > TWebBrowser с загруженным mtx


Автор: Rennigth 16.2.2006, 16:42
Здравствуйте, возникла проблемма, может кто-что посоветует.
Вообщем есть контрол подобие PowerPoint который умеет отображать разные MMedia форматы файлов. Работает уже долго сбоев не наблюдалось, но тут возник. При загрузке в TWebBrowser mtx объекта(это такая 3d-модель) он прекрастно отображается, но после его уничтожения и при загрузке к примеру в TAltShockwaveFlash флешовины просходит бесконечный AV. Вылетает на обращении к TForm.ActiveOleControl в делфевых модулях. Боролся всеми мне доступными способами, но ситуация не вообщем не меняется, при избавлении от этой ошибки лезут другие и т.д. Вообщем система становиться нерабочей. Вот у меня вопрос, может как-нибудь я все-таки както не правильно создаю - разрушаю TWebBrowser? или кто-то сталкивался с подобным .. Вообщем я в сметении...
создание:
Код

  FWebBrowser := TEXWebBrowser.Create(Self);
  Self.InsertControl(FWebBrowser);
  FWebBrowser.Align := alClient;

  FWebBrowser.OnDocumentComplete := WebBrowserDocumentComplete;
  FWebBrowser.OnNavigateComplete2 := WebBrowserNavigateComplete2;


разрушение:
Код

  Self.RemoveControl(FWebBrowser);
  FreeAndNil(FWebBrowser);


где перрвоначально вылетает AV, при клике на лубой OleControl:
Код

function TCustomForm.SetFocusedControl(Control: TWinControl): Boolean;
var
  FocusHandle: HWnd;
  TempControl: TWinControl;
begin
  Result := False;
  Inc(FocusCount);
  if FDesigner = nil then
    if Control <> Self then
      FActiveControl := Control else
      FActiveControl := nil;
  Screen.FActiveControl := Control;
  Screen.FActiveCustomForm := Self;
  Screen.FCustomForms.Remove(Self);
  Screen.FCustomForms.Insert(0, Self);
  if Self is TForm then
  begin
    Screen.FActiveForm := TForm(Self);
    Screen.FForms.Remove(Self);
    Screen.FForms.Insert(0, Self);
  end
  else Screen.FActiveForm := nil;
  if not (csFocusing in Control.ControlState) then
  begin
    Control.ControlState := Control.ControlState + [csFocusing];
    try
      if Screen.FFocusedForm <> Self then
      begin
        if Screen.FFocusedForm <> nil then
        begin
          FocusHandle := Screen.FFocusedForm.Handle;
          Screen.FFocusedForm := nil;
          if not SendFocusMessage(FocusHandle, CM_DEACTIVATE) then Exit;
        end;
        Screen.FFocusedForm := Self;
        if not SendFocusMessage(Handle, CM_ACTIVATE) then Exit;
      end;
      if FFocusedControl = nil then FFocusedControl := Self;
      if FFocusedControl <> Control then
      begin
        while (FFocusedControl <> nil) and not
          FFocusedControl.ContainsControl(Control) do
        begin
          FocusHandle := FFocusedControl.Handle;
          FFocusedControl := FFocusedControl.Parent;
          if not SendFocusMessage(FocusHandle, CM_EXIT) then Exit;
        end;
        while FFocusedControl <> Control do
        begin
          TempControl := Control;
          while TempControl.Parent <> FFocusedControl do
            TempControl := TempControl.Parent;
          FFocusedControl := TempControl;
          if not SendFocusMessage(TempControl.Handle, CM_ENTER) then Exit;
        end;
        TempControl := Control.Parent;
        while TempControl <> nil do
        begin
          if TempControl is TScrollingWinControl then
            TScrollingWinControl(TempControl).AutoScrollInView(Control);
          TempControl := TempControl.Parent;
        end;
        Perform(CM_FOCUSCHANGED, 0, Longint(Control));
        if (FActiveOleControl <> nil) and (FActiveOleControl <> Control) then
          FActiveOleControl.Perform(CM_UIDEACTIVATE, 0, 0);  //AV <------
      end;
    finally
      Control.ControlState := Control.ControlState - [csFocusing];
    end;
    Screen.UpdateLastActive;
    Result := True;
  end;
end;


Логично что его кто-то рушит, но кто, и зачем непонятно. Устпновка его в nil в destroy-е WebBrowser-а ведет к дальнейшим ошибкам с FocusedControl и тд...

Автор: December 16.2.2006, 18:55
Цитата(Rennigth @ 16.2.2006, 16:42 Найти цитируемый пост)
TEXWebBrowser

Это твой класс? Пробовал тот же фокус с простым TWebBrowser?
Может, ты в процессе работы где-нить меняешь парент (или парент парента) контрола, например, с помощью InsertControl?

Автор: Rennigth 17.2.2006, 11:17
Цитата(December @ 16.2.2006, 18:55 Найти цитируемый пост)
Это твой класс?

да, когда пытался побороть создал, сейчас пустой(просто наследник).


Цитата(December @ 16.2.2006, 18:55 Найти цитируемый пост)
Может, ты в процессе работы где-нить меняешь парент (или парент парента) контрола, например, с помощью InsertControl?

Нет, негде не меняется.
Добавлено @ 11:25
я вот думаю попробовать сделать свою реализацию использования IWebBrowser2, без использования TOleControl. Это реально?, IWebBrowser2 можно как-нибудь разместить на каком-нибудь WinControl-е? Просто хочу что-бы не делфя занималась созданием/ разрушением... Или может подскажешь альтернативы реализации...

Автор: Rennigth 17.2.2006, 14:12
Попробовал работать только интерфейсом, немного не получаеться... как нужно не подскажите?
Код

function CreateWBObject: IWebBrowser2;
var
  lRes: IUnknown;
begin
  CoCreateInstance(CLASS_WebBrowser, nil,
    CLSCTX_INPROC_SERVER or CLSCTX_LOCAL_SERVER, IDispatch, lRes);
  if Assigned(lRes) then
    lRes.QueryInterface(IID_IWebBrowser2, Result);
end;

procedure ReleaseWBObject(const AWebBrowser: IWebBrowser2);
begin

end;


{$R *.dfm}

{ TForm1 }

constructor TForm1.Create(AOwner: TComponent);
begin
  inherited;
  FWebBrowser := CreateWBObject;
end;

destructor TForm1.Destroy;
begin
  ReleaseWBObject(FWebBrowser);
  inherited;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  lUrl: OleVariant;
  X, Y: Integer;
begin
  X := 0;
  Y := 0;
  if Assigned(FWebBrowser) then
  begin
    lUrl := 'www.ya.ru';
    FWebBrowser.Visible := True;
    FWebBrowser.ClientToWindow(X, Y);
    FWebBrowser.Width := Width;
    FWebBrowser.Height := Height;
    FWebBrowser.Navigate(lUrl, EmptyParam, EmptyParam, EmptyParam, EmptyParam);
  end;
end;


лезут разрушительные сбои... и как вообще парента задать?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)