Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   [D2005 PE] FadeForm (https://www.delphipraxis.net/68475-%5Bd2005-pe%5D-fadeform.html)

turboPASCAL 30. Apr 2006 19:06

Re: [D2005 PE] FadeForm
 
Wenn das Programm mit Sleep() schlafen geschickt wird und dann auch kein
Application.ProcessMessages aufgerufen wird, was soll dann passieren ?

Delphi-Quellcode:
if pFadeIn then
    while AlphaBlendValue < 255 do begin
      AlphaBlendValue := AlphaBlendValue + 10;
      Application.ProcessMessages; // <--<<<
      Sleep(10);
    end;

Oder einfach mal hier in der DP nach Hier im Forum suchenDelay suchen, das ersetzt dan
gleich Sleep(10) und ProcessMessages.

GuenterS 30. Apr 2006 19:13

Re: [D2005 PE] FadeForm
 
Zitat:

Zitat von turboPASCAL
Wenn das Programm mit Sleep() schlafen geschickt wird und dann auch kein
Application.ProcessMessages aufgerufen wird, was soll dann passieren ?

Delphi-Quellcode:
if pFadeIn then
    while AlphaBlendValue < 255 do begin
      AlphaBlendValue := AlphaBlendValue + 10;
      Application.ProcessMessages; // <--<<<
      Sleep(10);
    end;

Oder einfach mal hier in der DP nach Hier im Forum suchenDelay suchen, das ersetzt dan
gleich Sleep(10) und ProcessMessages.

Leider verwendet diese zwei Delay Varianten, erst wieder ProcessMessages. Das wäre damit also nicht ersetzt.


Und was machen wir jetzt mit dieser Weisheit?

Es geht nämlich auch ohne genauso und eigentlich ist das Ausblenden an sich schon gelöst, siehe meinen Beitrag über Deinem.

Was noch nicht klappt, ist das Einblenden (mit Application.ProcessMessages einfügen ist es nicht getan...)

xZise 30. Apr 2006 19:40

Re: [D2005 PE] FadeForm
 
Also weder ein noch ausblenden funzt :( Schade :(

GuenterS 30. Apr 2006 20:03

Re: [D2005 PE] FadeForm
 
Liste der Anhänge anzeigen (Anzahl: 1)
komisch bei mir geht das ausblenden.

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;

procedure TFadeForm.DoShow;
begin
  // Einblenden
  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.
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, UFadeForm, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    FFadeForm: TFadeForm;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  FFadeForm.Show;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FFadeForm := TFadeForm.CreateNew(nil);
  FFadeForm.Visible := false;
  FFadeForm.AlphaBlend := true;
  FFadeForm.FadeIn := true;
  FFadeForm.FadeOut := true;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
   FFadeForm.Hide;
end;

end.

turboPASCAL 30. Apr 2006 20:21

Re: [D2005 PE] FadeForm
 
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.

GuenterS 30. Apr 2006 21:16

Re: [D2005 PE] FadeForm
 
Zitat:

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).

turboPASCAL 1. Mai 2006 07:47

Re: [D2005 PE] FadeForm
 
Wenn die Function in eine OnButtonClick verfrachtet wird sollte es auch ohne SchowWindow klappen.
Der Grund liegt darin das die Form (und auch die Unterformen was ja die TFadeForm ist) einfachnoch kein Handle haben.

Was das ProcessMessages Betrift, wenn du die Form nicht nackt darstellen willst sonder noch einen Button oder eine Graphik event. auch eine Animation darauf haben möchtest müssen die Messages verarbeitet werden.

Und immer daran denken das Sleep das gesamte Programm lamlegt, abgesehen Threads in denen das Sleep den nur Thread beeinflusst...

GuenterS 1. Mai 2006 09:14

Re: [D2005 PE] FadeForm
 
Zitat:

Zitat von turboPASCAL
Wenn die Function in eine OnButtonClick verfrachtet wird sollte es auch ohne SchowWindow klappen.
Der Grund liegt darin das die Form (und auch die Unterformen was ja die TFadeForm ist) einfachnoch kein Handle haben.

Hm komisch. Ich habe die FadeForm im OnCreate der Hauptform erzeugt und per ClickEvent eines Buttons dann angezeigt. Da müßte dann eigentlich längst ein Handle da gewesen sein. ShowWindow geb ich doch das Handle mit, wie soll das gehen, wenn Sie ja wie Du sagst da noch keines haben?

Zitat:

Zitat von turboPASCAL
Und immer daran denken das Sleep das gesamte Programm lamlegt, abgesehen Threads in denen das Sleep den nur Thread beeinflusst

Jup, wenn man Nebenläufigkeiten haben möchte, finde ich es besser Threads zu verwenden.

xZise 1. Mai 2006 09:25

Re: [D2005 PE] FadeForm
 
Zitat:

Zitat von turboPASCAL
Wenn die Function in eine OnButtonClick verfrachtet wird sollte es auch ohne SchowWindow klappen.
Der Grund liegt darin das die Form (und auch die Unterformen was ja die TFadeForm ist) einfachnoch kein Handle haben.

Was das ProcessMessages Betrift, wenn du die Form nicht nackt darstellen willst sonder noch einen Button oder eine Graphik event. auch eine Animation darauf haben möchtest müssen die Messages verarbeitet werden.

Und immer daran denken das Sleep das gesamte Programm lamlegt, abgesehen Threads in denen das Sleep den nur Thread beeinflusst...

Zitat:

Zitat von GuenterS
Zitat:

Zitat von turboPASCAL
Wenn die Function in eine OnButtonClick verfrachtet wird sollte es auch ohne SchowWindow klappen.
Der Grund liegt darin das die Form (und auch die Unterformen was ja die TFadeForm ist) einfachnoch kein Handle haben.

Hm komisch. Ich habe die FadeForm im OnCreate der Hauptform erzeugt und per ClickEvent eines Buttons dann angezeigt. Da müßte dann eigentlich längst ein Handle da gewesen sein. ShowWindow geb ich doch das Handle mit, wie soll das gehen, wenn Sie ja wie Du sagst da noch keines haben?

Zitat:

Zitat von turboPASCAL
Und immer daran denken das Sleep das gesamte Programm lamlegt, abgesehen Threads in denen das Sleep den nur Thread beeinflusst

Jup, wenn man Nebenläufigkeiten haben möchte, finde ich es besser Threads zu verwenden.

Also ich verstehe nur Bahnhof...

GuenterS 1. Mai 2006 09:50

Re: [D2005 PE] FadeForm
 
Hm.

Habe das ganze jetzt mit dem ProcessMessages, aber noch eine Zustandsvariable eingefügt, so dass nichts anderes mit diesem Formular passieren kann.

Solange ich es "händisch" mit TFadeForm erstelle funktioniert es wie es soll (so wollte es zumindest xZise).

Natürlich wäre es viel schöner, wenn man auch dieses Form in der Delphi IDE designen könnte, also Buttons, etc. hinzufügen.

Deshalb bin ich hergegangen und hab gesagt Neu->Formular. Habe dort ebenfalls die Methoden überschrieben und siehe da, ich kann sie jetzt bei Neu anwählen. Dann habe ich eine neue Form welche von TFadeForm abgeleitet ist, aber leider fehlt diesem wieder die Funktionalität vom Ein- bzw. Ausblenden.

Gibts da einen bestimmten Trick?

Oder wäre es gescheiter das Ein- Ausblenden über eine Procedur zu machen, der man das entsprechende Formular übergibt? (DoShow und DoHide sind ja nichts anderes als die Routinen welche aufgerufen werden, wenn das OnShow bzw. OnHide ereignis eintritt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:33 Uhr.
Seite 3 von 3     123   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz