Einzelnen Beitrag anzeigen

Benutzerbild von GuenterS
GuenterS

Registriert seit: 3. Mai 2004
Ort: Österreich > Bad Vöslau
760 Beiträge
 
Turbo Delphi für Win32
 
#26

Re: [D2005 PE] FadeForm

  Alt 30. Apr 2006, 22:16
Zitat von turboPASCAL:
Oder so:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, Variants, Classes, Graphics, Controls, Forms, StdCtrls;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

  TFadeForm = class(TForm)
  private
    pFadeIn, pFadeOut : Boolean;
  protected
    procedure DoShow; override;
    procedure DoHide; override;
  published
    property FadeIn : Boolean read pFadeIn write pFadeIn;
    property FadeOut : Boolean read pFadeOut write pFadeOut;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TFadeForm.DoShow;
begin
  // AlphaBlend runtersetzen
  if pFadeIn then
    AlphaBlendValue := 0;

  // Show "ausführen" // <-
  inherited Show; // <-

  ShowWindow(Self.Handle, SW_SHOW); // ein Show erzwingen!

  // Einblenden
  if pFadeIn then
    while AlphaBlendValue < 255 do begin
      AlphaBlendValue := AlphaBlendValue + 5;
      Application.ProcessMessages; // Messages Verarbeiten !
      Sleep(10);
    end;
end;

procedure TFadeForm.DoHide;
begin
// Ausblenden
  if pFadeOut then begin
    AlphaBlendValue := 255;
    while AlphaBlendValue > 5 do begin
      AlphaBlendValue := AlphaBlendValue - 10;
      Application.ProcessMessages; // Messages Verarbeiten !
      Sleep(10);
    end;
  end;

  // Close "ausführen"
  inherited Close;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  lFadeForm: TFadeForm;
begin
  lFadeForm := TFadeForm.CreateNew(nil);

  lFadeForm.Left := (Screen.Width div 2) - ((lFadeForm.Width) div 2 );
  lFadeForm.Top := (Screen.Height div 2) - ((lFadeForm.Height) div 2);

  lFadeForm.AlphaBlend := true;
  lFadeForm.FadeIn := true;
  lFadeForm.FadeOut := true;
  lFadeForm.Show;
  sleep(2000);
  lFadeForm.Hide;
  lFadeForm.Free;
  sleep(500);
end;

end.
Toll, damit funktionierts bei mir. Das ProcessMessages kann man aber getrost weglassen, nicht wirklich notwendig.

Delphi-Quellcode:
unit UFadeForm;

interface

uses
  SysUtils, Forms;

type
  TFadeForm = class(TForm)
  private
    pFadeIn, pFadeOut: Boolean;

  protected
    procedure DoShow; override;
    procedure DoHide; override;
  public

  published
    property FadeIn: Boolean read pFadeIn write pFadeIn;
    property FadeOut: Boolean read pFadeOut write pFadeOut;
  end;

implementation

uses Controls, Windows;

procedure TFadeForm.DoShow;
begin
  // Einblenden
  ShowWindow(Self.Handle, SW_SHOW); // <--- Das war die Lösung
  if pFadeIn then
  begin
    inherited;
    AlphaBlendValue := 5;
    while AlphaBlendValue < 255 do
    begin
      AlphaBlendValue := AlphaBlendValue + 10;
      Sleep(10);
    end;
  end
  else
    inherited;
end;

procedure TFadeForm.DoHide;
begin
// Ausblenden
  if pFadeOut then
  begin
    AlphaBlendValue := 255;
    while AlphaBlendValue > 5 do
    begin
      AlphaBlendValue := AlphaBlendValue - 10;
      Sleep(10);
    end;
  end;
  inherited;
end;


end.
turboPascal hat dieses ShowWindow(Self.Handle, SW_SHOW); noch ausgeführt, damit klappt das vorzüglich. Wieso muss man das Einblenden anders behandeln, als das ausblenden? Ohne der gewissen Zeile, kommt das Formular nach einer Weile sofort (unabhängig davon ob man ProcessMessages verwendet oder nicht).
Günter
Pünktlichkeit ist die Fähigkeit vorherzusagen um wieviel sich der Andere verspäten wird.
  Mit Zitat antworten Zitat