Question

Non-modal form cannot be closed after minimizing parent

Asked by: zebada

Using Delphi 7 Professional,
I have two forms: Form1 and Form2.
A button on Form1 opens Form2 using
  Form2.Show;
then enables a timer that will expire in 3 seconds.
The timer's OnTimer event has this code in it:
  Form2.Hide;
That all works as expected, when the button is clicked, the second form is opened and then closes 3 seconds later.

However, if the main form is minimized before the 3 secodns expire and then restored after the 3 seconds expire then Form2 is not hidden, nor can it be hidden. In fact it's visible property is set to false even though it is plainly visible on the screen.

How can I make Form2 be hidden while the main form is minimized?

Regards
Paul

This Question has been solved and asker verified All Experts Exchange premium technology solutions are available to subscription members.

Subscribe now for full access to Experts Exchange and get

Instant Access to this Solution

  • Plus...
  • 30 Day FREE access, no risk, no obligation
  • Collaborate with the world's top tech experts
  • Unlimited access to our exclusive solution database
  • Never be left without tech help again

Subscribe Now

Asked On
2004-06-27 at 05:09:25ID21039479
Tags

delphi

,

form

,

cannot

Topic

Delphi Programming

Participating Experts
3
Points
500
Comments
7

Trusted by hundreds of thousands everyday for fast, accurate and reliable tech support.

  • "The time we save is the biggest benefit of Experts Exchange to Warner Bros. What could take multiple guys 2 hours or more each to find is accessed in around 15 minutes on Experts Exchange." Mike Kapnisakis, Warner Bros.
  • "Our team likes having a resource that is more secure than just using Google and most experts using this service really know their stuff. It's nice to look here first versus using Google." Dayna Sellner, Lockheed Martin
  • "Anytime that I've been stumped with a problem, 9 out of 10 times Experts Exchange has either the accepted solution or an open discussion of the potential solution to the problem." Kenny Red, eBay Inc.

See what Experts Exchange can do for you.

Got a question?

We've got the answer.

Experts Exchange has been collecting answers to technology questions since 1996…3 million and counting! If you have a question, chances are we already have your answer.

Screenshot of Experts Exchange Knowledgebase

Need individual assistance?

Our experts are ready to help.

If you can't find the exact answer you're looking for, ask our exclusive community of 50,000 experts. You’ll get a personalized answer from a trusted professional.

Screenshot of Experts Exchange Knowledgebase

Want to learn from the best?

Read articles from industry experts.

Thousands of free tech tips, tricks, how-to’s and tutorials are available in our peer reviewed articles section. See for yourself how smart our experts are, no login required.

Screenshot of an Article

Working on a long term project?

Store your work and research.

Save solutions to your questions, answers you’ve discovered through searching plus helpful articles in your personal knowledgebase for easy future access.

Screenshot of Experts Exchange Knowledgebase

Access the answers to your technology questions today.

Subscribe Now

30-day free trial. Register in 60 seconds.

What Makes Experts Exchange Unique?

Members of the expert community talk about why the experience at Experts Exchange is different than what you will find anywhere else.

Trusted by the world's most respected brands.

image of each brand's logo

Faithfully serving IT professionals since 1996.

Experts Exchange Logo

Try it out and discover for yourself.

Subscribe Now

30-day free trial. Register in 60 seconds.

Related Solutions

  1. OnTimer at runtime
    Hey All, I need to create the Timer component at run time and then assign the OnTimer event to the event code that I have created. Can anyone give an example? Thanks, Chad
  2. Showing a modal form
    How to show a modal form, and set focus to some of its control. i want to set focus to a control, and in another time set focus to another control ... and so on. elzohry
  3. Open form2 from form1
    I want to open form2 from a button on form1. Both of these forms are mdiChildren. The parent is formParent. If form2 is not modal then it could disappear behind form1 after it has been opened and then if the user clicks the button on form1 again, a new instance of form2 ...
  4. Modal to Normal ( for experts )
    Hi guys, I would like to my program set an external application window in Modal mode to normal mode. Because, when the window is showed is normal mode, if I know the HWND of the window, I can hide it and use another window. But if it is showed in modal mode, I can hide the wi...
  5. Modal form interaction
    Hi, I'm making a color dialog component and have a form with a tshape on it. When the user presses a button another form (dialog component) opens modally. In the new modal form's onmousemove event I have code which gets the color at the desired point and then it should set th...

