In Delphi 2009, I do a simple:
FindDialog.Execute;
The FindDialog window stays on top of my program's main window as it should.
However, if I open another window from some other program over my own program's window, the FindDialog window remains on top of the other window.
If I try this with a FindDialog from another program (e.g. Notepad), this does not happen. Opening another program's window over Notepad and its FindDialog will cover both the Notepad and FindDialog windows. This seems to be the correct and expected behavior.
Is this something I'm doing wrong or is this a problem with the way Delphi has implemented the FindDialog? Is there something I can do to make it work the Notepad way?
Thank you all for the comments. The fact that you cannot reproduce my problem is already a clue that it is something else causing this. This will help me track it down. I'll research a little more and post additional info here when I find out something.
Very interesting. My PrintDialog doesn't stay on top. Still don't know why my FindDialog does. Still researching...
I changed the call to: FindDialog.Execute(Handle); Still on top.
I added another FindDialog (this time FindDialog1) to my main form and I execute it at startup of my program. It has the same stay-on-top behavior. That at least indicates it wasn't anything to do with my FindDialog or customizations I made to do with it. So it must be a setting in my main form.
It doesn't look like I'm the only one who's encountered this. See: Resource Tuner: Version History which appears to be a Delphi application, where under Version 1.99 it states: "Bugfix: The (search) dialog preview window stayed on top when switching to another application." I might try contacting them and see if they might remember what their fix was.
I add some new dialogs to my form and put these calls in one place:
FindDialog1.Execute();
PrintDialog1.Execute();
ReplaceDialog1.Execute();
FontDialog1.Execute();
The FindDialog and ReplaceDialog stay on top in front of other windows. The PrintDialog and FontDialog do not stay on top and work as they should.
So what is different between the two sets of dialogs that make the first two do it wrong?
Also, this problem happens in an old version of my program that was compiled with Delphi 4. Whoops. Now I see this problem did not happen in my old version that used Delphi 4.
And it was a user who reported this problem. He uses Windows XP, and I'm developing on Vista, so it happens under different OS's.
Confirmation: Yes, I create a new form and add a FindDialog on it. The FindDialog does NOT have the problem. This indicates something in my program is causing the FindDialog to stay on top. Now, I've just got to find out what that is. Any more ideas? If someone gives me an answer that even gives me a clue to help me solve this, then they'll get the accepted answer.
Solution: Sertac's edit to his answer gave me the workaround:
Application.NormalizeTopMosts;
FindDialog.Execute();
Application.RestoreTopMosts;
Doing this prevents the FindDialog from being TopMost when the Application is not TopMost.
... But I still really don't understand this (the Delphi help on NormalizeTopMosts) is very confusing and doesn't indicate that it should do this.
Hopefully this "fix" won't cause other problems.
FindDialog1.Execute;
andFindDialog1.Execute();
which should both lead to no handle passed in. When I open the Find dialog, then open some other app (Notepad in my case) and move it over my Delphi app with dialog, both its main window and the find dialog are covered by Notepad's window. – SnowyGetDesktopWindow
as the argument!). – HonoriaParentWnd
that's passed to the overloadedFindDialog.Execute()
does nothing, it is not referred to even once. ThehwndOwner
of a Find Dialog Box is always someTRedirectorWindow
.EnumThreadWindows
is used to find the 'Top Window' which then is passed to become the 'redirector's window owner, which is the Find Dialog's window owner. Always!. See the code and the comment '{ TRedirectorWindow }' in dialogs.pas. – Fiann