AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Bug? Delphi Anwendung automatisch in den Hintergrund
Thema durchsuchen
Ansicht
Themen-Optionen

Bug? Delphi Anwendung automatisch in den Hintergrund

Ein Thema von Gremlin · begonnen am 11. Jan 2021 · letzter Beitrag vom 22. Jan 2021
 
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.974 Beiträge
 
Delphi 12 Athens
 
#7

AW: Bug? Delphi Anwendung automatisch in den Hintergrund

  Alt 12. Jan 2021, 09:56
Ich hatte es vorhin auch schon kurz so wie geschrieben in ein Projekt gebaut und kann es auch mit Delphi 10.4 nachvollziehen.

Der Grund ist, dass in Vcl.Dialogs in der Funktion TFindDialog.Execute das Fenster für den TRedirectorWindow, über das hinterher der Fokus geschickt wird, mit EnumThreadWindows ermittelt wird. Da kommt dann das zweite unsichtbare Fenster heraus obwohl es nicht sichtbar ist.
Wenn du im Debugger nach diesem Aufruf in TRedirectorWindow(FRedirector).FFormhandle das Handle des ersten Formulars schreibst, funktioniert es korrekt, sprich dann bekommt dieses auch den Fokus.

Meiner Meinung nach liegt der Fehler hier in der Unit Vcl.Dialogs:
Delphi-Quellcode:
{$IF DEFINED(CLR)}
function GetTopWindow(Wnd: HWND; Mem: LParam):Bool;
{$ELSE}
function GetTopWindow(Wnd: THandle; var ReturnVar: THandle):Bool; stdcall;
{$ENDIF}
var
  Test: TWinControl;
begin
  Test := FindControl(Wnd);
  Result := True;
  if Assigned(Test) and (Test is TForm) then
  begin
{$IF DEFINED(CLR)}
    Marshal.WriteInt32(IntPtr(Mem), Wnd);
{$ELSE}
    ReturnVar := Wnd;
{$ENDIF}
    Result := False;
  end;
end;
Dort wird das Fenster als "TopWindow" zurückgegeben obwohl es gar nicht sichtbar ist. Leider weiß ich nicht wo diese Funktion sonst verwendet wird und habe auch gerade keine Zeit das zu prüfen. Vom Namen her würde ich aber annehmen, dass das so nicht korrekt ist.

Ich würde vermuten, dass es so korrekt ist:
Delphi-Quellcode:
  if Assigned(Test) and (Test is TForm) and Test.Visible then
//...
Ich weiß aber wie gesagt nicht wie sich das anderswo auswirken würde und ob die Funktion so gemeint ist wie ich es vermute. Das müsste erst geprüft werden bevor das als Bug gemeldet wird.

Andernfalls müsste in TFindDialog.Execute ein anderer Callback verwendet werden.
Sebastian Jänicke
AppCentral

Geändert von jaenicke (12. Jan 2021 um 09:59 Uhr)
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:05 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz