Witam, tym razem ja mam problem.
Mianowicie aplikacja dodaje komponenty i jednym z nich jest TDSVideoWindowEx2 (komponent do wyświetlania obrazu video w trybie overlay z pakietu DSPACK). Podczas pracy programu jest możliwość przejścia w tryb tkzw. pełno-ekranowy; wtedy obraz jest wyświetlany na całym ekranie.
Przy wyświetlaniu pełno-ekranowym jest dynamicznie tworzona nowa forma, oto kod:
constructor TDSVideoWindowEx2.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
ControlStyle := [csAcceptsControls, csCaptureMouse, csClickEvents,
csDoubleClicks, csReflector];
TabStop := true;
Height := 240;
Width := 320;
color := $000000;
FColorKey := $100010; //clNone;
FFullScreen := false;
FColorControl := TColorControl.create(Self);
FCaps := TDSVideoWindowEx2Caps.Create(Self);
AspectRatio := rmLetterBox;
DigitalZoom := 0;
GraphBuildOK := False;
FNoScreenSaver := False;
FIdleCursor := 0;
if (csDesigning in componentstate) then Exit;
FFullScreenControl := TForm.Create(nil);
FFullScreenControl.Color := Color;
FFullScreenControl.DefaultMonitor := dmDesktop;
FFullScreenControl.BorderStyle := bsNone;
FFullScreenControl.OnCloseQuery := FullScreenCloseQuery;
FOldParent := nil;
FMonitor := nil;
FVideoWindowHandle := 0;
GraphWasUpdatet := False;
Application.OnIdle := MyIdleHandler;
end;
Jak wspominałem komponent tworzy nową formę dynamicznie i wszystko niby fajnie, ale przy zamykaniu aplikacji, a właściwie przy usuwaniu klasy TDSVideoWindowEx2 nie jest likwidowana klasa FFullScreenControl. Jest to dość irytujące, bo powoduje poważne "Memory Leaks".
Postanowiłem dodać do procedury:
destructor TDSVideoWindowEx2.Destroy;
begin
if DesktopPlayback then
NormalPlayback;
if FDDXM <> nil then
FDDXM.SetCallbackInterface(nil, 0);
OverlayCallback := nil;
FOverlayMixer := nil;
FFilterGraph := nil;
FVideoWindow := nil;
FVideoRenderer := nil;
if FCaps <> nil then FreeAndNil(FCaps);
if FColorControl <> nil then FreeAndNil(FColorControl);
inherited Destroy;
end;
linijkę z:
FreeAndNil(FFullScreenControl);
I niby git, "memory leaks" już nie ma, ale co jakiś czas przy zamykaniu aplikacji mam piękne exception w takim nie typowym miejscu:
procedure TControlScrollBar.CalcAutoRange;
(...)
begin
if FControl.FAutoScroll then <--- tu exception
W jakiś sposób przy usuwaniu formy FFullScreenControl jest do niej wysyłany komunikat odnośnie "CalcAutoRange" scrollbarów horz i vert.
Exception pojawia się nie zawsze. Tak, myślę żeby przekonać formę przed jej usunięciem, by nie odbierała żadnych komunikatów, ale czy to coś pomoże?
Na razie brak mi pomysłów (prawie osiwiałem).
Skoro forma jest likwidowana, to dlaczego w tym czasie odbiera komunikaty?
Jeśli ktoś miał jakiś podobny problem to jestem otwarty na sugestie.