Reputation: 3022
Is there a property that tells if a form is deactivated by other form ShowModal
procedure ?
EDIT : My program has a tray icon that brings to front the main form when it's clicked. I want to disable this when another window is shown in modal state. Because not doing so the main form (which is disable) will cover the modal form and completly block my program.
Upvotes: 0
Views: 1125
Reputation: 612944
This behaviour is to be expected. When a modal form is shown, the other forms are disabled. You don't need to disable anything at all, the framework already handles it all for you. The beep is sounding because you are attempting to interact with a disabled form.
If you want to be notified when your window has been disabled, for any reason, not just because a modal form has been shown, listen to the WM_ENABLE
message. To test whether or not your main form has been disabled. Do that by calling the IsWindowEnabled
Win32 function.
Having said that I feel that it is likely you've not diagnosed the issue correctly. It sounds like you might be suffering from window ownership problems, which are common in Delphi 6. Or perhaps you are attempting to restore the application incorrectly from your notification icon code. Use Application.BringToFront
for that.
The VCL's handling of modal dialogs seem very mixed up. When you show a system provided modal dialog, e.g. MessageBox
, windows are disabled whether or not they are visible. However, the VCL only disables visible windows when ShowModal
is called. What's more, you cannot use Enabled
to test whether or not the window is disabled, you must use the IsWindowEnabled
Win32 function.
Upvotes: 2
Reputation: 54802
You can test Application.ModalLevel
at any point in time to find out if there's a modal form. E.g.:
if Application.ModalLevel = 0 then
MainForm.Visible := True;
Note that non-TCustomForm descendants will not set modal level, API dialogs like a file open dialog or MessageBox for instance. If there's a possibility of such a thing, you might surround code that runs those dialogs with ModalStarted
and ModalFinished
.
It doesn't seem necessary in your case, but if you somehow need to be notified that a form/dialog is going modal, you can attach a handler to Application.OnModalBegin
and Application.OnModalEnd
events. You can use an TApplicationEvents
component for that.
Upvotes: 1