1

私は 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" をもう一度クリックすると画像001 、"Form002" が再び表示されます。しかし、問題は、「Form002」が最小化されて「BitBtn001」によって表示され、「X」ボタンをクリックして閉じ(「Image002」に示されているように)、「BitBtn001」画像002 をもう一度押すと「Form002」が表示されることですが、残念ながら「Form002」は再表示されません。

問題 02: (「Image003」に示すように) キャプションの「RestoreUp」ボタンを使用して「Form002」を復元すると、「FormRestoreTimer」は何も実行しません。画像003普通に復活しただけです。私を助けてください。私の間違いについて教えてください。

4

1 に答える 1

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 を復元するときにフェード効果が見られない場合があります。

于 2012-07-29T01:03:26.650 に答える