Delphi Form Switching using Timer

百般思念 提交于 2019-12-11 11:46:10

问题


I am a Delphi learner. A have a Project having 2 Forms("Form001" and "Form002"). There is a Button("BitBtn001") on "Form001". Both "Form001" and "Form002" is created by "FadeInTimer" and closed using "FormCloseQuery" by "FadeOutTimer". Both the Forms are minimized by "FormMinimizeTimer" and restored by "FormRetoreTimer". If I click on "BitBtn001" then "Form002" is shown.

Here is the Download Link of my Project :

The following is implementation logic :

Form 001 :

unit KoushikHalder001;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Buttons, Vcl.ExtCtrls,
  Vcl.Imaging.pngimage;

type
  TForm001 = class(TForm)
    Edit001: TEdit;
    Background: TImage;
    BitBtn001: TBitBtn;
    BitBtn002: TBitBtn;
    FadeInTimer: TTimer;
    FadeOutTimer: TTimer;
    FormMinimizeTimer: TTimer;
    FormRestoreTimer: TTimer;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure FormCreate(Sender: TObject);
    procedure FormHide(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure BitBtn001Click(Sender: TObject);
    procedure BitBtn002Click(Sender: TObject);
    procedure FadeInTimerTimer(Sender: TObject);
    procedure FadeOutTimerTimer(Sender: TObject);
    procedure FormClosingTimerTimer(Sender: TObject);
    procedure FormMinimizeTimerTimer(Sender: TObject);
    procedure FormRestoreTimerTimer(Sender: TObject);
  private
    { Private declarations }
    CrossButtonClick: Boolean;
    procedure WMNCHitTest(var Msg: TWMNCHitTest) ; message WM_NCHitTest;
    procedure WMSysCommand(var Msg: TWMSysCommand) ; message WM_SysCommand;
  public
    { Public declarations }
  end;

var
  Form001: TForm001;

implementation

{$R *.dfm}

uses KoushikHalder002;

procedure TForm001.WMNCHitTest(var Msg: TWMNCHitTest);
begin
  inherited;
  if ControlAtPos(ScreenToClient(Msg.Pos), True, True, True)= nil
    then
      begin
        if Msg.Result=htClient then Msg.Result := htCaption;
      end;
end;

procedure TForm001.WMSysCommand(var Msg: TWMSysCommand);
begin
  case Msg.CmdType of
    SC_MINIMIZE:
      begin
        if Form001.AlphaBlendValue > 0 then
          begin
            FormMinimizeTimer.Enabled := true;
            Exit;
          end;
      end;
    SC_RESTORE:
      begin
        if Form001.AlphaBlendValue < 220 then
          begin
            FormRestoreTimer.Enabled := True;
          end;
      end;
  end;
  inherited;
end;

procedure TForm001.BitBtn001Click(Sender: TObject);
begin
  if Form002.WindowState = wsMinimized then
    begin
      Form002.FormRestoreTimer.Enabled := true;
    end
    else
    Form002.show;
end;

procedure TForm001.BitBtn002Click(Sender: TObject);
begin
  FadeOutTimer.Enabled := true;
end;

procedure TForm001.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  FadeOutTimer.Enabled := true;
end;

procedure TForm001.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  if CrossButtonClick = true
    then
      begin
        CanClose := true;
        Exit;
      end;
  CanClose := false;
  FadeOutTimer.Enabled := true;
end;

procedure TForm001.FormCreate(Sender: TObject);
begin
  FadeInTimer.Enabled := true;
end;

procedure TForm001.FormHide(Sender: TObject);
begin
  FadeOutTimer.Enabled := true;
end;

procedure TForm001.FormShow(Sender: TObject);
begin
  FadeInTimer.Enabled := true;
end;

procedure TForm001.FadeInTimerTimer(Sender: TObject);
begin
  if Form001.AlphaBlendValue >= 220
    then
      begin
        FadeInTimer.Enabled := false;
      end
    else
      begin
        Form001.AlphaBlendValue := Form001.AlphaBlendValue + 10;
        CrossButtonClick := false;
      end;
end;

procedure TForm001.FadeOutTimerTimer(Sender: TObject);
begin
  if Form001.AlphaBlendValue <= 0
    then
      begin
        FadeOutTimer.Enabled := false;
        CrossButtonClick := true;
        Self.Close;
      end
    else
      begin
        Form001.AlphaBlendValue := Form001.AlphaBlendValue - 10;
        CrossButtonClick := true;
      end;
end;

procedure TForm001.FormClosingTimerTimer(Sender: TObject);
begin
  DoubleBuffered := true;
end;

procedure TForm001.FormMinimizeTimerTimer(Sender: TObject);
begin
  if Form001.AlphaBlendValue > 0 then
    begin
      Form001.AlphaBlendValue := Form001.AlphaBlendValue - 10;
    end
  else
    begin
      FormMinimizeTimer.Enabled := false;
      Perform(WM_SYSCOMMAND, SC_MINIMIZE, 0);
    end;
end;

procedure TForm001.FormRestoreTimerTimer(Sender: TObject);
begin
  if Form001.AlphaBlendValue < 220 then
    begin
      Form001.AlphaBlendValue := Form001.AlphaBlendValue + 10;
    end
  else
    begin
      FormRestoreTimer.Enabled := false;
    end;
end;

end.

Form 002 :

unit KoushikHalder002;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Buttons, Vcl.ExtCtrls,
  Vcl.Imaging.pngimage;

type
  TForm002 = class(TForm)
    Edit001: TEdit;
    Background: TImage;
    BitBtn001: TBitBtn;
    BitBtn002: TBitBtn;
    FadeInTimer: TTimer;
    FadeOutTimer: TTimer;
    FormClosingTimer: TTimer;
    FormMinimizeTimer: TTimer;
    FormRestoreTimer: TTimer;
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure FormHide(Sender: TObject);
    procedure BitBtn001Click(Sender: TObject);
    procedure BitBtn002Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure FadeInTimerTimer(Sender: TObject);
    procedure FadeOutTimerTimer(Sender: TObject);
    procedure FormClosingTimerTimer(Sender: TObject);
    procedure FormMinimizeTimerTimer(Sender: TObject);
    procedure FormRestoreTimerTimer(Sender: TObject);
  private
    { Private declarations }
    CrossButtonClick: Boolean;
    procedure WMNCHitTest(var Msg: TWMNCHitTest) ; message WM_NCHitTest;
    procedure WMSysCommand(var Msg: TWMSysCommand) ; message WM_SysCommand;
  public
    { Public declarations }
  end;

var
  Form002: TForm002;

implementation

{$R *.dfm}

uses KoushikHalder001;

procedure TForm002.WMNCHitTest(var Msg: TWMNCHitTest);
begin
  inherited;
  if ControlAtPos(ScreenToClient(Msg.Pos), True, True, True)= nil
    then
      begin
        if Msg.Result=htClient then Msg.Result := htCaption;
      end;
end;

procedure TForm002.WMSysCommand(var Msg: TWMSysCommand);
begin
  case Msg.CmdType of
    SC_MINIMIZE:
      begin
        if Form002.AlphaBlendValue > 0 then
          begin
            FormMinimizeTimer.Enabled := true;
            Exit;
          end;
      end;
    SC_RESTORE:
      begin
        if Form002.AlphaBlendValue < 220 then
          begin
            FormRestoreTimer.Enabled := True;
          end;
      end;
  end;
  inherited;
end;

procedure TForm002.BitBtn001Click(Sender: TObject);
begin
  FadeOutTimer.Enabled := true;
end;

procedure TForm002.BitBtn002Click(Sender: TObject);
begin
  FormClosingTimer.Enabled := true;
end;

procedure TForm002.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  if CrossButtonClick = true
    then
      begin
        CanClose := true;
        Exit;
      end;
  CanClose := false;
  FadeOutTimer.Enabled := true;
end;

procedure TForm002.FormHide(Sender: TObject);
begin
  FadeOutTimer.Enabled := true;
end;

procedure TForm002.FormShow(Sender: TObject);
begin
  FadeInTimer.Enabled := true;
end;

procedure TForm002.FadeInTimerTimer(Sender: TObject);
begin
  if Form002.AlphaBlendValue >= 220
    then
      begin
        FadeInTimer.Enabled := false;
      end
  else
    begin
      Form002.AlphaBlendValue := Form002.AlphaBlendValue + 10;
      CrossButtonClick := false;
    end;
end;

procedure TForm002.FadeOutTimerTimer(Sender: TObject);
begin
  if Form002.AlphaBlendValue <= 0
    then
      begin
       FadeOutTimer.Enabled := false;
       CrossButtonClick := true;
       Self.Close;
      end
    else
      begin
        Form002.AlphaBlendValue := Form002.AlphaBlendValue - 10;
        CrossButtonClick := false;
      end;
end;

procedure TForm002.FormClosingTimerTimer(Sender: TObject);
begin
  if Form002.AlphaBlendValue <= 0
    then
      begin
        FadeOutTimer.Enabled := false;
        CrossButtonClick := false;
        Form001.Close;
      end
    else
      begin
        Form002.AlphaBlendValue := Form002.AlphaBlendValue - 10;
        CrossButtonClick := false;
      end;
end;

procedure TForm002.FormMinimizeTimerTimer(Sender: TObject);
begin
  if Form002.AlphaBlendValue > 0 then
    begin
      Form002.AlphaBlendValue := Form002.AlphaBlendValue - 10;
    end
  else
    begin
      FormMinimizeTimer.Enabled := false;
      Perform(WM_SYSCOMMAND, SC_MINIMIZE, 0);
    end;
end;

procedure TForm002.FormRestoreTimerTimer(Sender: TObject);
begin
  if Form002.AlphaBlendValue < 220 then
    begin
      Form002.AlphaBlendValue := Form002.AlphaBlendValue + 10;
    end
  else
    begin
      FormRestoreTimer.Enabled := false;
    end;
end;

end.

Here "CrossButtonClick" is a Global Boolean variable used in "FormClosingQuery".

Every thing works fine except two issues.

Issue 01: If I close "Form002" using the "X" Button on caption bar and again click (as shown in "Image001")

on "BitBtn001" then "Form002" is shown again. But the problem is that if the "Form002" is minimizing and shown by "BitBtn001" and then close it by clicking "X" button (as shown in "Image002")

and again press on "BitBtn001" to show "Form002" but unfortunately "Form002" is not shown again.

Issue 02: If I restore "Form002" using the "RestoreUp" button in the caption (as shown in "Image003") "FormRestoreTimer" is not doing anything.

It is just normally restored up. Please help me. Please tell me about my mistake.

回答1:


The bug is:

procedure TForm001.BitBtn001Click(Sender: TObject);
begin
  if Form002.WindowState = wsMinimized then
    begin
      Form002.Perform(WM_SYSCOMMAND, SC_RESTORE, 0);  // ! - missed in your code
//      Form002.FormRestoreTimer.Enabled := true;   - not needed anymore
    end
    else
    Form002.show;
end;

You may not see fading effects when restoring the Form002 because fading is too fast.



来源:https://stackoverflow.com/questions/11699277/delphi-form-switching-using-timer

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