[Delphi] Problem z zamykaniem dynamicznej formy

0

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.

0

A gdybys zmienil w tej linijce:
FFullScreenControl := TForm.Create(nil);
Nil na np. self ? bo nie nadajesz mu rodzica, i tak samo FFullScreenControl.Parent:=Self

Tak szczelam :)

0

Edited:

Chyba znalazłem przyczynę.
Mianowicie przy przechodzeniu w tryb pełnoekranowy przekazywałem kontrolę do innej formy (bo traciłem kontakt z klawiaturą)

Zastosowałem:

fbWnd := GetForegroundWindow();
  SetForegroundWindow(MDPluginWorkspace.Handle); //odbior z klawiatury przez mdform

Przy powrocie do trybu okienkowego:

if fbwnd <> 0 then SetForegroundWindow(fbWnd);

No i niepotrzebnie dodałem to do FormCloseQuery.

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  if fbWnd <>0 then SetForegroundWindow(fbWnd);
(...)

end;

Tutaj rodziły się nieoczekiwane wyjątki, które nie dawały mi spać po nocach.
Pozdrawiam.

0
entek napisał(a)

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".

Wszystko zależy ile razy w trakcie życia usuwasz klasę TDSVideoWindowEx2. Jakby nie patrzeć, leaki programu giną razem z nim ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1