Autor Beitrag
galagher
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2556
Erhaltene Danke: 45

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Do 18.11.10 11:48 
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: www.delphipraxis.net...lenden-einfaden.html.

ausblenden volle Höhe 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;
  {Ursprgl. Werte sichern}
  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;

  {Ursprgl. Werte wiederherstellen}
  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
  {Ursprgl. Werte sichern}
  bBlend := Alphablend;
  iValue := TransparentColorValue;

  TransparentColorValue := 0;
  Alphablend := True;
  Update;

  for i := 255 downto 0 do
  begin
   AlphablendValue := i;
   Sleep(Slowing);
   Refresh;
  end;

  {Ursprgl. Werte wiederherstellen}
  Alphablend := bBlend;
  TransparentColorValue := iValue;

  if doClose then Close;
 end;
end;

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 18.11.10 12:33 
user profile icongalagher hat folgendes geschrieben Zum zitierten Posting springen:
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 reichen.
Holg_i
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 79



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2556
Erhaltene Danke: 45

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Do 18.11.10 12:57 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconHolg_i hat folgendes geschrieben Zum zitierten Posting springen:
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!

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 18.11.10 13:33 
user profile icongalagher hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile icongalagher hat folgendes geschrieben Zum zitierten Posting springen:
Es flackert nicht jedesmal, aber meistens, und wenn, dann mit oder ohne Refresh, und es liegt eindeutig an Alphablend.
Ich schau zu Hause.
delphi10
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 447
Erhaltene Danke: 2

W2K, XP, Vista64, Win7 64
RAD-Studio 2010
BeitragVerfasst: So 21.11.10 14:17 
user profile icongalagher hat folgendes geschrieben Zum zitierten Posting springen:
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:
ausblenden 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;//nicht in der IDE
 AlphaBlendValue := 254;
 f := 254;
 repeat
   Dec(f,2);
   Form1.AlphaBlendValue := f;
 until f <= 0;
 Form1.AlphaBlendValue := 0;
end;

Die Form sollte auf Doublebufferd stehen.

_________________
Salus populi suprema lex esto
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2556
Erhaltene Danke: 45

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: 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!

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
delphi10
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 447
Erhaltene Danke: 2

W2K, XP, Vista64, Win7 64
RAD-Studio 2010
BeitragVerfasst: So 21.11.10 20:39 
user profile icongalagher hat folgendes geschrieben Zum zitierten Posting springen:
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.

_________________
Salus populi suprema lex esto
delphi10
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 447
Erhaltene Danke: 2

W2K, XP, Vista64, Win7 64
RAD-Studio 2010
BeitragVerfasst: 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.

_________________
Salus populi suprema lex esto
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2556
Erhaltene Danke: 45

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Mo 22.11.10 18:23 
user profile icondelphi10 hat folgendes geschrieben Zum zitierten Posting springen:
Weil es mir beim arbeiten/testen in der IDE auf den Keks geht..;)
Ist ein Argument!

user profile icondelphi10 hat folgendes geschrieben Zum zitierten Posting springen:
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!

user profile icondelphi10 hat folgendes geschrieben Zum zitierten Posting springen:
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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
  for i := 255 downto 0 do
  begin
   AlphablendValue := i;
   Sleep(Slowing);
//   Refresh;
  end;

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
delphi10
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 447
Erhaltene Danke: 2

W2K, XP, Vista64, Win7 64
RAD-Studio 2010
BeitragVerfasst: 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.

_________________
Salus populi suprema lex esto
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2556
Erhaltene Danke: 45

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Di 23.11.10 18:38 
user profile icondelphi10 hat folgendes geschrieben Zum zitierten Posting springen:
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.

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
delphi10
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 447
Erhaltene Danke: 2

W2K, XP, Vista64, Win7 64
RAD-Studio 2010
BeitragVerfasst: 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.

_________________
Salus populi suprema lex esto
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2556
Erhaltene Danke: 45

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Di 23.11.10 22:14 
user profile icondelphi10 hat folgendes geschrieben Zum zitierten Posting springen:
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.

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!