Einzelnen Beitrag anzeigen

EWeiss
(Gast)

n/a Beiträge
 
#21

AW: Classe/Interface aus WinProc aufrufen

  Alt 14. Sep 2017, 16:17
Also beim Start habe ich 3 Referenzen dann wird einmalig _Release aufgerufen bleiben 2. Dann wird das Menu angezeigt.

Beim beenden jedoch wird nicht einmal _Release aufgerufen und SkinPopUpMenu ist nicht Nil.

Habe meine Funktion mal geändert zum initialisieren rufe nicht mehr
result := TSkinPopUpMenu.Create

von außen auf sondern diese.
Delphi-Quellcode:
function CTRL_PopUpMenuCreate(callback: POPUPSTATECALLBACK): ISkinPopUpMenu; stdcall;
begin

  result := InitPopUpMenu();
  PopUpCallback := callback;
end;
danach
Delphi-Quellcode:
function InitPopUpMenu: ISkinPopUpMenu;
begin

  if SkinPopUpMenu = nil then
    SkinPopUpMenu := TSkinPopUpMenu.Create;

  result := SkinPopUpMenu as ISkinPopUpMenu;
end;
und in create
Delphi-Quellcode:
constructor TSkinPopUpMenu.Create;
begin
  inherited Create;

// SkinPopUpMenu := self;
  ItemEnabled := True;
  SideBarCount := 0;
  ButtonCount := 0;
  SubMenuHandleCount := 0;
  FHPopupWindow := 0;
  gP.ProgManHandle := FindWindow('Progman', 'Program Manager');
end;
Delphi-Quellcode:
  
var
  SkinPopUpMenu : ISkinPopUpMenuEx;
verstehe es nicht.

Die Funktionen werden alle entladen bzw.. freigegeben. Hilft niemandem weiter nur zur Info.
Und das funktioniert alles in meinem KVPlayer.
Delphi-Quellcode:
procedure TSkinPopUpMenu.DestroyWindow;
var
  IntI: Integer;
  hResource: HBitmap;
begin

  UnSubClass(gP.ParentHandle);

  KillTimer(Handle, SKAERO_AERO_TIMER);
  KillTimer(Handle, POPUP_TIMER);
  // Alle Skinresourcen freigeben.
  if SubMenuHandleCount > 0 then
    for IntI := 0 to SubMenuHandleCount - 1 do
      SkinEngine.DestroyWindowResource(SubMenuWindow[IntI].Handle);

  // Privaten font freigeben
  if Assigned(FPrivateFont) then
    GdipCheck(GdipDeletePrivateFontCollection(FPrivateFont));

  // erstellte Button freigeben
  if ButtonCount > 0 then
  begin
    for IntI := 0 to ButtonCount - 1 do
    begin
      btnMenu[IntI].DestroyWindow;
      btnMenu[IntI] := nil;
    end;
    FillChar(btnMenu, ButtonCount, 0);
    ButtonCount := 0;
  end;

  // Sidebar resourcen freigeben
  if SideBarCount > 0 then
  begin
    for IntI := 0 to SideBarCount - 1 do
    begin
      SideBarFrame[IntI].DestroyWindow;
      SideBarFrame[IntI] := nil;
    end;
    FillChar(SideBarFrame, SideBarCount, 0);
    SideBarCount := 0;
  end;

  hResource := SkinEngine.GetPaintBitmap(SkinPopUpMenu.Handle);
  DeleteObject(hResource);

  if SubMenuHandleCount > 0 then
  begin
    for IntI := 0 to SubMenuHandleCount - 1 do
      if Windows.DestroyWindow(SubMenuWindow[IntI].Handle) then
        SubMenuWindow[IntI].Handle := 0;

    FillChar(SubMenuWindow, SubMenuHandleCount, 0);
  end;

  if Windows.DestroyWindow(Handle) then
    UnRegisterClass(wc.lpszClassName, hInstance);

  // Skinresource des Hauptfenster freigeben
  SkinEngine.DestroyWindowResource(Handle);

  // TODO
  // FillChar(SkinPopUpMenu, SizeOf(SkinPopUpMenu), 0);

  if not Assigned(SkinPopUpMenu) then
    PopUpCallback(OnPopupDestroyed);

end;
gruss

Geändert von EWeiss (14. Sep 2017 um 16:22 Uhr)
  Mit Zitat antworten Zitat