2

私はデルファイの学習者です。「MainForm」、「MinimizeTimer」、「RestoreTimer」を備えたDelphiプロジェクトが1つあります。次のコードを定義しました。

タイマーを最小化する:

  if MainForm.AlphaBlendValue >= 225 then
  begin
    MinimizeTimer.Enabled := true;
    MainForm.AlphaBlendValue := MainForm.AlphaBlendValue - 5;
  end;

タイマーの復元:

  if MainForm.AlphaBlendValue >= 0 then
  begin
    RestoreTimer.Enabled := true;
    MainForm.AlphaBlendValue := MainForm.AlphaBlendValue + 5;
  end;

私の要件は、メインフォームが最初に「MinimizeTimer」を使用してフェードアウトし、次にキャプションバーの「_」ボタンが押されたときに最小化されることです。また、「RestoreTimer」を使用してフェードインし、タスクバーをクリックすると復元されます。そこで、次のコードを再度定義しました。

  private
    { Private declarations }
    procedure WMSysCommand(var Msg: TWMSysCommand) ; message WM_SYSCOMMAND;
..
..
..
..
..
procedure TMainForm.WMSysCommand(var Msg: TWMSysCommand) ;
begin
  if Msg.CmdType = SC_MINIMIZE then MinimizeTimer.Enabled := true;
  DefaultHandler(Msg);
  if Msg.CmdType = SC_RESTORE then RestoreTimer.Enabled := true;
  DefaultHandler(Msg);
end;

しかし、期待した結果が得られていません。MainFormは最小化され、通常の方法で復元されます。私のプロジェクトでは、「FormCloseQuery」イベントも1つあることを覚えておいてください。

私を助けてください。

4

1 に答える 1

4

要件に対して間違ったロジックを使用しています。代わりにこれを試してください:

procedure TMainForm.MinimizeTimerTimer(Sender: TObject);
begin
  if AlphaBlendValue > 0 then
  begin
    AlphaBlendValue := AlphaBlendValue - 5;
  end
  else
  begin
    MinimizeTimer.Enabled := False;
    Perform(WM_SYSCOMMAND, SC_MINIMIZE, 0);
  end;
end;

procedure TMainForm.RestoreTimerTimer(Sender: TObject);
begin
  if AlphaBlendValue < 255 then
  begin
    AlphaBlendValue := AlphaBlendValue + 5;
  end else begin
    RestoreTimer.Enabled := False;
  end;
end;

procedure TMainForm.WMSysCommand(var Msg: TWMSysCommand);
begin
  case Msg.CmdType of
    SC_MINIMIZE: begin
      if AlphaBlendValue > 0 then
      begin
        MinimizeTimer.Enabled := True;
        Exit;
      end;
    end;
    SC_RESTORE: begin
      if AlphaBlendValue < 255 then begin
        RestoreTimer.Enabled := True;
      end;
    end;
  end;
  inherited;
end;
于 2012-07-26T20:49:55.167 に答える