Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people, just like you, are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
Solved

"Cannot make a visible Window modal"

Posted on 2009-04-13
6
2,774 Views
Last Modified: 2012-05-06
I get the above error when running the code shown below. TfrmAddUser is NOT in the auto-create list. Its relevant properties are set as follows:

Visible: False
Enabled: True
FormStyle: fsNormal
WindowState: wsNormal

I am using Delphi 2006. I checked the existing Question:

http://www.experts-exchange.com/Programming/Languages/Pascal/Delphi/Q_21234459.html

... but nothing there seemed to make it work either. Any ideas, anyone?
procedure TfrmUserRoles.mAddUser;
var
  loAddUser: TfrmAddUser;
  lsUserID: string;
begin
  loAddUser := TfrmAddUser.Create(nil, lsUserID);
  try
    if (loAddUser.ShowModal = mrOk) then
      tvUsers.Items.Add(tvUsers.TopItem, lsUserID);
  finally
    loAddUser.Free;
  end;
end;

Open in new window

0
Comment
Question by:MartinC
  • 4
  • 2
6 Comments
 

Expert Comment

by:LucEngelen
ID: 24134223
Use this instead, and add the AddUser unit to whichever unit youre calling the dialog from

procedure TfrmUserRoles.mAddUser;
var
  lsUserID: string;
begin
  if frmAddUser = nil then
    Application.CreateForm(TfrmAddUser, frmAddUser);

  if frmAddUser.ShowModal = mrOK then
    ...

  frmAddUser.Release;
end;

0
 

Expert Comment

by:LucEngelen
ID: 24134243
Oops, and frmAddUser := nil; after frmAddUser.Release, or you'll get access violations next time you call it.
0
 

Author Comment

by:MartinC
ID: 24134333
LucEngelen:

Your method is an alternate way of calling a Modal form (and in fact one I have used before) but I was really hoping to find out why the code I wrote above - which conforms to methods used elsewhere in this app - might not work. The original code seems to be a reasonable way to do it - assign the created form to a local variable of type TfrmAddUser, and free it at the end after reading the returned lsUserID - but the error I get stymies me.
0
Free Tool: Path Explorer

An intuitive utility to help find the CSS path to UI elements on a webpage. These paths are used frequently in a variety of front-end development and QA automation tasks.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

 

Accepted Solution

by:
LucEngelen earned 60 total points
ID: 24134386
I dont know what your create constructor is doing, since you havent included it in your sample code.

Are you setting form.visible := true in there?  If so that is the reason for the issue.

You cannot call ShowModal once a window has had its visible state changed to true.

You may want to test this by just calling ;
loAddUser := TfrmAddUser.Create(nil);
loAddUser.ShowModal;


0
 

Author Comment

by:MartinC
ID: 24134449
And I wish I HAD included the constructor because then you would no doubt have spotted instantly what I left out:

  inherited create(AOwner);

I just spotted it then myself before reading your last comment, but thanks - and points - for your help anyway.
0
 

Expert Comment

by:LucEngelen
ID: 24134571
It happens ;)  Its happened to me so many times I made it a habit to write inherited Create and inherited Destroy as soon as the begin and ends are in place, even if I wasnt working on those functions at the time.

0

Featured Post

Free Tool: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

The uses clause is one of those things that just tends to grow and grow. Most of the time this is in the main form, as it's from this form that all others are called. If you have a big application (including many forms), the uses clause in the in…
Objective: - This article will help user in how to convert their numeric value become words. How to use 1. You can copy this code in your Unit as function 2. than you can perform your function by type this code The Code   (CODE) The Im…
With Secure Portal Encryption, the recipient is sent a link to their email address directing them to the email laundry delivery page. From there, the recipient will be required to enter a user name and password to enter the page. Once the recipient …

860 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question