Einzelnen Beitrag anzeigen

venice2
(Gast)

n/a Beiträge
 
#1

OpenFileDialog subclassing

  Alt 26. Nov 2020, 16:54
Ich subclasse den Openfiledialog.
Wenn ich nun den Ordner bzw. Pfad ändere addieren sich die tooltips_class32 diese werden dann nach dem schließen des Dialogs nicht mehr entfernt.
Es liegt daran weil ich die Message DESTROY nicht weiterleite.

Das Problem.
Delphi-Quellcode:
    WM_DESTROY:
      begin
        SysListUnSubClass(WinHandle); // Muss beendet werden

        sbHookedScroolBar := nil;
        hSysList := 0;
        Result := 1;
        Exit;
      end;
Beim beenden wird die Subclass beendet wenn ich nun die Message weiterlaufen lasse also

Delphi-Quellcode:
    WM_DESTROY:
      begin
        SysListUnSubClass(WinHandle);

        sbHookedScroolBar := nil;
        hSysList := 0;
      end;
Dann kracht es weil
Result := CallWindowProc(FPrevSysListProc, WinHandle, Msg, wp, lp);
der Pointer FPrevSysListProc dann nicht mehr gültig ist.

Beim wechsel auf einen anderen Folder wird das ListLiew zerstört deshalb muss ich das alte Subclassing beenden und hier neu zuweisen
weil sich das Handle des ListView geändert hat.
Delphi-Quellcode:
          CDN_FOLDERCHANGE:
            begin
              if OpenDialog.UseSkin then
              begin
                if (hSysList = 0) then
                begin
                  hDefview := FindWindowEx(DlgHandle, 0, 'SHELLDLL_Defview', nil);
                  hSysList := FindWindowEx(hDefview, 0, 'SysListView32', nil);

                  if hSysList <> 0 then
                  begin
                    SysListSubClass(hSysList); // neu

                    if not Assigned(sbHookedScroolBar) then
                      OpenDialog.HookedScroolBar;

                    if hHeader = 0 then
                    begin
                      hHeader := ListView_GetHeader(hSysList);
                      HeaderSubClass(hHeader);
                    end;
                  end;
                end;
                SetFocus(SKDialogHandle);
              end;
              Result := 1;
              Exit;
            end;
solange wie ich die Message WM_DESTROY mit 1 zurückgebe ist alles in Ordnung nur dann werden mir immer neue tooltips_class32 addiert die sich dann beim beenden nicht löschen.
Wo ist mein Denkfehler so das ich das beheben kann?

Ich muss also das Subclassing an anderer stelle beenden nur wo.
Habe es mit WM_LBUTTONDOWN in der TOOLBAR Proc versucht nur wie komme ich an die ID der jeweiligen Button die ich klicke?

Geändert von venice2 ( 1. Dez 2020 um 16:05 Uhr)
  Mit Zitat antworten Zitat