Free Tech Articles

  1. WARNING: 5 Reasons why you should NEVER fix a computer for free.
    It is in our nature to love the puzzle. We are obsessed. The lot of us. We love puzzles. We love the challenge. We thrive on finding the answer. We hate disarray. It bothers us deep in our soul. W...
  2. SCCM OSD Basic troubleshooting
    SCCM 2007 OSD is a fantastic way to deploy operating systems, however, like most things SCCM issues can sometimes be difficult to resolve due to the sheer volume of logs to sift through and the dispe...
  3. Migrate Small Business Server 2003 to Exchange 2010 and Windows 2008 R2
    This guide is intended to provide step by step instructions on how to migrate from Small Business Server 2003 to Windows 2008 R2 with Exchange 2010. For this migration to work you will need the fo...
  4. Create a Win7 Gadget
    This article shows you how to create a simple "Gadget" -- a sort of mini-application supported by Windows 7 and Vista. Gadgets can be dropped anywhere on the desktop to provide instant information, ...
  5. Outlook continually prompting for username and password
    There have been a lot of questions recently regarding Outlook prompting for a username and password whilst using Exchange 2007. There are a few reasons why this would happen and I will try to cover t...
  6. Backup Exchange 2010 Information Store using Windows Backup
    There seems to be quite a lot of confusion around the ability to backup Exchange 2010 using the built in Windows Backup feature. This stems from the omission of this feature prior to Exchange 2007 s...

Cloud Class Webinars

  1. Avoiding Bugs in Microsoft Access
    Alison Balter takes and in-depth look at avoiding bugs in Access. In this webinar you will learn about using the immediate window to debug your applications, invoking the debugger, using breakpoints to troubleshoot, stepping through code, setting the next statement to execute, ...
  2. Top 10 Best New Features in Visio 2010
    Scott Helmers gives live demonstrations of the top 10 new features in Visio 2010. This webinar will teach you how to create compelling diagrams by adding shapes to the page with a single click, linking the shapes in a diagram to data in Excel (or SQL Server, or SharePoint), ...
  3. IT Consultant Business Secrets Revealed
    Michael Munger, Experts Exchange tech pro and IT consultant, pulls back the curtain on his very successful businesses and answers question on every IT consultant and business owner should know about. He shares secrets on what he did to solve the 5 most common problems in IT, ...
  4. Disaster Recovery and Business Continuity
    Quest CTO, Mike Billon, gives an overview of the steps involved in building a dunamic disaster recovery plan. Through case studies and an examination of software/hardware tooles for monitoring and testing, you'll gain a better understandin of where you are, where you want ...
  5. Organize Your Visio Diagrams with Containers and Lists
    Scott Helmers uses cross functional flowcharts, wireframe diagrams, data graphic legends and seating charts to teach you: how to ustilize all three new structured diagram components in Visio 2010, the best practices for organizeing shapes in previous version of Visio, how to organize ...
  6. How to Us Objects, Properties, Events and Methods in Microsoft Access
    Alison Dalter gives an in-depbth look at objects, properties, events and methods in Microsoft Access. In this webinar you will learn about using the object browser, referring to objects, working with properties and methods, working with object variables, understanding the ...

Join the Community

Give a Little. Get a Lot.

Join the community of experts here and help other tech pros by answering question in your area of expertise. You can earn FREE access to all Experts Exchange's premium features and resources.

Join the Community

Answers

 

by: KyleyHarrisPosted on 2004-06-27 at 07:23:15ID: 11409959

It is a bug. Probably in windows. Why does Form2 need to stay in memory.

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  FForm2.Release;
  FForm2 := nil;
  Timer1.Enabled := false;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  FForm2 := TForm2.Create(Self);
  FForm2.Show;
  Timer1.Enabled := true;
end;

this way you'll not have a problem because the form will only exist for the period that you need it. If you need the form2 to stay in memory because it is processing data then I would reccommend that you move all your business logic into a non-visual object that resides on the Form1 of the example. Make Form2 a view and pass the business object to it for use during its 3-second life..

 

by: esoftbgPosted on 2004-06-27 at 13:44:27ID: 11411567

Try the next code: It works fine (I tested it)

program Q_21039479;

uses
  Forms,
  Unit1_Q_21039479 in 'Unit1_Q_21039479.pas' {Form1},
  Unit2_Q_21039479 in 'Unit2_Q_21039479.pas' {Form2};

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TForm2, Form2);
  Application.Run;
end.

//........ Unit1

