tags:

views:

397

answers:

4

I have a form one which I want to show a file open dialog box before the full form opens.

I already found that I can't do UI related stuff in FormShow, but it seems that I can in FormActivate (which I protect from being called a second time...)

However, if the user cancels out of the file open dialog, I want to close the form without proceeding.

But, a form close in the activate event handler generates an error that I can't change the visibility of the form.

So how does one do some UI related operation during form start up and then perhaps abort the form (or am I trying to stuff a function into the form that should be in another form?)

TIA

A: 

If you want to keep the logic conditioning the opening self-contained in the Form, you can put a TOpenDialog in your Form and use a code like this in your OnShow event:

procedure TForm2.FormShow(Sender: TObject);
begin
  if OpenDialog1.Execute(Handle) then
    Color := clBlue
  else
    PostMessage(Handle, WM_CLOSE, 0, 0); // NB: to avoid any visual glitch use AlpaBlend
end;

If you don't need this encapsulation, a better alternative can be to check the condition before trying to show the form, for instance by embedding the Form2.Show call in a function that tests all the required conditions first.

François
I'd appreciate a comment for the downvote!
François
+3  A: 

It would be best (i think) to show the file open dialog BEFORE you create and show the form. If you want to keep all code together you might add a public class procedure OpenForm() or something:

class procedure TForm1.OpenForm( ... );
var
    O: TOpenDialog;
    F: TForm1;
begin
  O := TOpenDialog.Create();
  try
    // set O properties.
    if not O.Execute then Exit
    F := TForm1.Create( nil );
    try
      F.Filename := O.FIlename;
      F.ShowModal();
    finally
      F.Free();
    end;
  finally
    O.Free();
  end;
end;
Ritsaert Hornstra
A: 

Set a variable as a condition of the opendialog and close the form on the formshow event if the flag is not set correctly.

procedure TForm1.FormCreate(Sender: TObject);
begin
  ToClose := not OpenDialog1.Execute;
end;


procedure TForm1.FormShow(Sender: TObject);
begin
  if ToClose then Close();
end;

or even more simply

procedure TForm1.FormShow(Sender: TObject);
begin
  if not OpenDialog1.Execute then Close();
end;
Steve
Steve, you cannot simply call Close from the OnShow event as the OP rightly pointed out.
François
That code is copied from a small app I just created to test it. Worked for me... Delphi 2006
Steve
A: 

Two Ways.... 1. using oncreate and onactivate

create a global flag or even 2 var
aInitialized:boolean;

Set the flag to false in the oncreate handler. aInitialized := false; //we have not performed our special code yet.

Inside onActivate have something like this if not aInitialized then begin //our one time init code. special stuff or whatever If successful then set aInitialized := true else aInitialized := false end;

And how to close it without showing anything just add your terminate to the formshow. of course you need to test for some reason to close.. :)

Procedure Tmaindlg.FormShow(Sender: TObject); Begin If (shareware1.Sharestatus = ssExpired) or (shareware1.Sharestatus = ssTampered) Then application.Terminate; End;

In your DPR you will need to add a splash screen type effect. In my case I am showing progress as the application starts. You could also just show the form and get some data.

Code from the splash.pas Procedure tsplashform.bumpit(str: string); Begin label2.Caption := str; gauge1.progress := gauge1.progress + trunc(100 / items); update; If gauge1.progress >= items * (trunc(100 / items)) Then Close; End;

Program Billing; uses Forms, main in 'main.pas' {maindlg}, Splash in 'splash.pas' {splashform};

{$R *.RES}

Begin Application.Initialize; Application.Title := 'Billing Manager'; SplashForm := TSplashForm.Create(Application); SplashForm.Show; SplashForm.Update; splash.items := 5; SplashForm.bumpit('Loading Main...'); Application.CreateForm(Tmaindlg, maindlg); SplashForm.bumpit('Loading Datamodule...'); Application.CreateForm(TfrmSingleWorkorder, frmSingleWorkorder); SplashForm.bumpit('Loading SQL Builder...'); Application.CreateForm(TDm, Dm); SplashForm.bumpit('Loading Security...'); Application.CreateForm(TSQLForm, SQLForm); SplashForm.bumpit('Loading Reports...'); Application.CreateForm(Tpickrptdlg, pickrptdlg); Application.Run; End.

General Jackson Tackett