私は Delphi の学習者です。2 つのフォーム ("Form001" と "Form002") を持つプロジェクトがあります。「Form001」にボタン(「BitBtn001」)があります。「Form001」「Form002」ともに「FadeInTimer」で作成し、「FadeOutTimer」で「FormCloseQuery」で閉じます。両方のフォームは、「FormMinimizeTimer」によって最小化され、「FormRetoreTimer」によって復元されます。「BitBtn001」をクリックすると、「Form002」が表示されます。
以下は実装ロジックです。
フォーム 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」で使用されるグローバル ブール変数です。
2つの問題を除いて、すべてが正常に機能します。
問題 01:
キャプション バーの "X" ボタンを使用して "Form002" を閉じ、("Image001" に示されているように) "BitBtn001" をもう一度クリックすると
、"Form002" が再び表示されます。しかし、問題は、「Form002」が最小化されて「BitBtn001」によって表示され、「X」ボタンをクリックして閉じ(「Image002」に示されているように)、「BitBtn001」
をもう一度押すと「Form002」が表示されることですが、残念ながら「Form002」は再表示されません。
問題 02:
(「Image003」に示すように) キャプションの「RestoreUp」ボタンを使用して「Form002」を復元すると、「FormRestoreTimer」は何も実行しません。普通に復活しただけです。私を助けてください。私の間違いについて教えてください。