unit Unit1_Q_21039479;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private{ Private declarations }
  public { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses Unit2_Q_21039479;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2.Show;
end;

end.

//........ Form1

object Form1: TForm1
  Left = 224
  Top = 128
  Width = 696
  Height = 480
  Caption = 'Form1'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  Position = poDefaultPosOnly
  PixelsPerInch = 96
  TextHeight = 13
  object Button1: TButton
    Left = 8
    Top = 8
    Width = 96
    Height = 25
    Caption = 'Show Form2'
    TabOrder = 0
    OnClick = Button1Click
  end
end

//........ Unit2

unit Unit2_Q_21039479;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;

type
  TForm2 = class(TForm)
      Timer1: TTimer;
      procedure FormShow(Sender: TObject);
      procedure Timer1Timer(Sender: TObject);
    private{ Private declarations }
    public { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.FormShow(Sender: TObject);
begin
  Timer1.Enabled := True;
end;

procedure TForm2.Timer1Timer(Sender: TObject);
begin
  Hide;
end;

end.

//........ Form2

object Form2: TForm2
  Left = 288
  Top = 160
  Width = 512
  Height = 320
  Caption = 'Form2'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  Position = poMainFormCenter
  OnShow = FormShow
  PixelsPerInch = 96
  TextHeight = 13
  object Timer1: TTimer
    Enabled = False
    Interval = 3000
    OnTimer = Timer1Timer
    Left = 16
    Top = 16
  end
end

//........

emil

 

by: esoftbgPosted on 2004-06-27 at 13:53:20ID: 11411597

above example from site:        http://www.geocities.com/esoftbg/
                              link:        Q_21039479.zip

 

by: zebadaPosted on 2004-06-27 at 14:44:37ID: 11411761

Thanks for the comments.
The form does not need to stay in memory, the form does not do any processing, it is just a display/status window that is used to display the processing of another task.
Actually, the window is displayed whenever a coms (serial) link goes down, it shows the retry attempts (every 1 or 2 seconds). Once the connection is re-established then form is hidden again - only it does not get hidden if the comms link is re-established when the main form is minimized. The "Timer" part of my demo code was just to demonstrate the problem. There is no timer in the real code.

I'll try the options posted here and let you know how it went - thanks.

Paul

 

by: Slick812Posted on 2004-06-27 at 21:28:08ID: 11412940

Hello zebada, when the application is minimized, it sets all forms to hidden (not visible), and it seems that your code will show your form2, when delphi does not expect it to be shown, (although, I can not see exactly what is going on from your description), so if "Delphi" has your form as visible := False (even if it is visible) then setting it to false again is just ignored, IE, nothing is done, so you will need to use the window API to show and hide your form . . .

ShowWindow(Form2.Handle,SW_HIDE);

or

ShowWindow(Form2.Handle,SW_SHOW);

but the Delphi Visible property for that form WILL NOT show the true visible state of that form

 

by: Slick812Posted on 2004-06-27 at 21:33:30ID: 11412956

oh if you want to stick to delphi codeing, you will nedd to double call the hide and show

if the form2 is visible and the visible property is false you will need to call show, before you call Hide

Form2.Show; // delphi thinks the form is hidden, so show it first, to coordinate the actual state with the delphi state
Form2.Hide;

or if reversed situation then

Form2.Hide;
Form2.Show;

 

by: zebadaPosted on 2004-06-29 at 01:21:32ID: 11423756

Hi Slick812,
I did not think of doing that, but even so it does not appear to work, the form stays visible and unclosable - even by clicking on the "close" [X] icon in the top right corner.

I did try the solution put up by KyleyHarris and that does close the form. I needed to pull some stateful data from the form (back into the main form) which is lost when the form is destoryed but at least now the window is not visible.
Thanks!
Paul

20120131-EE-VQP-002

3 Ways to Join

30-Day Free Trial

The Experts

98% positive feedback on 31,087 answers since March 2000. angeliii is a Microsoft Most Valuable Professional for his work with MS SQL Server & Develoment.

He has also proven his knowledge of Visual Basic Programming, PHP Scripting and Oracle Databases.

The Experts

97% positive feedback on 10,752 answers since July 2000. lrmoore has more than 18 years experience in the networking industry.

The six-time Mircosoft MVPs specialties include firewalls, virtual private networking, and network management.

Testimonials

"...and excellent source for support... Kind of like having your very own IT dept." Electriciansnet

Testimonials

"I was apprehensive at signing up at first. However... it has already made my life as an IT administrator much easier." JaCrews

Testimonials

"WOW! You guys have great, active, and knowledgeable people on here." moore50

Business Clients

Business Clients

In the Press

"If you’ve got a question... Experts Exchange can supply an answer.”

In the Press

"...an invaluable aid for both IT professionals and those who require tech support."

In the Press

"where IT professionals provide quick answers on just about any topic"

Business Account Plans

Loading Advertisement...