我是一個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」 再次顯示。但問題是,如果「Form002」最小化並顯示「BitBtn001」,然後通過單擊「X」按鈕(如「Image002」中所示)
並再次按下「BitBtn001」以顯示「Form002」但不幸的是「Form002」不再顯示。
問題02: 如果我恢復「Form002」用在標題中「RestoreUp」按鈕(如圖「Image003」)「FormRestoreTimer」沒有做任何事情。 它只是正常恢復。請幫幫我。請告訴我關於我的錯誤。
請發送一個可以編譯的代碼。一個好的答案應該被編譯和測試。 – kludg 2012-07-28 08:40:53
**我已添加編譯所需的完整代碼,並添加了下載鏈接。請參見。請回復。** – 2012-07-28 16:19:16