开发者

How do do things during Delphi form startup

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 开发者_JAVA技巧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


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;


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;


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.


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.
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