![]() |
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 ![]() gleich Sleep(10) und ProcessMessages. |
Re: [D2005 PE] FadeForm
Zitat:
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...) |
Re: [D2005 PE] FadeForm
Also weder ein noch ausblenden funzt :( Schade :(
|
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. |
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. |
Re: [D2005 PE] FadeForm
Zitat:
Delphi-Quellcode:
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).
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. |
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... |
Re: [D2005 PE] FadeForm
Zitat:
Zitat:
|
Re: [D2005 PE] FadeForm
Zitat:
Zitat:
![]() |
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. |
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