Solved

Returning from TForm1.Close() event

Posted on 2001-07-24
10
265 Views
Last Modified: 2010-04-04
Hello.  Just a problem I ran across while programming =>
How do I return from a TForm1.Close() event.

For example =>
when a user presses the window's X, then the program tells him the document has not been saved, and he presses cancel

Or =>
when a user decides to save the file, but then in the SaveDialog presses cancel, thereby indicating that he wants to return to the program

When a new file is opened, but the existing file needs to be saved, I also need to do the same check (i.e - do you want to save the file?), but that I can sit in a seperate procedure, or check the Sender...  Concerning the TForm.Close() I'm stumped however...

Thanks for any help
Serdyn
0
Comment
Question by:Lmoen
[X]
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
  • 4
  • 3
  • 2
  • +1
10 Comments
 
LVL 21

Accepted Solution

by:
gemarti earned 150 total points
ID: 6313569
In the OnCloseQuery event of the form put in the following code:

If CanClose = true then
  begin
    CanClose := false;
    .
    .
    .
    do something; //insert your code

  end;
0
 
LVL 1

Expert Comment

by:Phoenix_s
ID: 6313602
use the form.closequery event which fires before the form.close.  This allows you to program anything that needs to be done

---direct cut'n paste from d5 help

Occurs when the Close method is called or when the user chooses Close from the form's System menu.

type TCloseQueryEvent = procedure(Sender: TObject; var CanClose: Boolean) of object;
property OnCloseQuery: TCloseQueryEvent;

Description

Use OnCloseQuery to specify the conditions under which the form can close. An OnCloseQuery event handler contains a Boolean CanClose variable that determines whether a form is allowed to close. Its default value is True.

You can use an OnCloseQuery event handler to ask users if they are sure they really want the form closed immediately. For example, you can use the handler to display a message box that prompts the user to save a file before closing the form.

The TCloseQueryEvent type points to the method that determines whether a form can be closed. The value of the CanClose parameter determines if the form can close or not.


example from same d5 helpfile

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);

begin
  if MessageDlg('Close the form?', mtConfirmation,
    [mbOk, mbCancel], 0) = mrCancel then
     CanClose := False;
end;

----------------------------------------------------------

as long as you do processing in the formclosequery event, you have control over whether the form closes or not.



hope this helps
0
 
LVL 1

Expert Comment

by:Phoenix_s
ID: 6313617
getmarti - damn... you beat me by 4 mins ;)

0
Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
LVL 27

Expert Comment

by:kretzschmar
ID: 6313674
On CloseQuery is the right point

CanClose would be allways true at start, germarti,

i would prefer something like this:

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var mresult : Integer;
begin
  if memo1.Modified then
    mResult := MessageBox(self.Handle,'Save before Quit?','Confirm',MB_YESNOCANCEL or MB_ICONQUESTION);
    case mResult of
      mrYes :  If savedialog1.execute then
                       memo1.lines.savetofile(savedialog1.filename);
      mrCancel : CanClose := False;
    end;
end;


meikl ;-)
0
 
LVL 27

Expert Comment

by:kretzschmar
ID: 6313708
oops a begin - end pair missed

corrected version

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var mresult : Integer;
begin
  if memo1.Modified then
  begin
    mResult := MessageBox(self.Handle,'Save before Quit?','Confirm',MB_YESNOCANCEL or MB_ICONQUESTION);
    case mResult of
      mrYes : If savedialog1.execute then
                memo1.lines.savetofile(savedialog1.filename);
      mrCancel : CanClose := False;
    end;
  end;
end;

meikl ;-)
0
 
LVL 5

Expert Comment

by:scrapdog
ID: 6313821
OnCloseQuery works nicely with MDI forms too.  The main form checks all of the child forms before calling its own OnCloseQuery.
0
 
LVL 21

Expert Comment

by:gemarti
ID: 6313986
Phoenix - Yeah...but Kretzschmar may have the better of us both..


Waiting.....
0
 
LVL 27

Expert Comment

by:kretzschmar
ID: 6314062
gemati,
at least, you was the first on the right point of the preferred solution,
i just added a better example

meikl ;-)
0
 
LVL 21

Expert Comment

by:gemarti
ID: 6314788
Kretzschmar: As I stated...You had the better of both Phoenix and me.

Anyway...I got a long way to go to catch up with you so I'll take what I earn.

  GEM  :->
0
 
LVL 27

Expert Comment

by:kretzschmar
ID: 6316051
>I got a long way to go to catch up with you so I'll take what I earn.

go on, gem :-))
0

Featured Post

Enroll in July's Course of the Month

July's Course of the Month is now available! Enroll to learn HTML5 and prepare for certification. It's free for Premium Members, Team Accounts, and Qualified Experts.

Question has a verified solution.

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

This article explains how to create forms/units independent of other forms/units object names in a delphi project. Have you ever created a form for user input in a Delphi project and then had the need to have that same form in a other Delphi proj…
In my programming career I have only very rarely run into situations where operator overloading would be of any use in my work.  Normally those situations involved math with either overly large numbers (hundreds of thousands of digits or accuracy re…
If you’ve ever visited a web page and noticed a cool font that you really liked the look of, but couldn’t figure out which font it was so that you could use it for your own work, then this video is for you! In this Micro Tutorial, you'll learn yo…
This tutorial will teach you the special effect of super speed similar to the fictional character Wally West aka "The Flash" After Shake : http://www.videocopilot.net/presets/after_shake/ All lightning effects with instructions : http://www.mediaf…
Suggested Courses
Course of the Month10 days, 20 hours left to enroll

628 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