How do do things during Delphi form startup

ぐ巨炮叔叔 提交于 2020-07-09 13:25:31

问题


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


回答1:


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;



回答2:


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;



回答3:


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.




回答4:


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.


来源:https://stackoverflow.com/questions/2075839/how-do-do-things-during-delphi-form-startup

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!