Здравствуйте, возникла проблемма, может кто-что посоветует. Вообщем есть контрол подобие 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 и тд... |