Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Fertige Prozeduren zum TForm ein- und ausblenden
galagher - Do 18.11.10 11:48
Titel: Fertige Prozeduren zum TForm ein- und ausblenden
Hallo!
Ich habe zwei Prozeduren geschrieben, die TForms ein- und ausblenden. Kann vielleicht jemand brauchen!
Ach ja, wenn jemand weiss, wie man das hässliche schwarze "Flackern" in Prozedur FadeFormOut wegen AlphaBlend := True wegbekommt, bitte hier posten!
Ich finde das einfacher als mit einem Timer zu arbeiten oder als das hier:
http://www.delphipraxis.net/95355-formular-einblenden-einfaden.html.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60:
| procedure FadeFormIn(aForm: TForm; Slowing: Byte); var i: Integer; bBlend: Boolean; iValue: Byte; begin with aForm do begin Hide; bBlend := Alphablend; iValue := TransparentColorValue;
Alphablend := True; TransparentColorValue := 0;
for i := 0 to 255 do begin AlphablendValue := i; Sleep(Slowing); Refresh; if not Visible then Visible := True; end;
Alphablend := bBlend; TransparentColorValue := iValue; end; end;
procedure FadeFormOut(aForm: TForm; Slowing: Byte; doClose: Boolean); var i: Integer; bBlend: Boolean; iValue: Byte; begin with aForm do begin bBlend := Alphablend; iValue := TransparentColorValue;
TransparentColorValue := 0; Alphablend := True; Update;
for i := 255 downto 0 do begin AlphablendValue := i; Sleep(Slowing); Refresh; end;
Alphablend := bBlend; TransparentColorValue := iValue;
if doClose then Close; end; end; |
jaenicke - Do 18.11.10 12:33
galagher hat folgendes geschrieben : |
Ach ja, wenn jemand weiss, wie man das hässliche schwarze "Flackern" in Prozedur FadeFormOut wegen AlphaBlend := True wegbekommt, bitte hier posten! |
Vermutlich liegts am Refresh. Als ich das gemacht habe, hats jedenfalls nicht geflackert.
Ich habe das aber auch non-blocking gemacht, da ich derweil auch gleich vorbereitende Sachen gemacht habe... was ich sinnvoller finde als mit Sleep die Zeit zu vertun. Statt Sleep + Refresh sollte
Delay [
http://www.delphipraxis.net/6620-delay-revisited.html] reichen.
Holg_i - Do 18.11.10 12:35
Auch immer wieder klasse ist aufzuzeigen ab welcher Delphi Version und ab welcher Windows Version das ganze geht :-)
galagher - Do 18.11.10 12:57
jaenicke hat folgendes geschrieben : |
Vermutlich liegts am Refresh. Als ich das gemacht habe, hats jedenfalls nicht geflackert. |
Es flackert nicht jedesmal, aber meistens, und wenn, dann mit oder ohne Refresh, und es liegt eindeutig an Alphablend. Auch Repaint, Invalidate oder Update ändert nichts.
Holg_i hat folgendes geschrieben : |
Auch immer wieder klasse ist aufzuzeigen ab welcher Delphi Version und ab welcher Windows Version das ganze geht :-) |
Ab Windows 2000 oder höher! Mindestens D6 unterstützt Alphablend, ob es mit Versionen < 6 auch geht, weiss ich nicht!
jaenicke - Do 18.11.10 13:33
galagher hat folgendes geschrieben : |
Mindestens D6 unterstützt Alphablend, ob es mit Versionen < 6 auch geht, weiss ich nicht! |
Nein, D5 hatte die Eigenschaft noch nicht. Über SetLayeredWindowAttributes oder so ginge es natürlich.
galagher hat folgendes geschrieben : |
Es flackert nicht jedesmal, aber meistens, und wenn, dann mit oder ohne Refresh, und es liegt eindeutig an Alphablend. |
Ich schau zu Hause.
delphi10 - So 21.11.10 14:17
galagher hat folgendes geschrieben : |
Hallo!
Ich habe zwei Prozeduren geschrieben, die TForms ein- und ausblenden. Kann vielleicht jemand brauchen!
Ach ja, wenn jemand weiss, wie man das hässliche schwarze "Flackern" in Prozedur FadeFormOut wegen AlphaBlend := True wegbekommt, bitte hier posten!
|
Bitte, ohne Flackern:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| Procedure TForm1.BlendOff; var f: integer; begin If DebugHook <> 0 then Exit; AlphaBlendValue := 254; f := 254; repeat Dec(f,2); Form1.AlphaBlendValue := f; until f <= 0; Form1.AlphaBlendValue := 0; end; |
Die Form sollte auf Doublebufferd stehen.
jaenicke - So 21.11.10 14:36
Da ist noch zweimal ein Form1 zu viel, so dass du damit ggf. die falsche Instanz des Formulars erwischst. ;-)
galagher - So 21.11.10 15:24
Vor der repeat-Schleife muss AlphaBlend := True stehen, wenn das nicht bereits im OI eingestellt ist, doch dann wird Form1 wieder kurz schwarz, bevor es ausgeblendet wird.
Und warum nicht in der IE? Geht doch unter Delphi genauso!
delphi10 - So 21.11.10 20:39
galagher hat folgendes geschrieben : |
Vor der repeat-Schleife muss AlphaBlend := True stehen, wenn das nicht bereits im OI eingestellt ist, doch dann wird Form1 wieder kurz schwarz, bevor es ausgeblendet wird.
Und warum nicht in der IE? Geht doch unter Delphi genauso! |
Weil es mir beim arbeiten/testen in der IDE auf den Keks geht..;) Aber bei mir wird die Form weder in der IDE noch als EXE gestartet kurzzeitig schwarz. Und warum sollte man Einstellungen aus dem OI im Programm wiederholen- entweder oder und ich habe eben alle (möglichen) Grundeinstellungen im OI.
@jaenicke: Ja, stimmt. Hatte es nur wie ich meinte der Vollständigkeit halber eingetragen.
delphi10 - So 21.11.10 20:54
Also ich bekomme ein kurzzeitiges Flackern hin, wenn ich vor einem Programmende eine Abfrage setze in der Form:
if messagebox(application.Handle,'Wirklich beenden?', 'Bestätigung', MB_IconWARNING + MB_yesno) = mryes then.Lasse ich die raus gehts ganz sanft ohen Flackern, probier mal.
galagher - Mo 22.11.10 18:23
delphi10 hat folgendes geschrieben : |
Weil es mir beim arbeiten/testen in der IDE auf den Keks geht..;) |
Ist ein Argument!
delphi10 hat folgendes geschrieben : |
Und warum sollte man Einstellungen aus dem OI im Programm wiederholen- entweder oder und ich habe eben alle (möglichen) Grundeinstellungen im OI. |
Ist ebenfalls ein Argument!
delphi10 hat folgendes geschrieben : |
Also ich bekomme ein kurzzeitiges Flackern hin, wenn ich vor einem Programmende eine Abfrage setze in der Form:
if messagebox(application.Handle,'Wirklich beenden?', 'Bestätigung', MB_IconWARNING + MB_yesno) = mryes then.Lasse ich die raus gehts ganz sanft ohen Flackern, probier mal. |
Wird immer ganz kurz schwarz, praktisch 1x flackern, vor dem Ausblenden, mit und ohne MessageBox! Wenn ich das erste Refresh rausnehme, wird das Programmfenster sogar deutlich sichtbar schwarz, bevor es ausgeblendet wird:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| for i := 255 downto 0 do begin AlphablendValue := i; Sleep(Slowing); end; |
delphi10 - Mo 22.11.10 23:57
Ich habe in diesem System eine NVidia 7600GS, wenn ich jetzt mit den Einstellungen "Vertikal Synchronisierung(EIN); Antialiasing(8xS); Transparenz-Aliasing(Multisampling)" jongliere, kriege ich ein Flackern, bzw schwarzschalten einer Form hin. Die Werte in () bewirken ein sanftes IN- Out-Fading ohne Störungen, zumindest bei meiner Karte. Vielleicht guckst Du mal in Deinen Grafikkartentreiber. Nur so ne Idee, klappt ja vielleicht.
galagher - Di 23.11.10 18:38
delphi10 hat folgendes geschrieben : |
Vielleicht guckst Du mal in Deinen Grafikkartentreiber. Nur so ne Idee, klappt ja vielleicht. |
Das ändert nichts, es wird immer zuerst schwarz. Aber natürlich nur dann, wenn im OI zunächst Alphablend := False eingestellt ist. Wenn True, flackert auch nichts.
delphi10 - Di 23.11.10 20:13
Wenn im OI Alphablend = false und in der Procedure auf true gesetzt ist, kann ich das schwarzschalten nachvollziehen. Meine Lösung dafür getestet: Die Zeit zwischen true und der Schleife zum Ausblenden ist zu kurz. Aber da hilft natürlich kein delay oder sowas. Alphablend = true gleich ganz zu Anfang des Programmes einsetzen, hat bei mir die Lösung gebracht. Also zwischen true-setzen und Blendoff max. Zeit hinkriegen.
galagher - Di 23.11.10 22:14
delphi10 hat folgendes geschrieben : |
Alphablend = true gleich ganz zu Anfang des Programmes einsetzen, hat bei mir die Lösung gebracht. |
Das weiss ich, dass das so funktioniert, ich wollte Alphablend := True halt in der Prozedur drin haben, weil es ohne ja nicht ausblendet und man so unabhängig von den Einstellungen im OI ist und das auch nicht extra im Create angeben muss.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!