2012-07-28 73 views
1

我是一個Delphi學習者。 A有一個有2個表格的項目(「Form001」和「Form002」)。 「Form001」上有一個按鈕(「BitBtn001」)。 「Form001」和「Form002」均由「FadeInTimer」創建,並且由「FadeOutTimer」使用「FormCloseQuery」關閉。這兩個表單都通過「FormMinimizeTimer」最小化並由「FormRetoreTimer」恢復。如果我點擊「BitBtn001」,則會顯示「Form002」。使用定時器的Delphi窗體切換

Here is the Download Link of my Project :

以下是實現邏輯:

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

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

這裏「CrossButtonClick」是在「FormClosingQuery」中使用的全局布爾變量。

除了兩個問題,每件事情都很好。

問題01: 如果我關閉「Form002」使用標題欄上的「X」按鈕,再單擊(如圖「Image001」)的「BitBtn001」,然後「Form002」 Image001 再次顯示。但問題是,如果「Form002」最小化並顯示「BitBtn001」,然後通過單擊「X」按鈕(如「Image002」中所示)Image002 並再次按下「BitBtn001」以顯示「Form002」但不幸的是「Form002」不再顯示。

問題02: 如果我恢復「Form002」用在標題中「RestoreUp」按鈕(如圖「Image003」)「FormRestoreTimer」沒有做任何事情。 Image003它只是正常恢復。請幫幫我。請告訴我關於我的錯誤。

+0

請發送一個可以編譯的代碼。一個好的答案應該被編譯和測試。 – kludg 2012-07-28 08:40:53

+1

**我已添加編譯所需的完整代碼,並添加了下載鏈接。請參見。請回復。** – 2012-07-28 16:19:16

回答

1

的錯誤是:

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; 

你可能看不到恢復Form002時,因爲褪色太快衰減效應。

+0

非常感謝。根據我的需要,您的建議可以正常工作。謝謝謝謝... – 2012-07-29 12:41:31