А вы можете исчезать и появляться не так внезапно? А то у меня голова идет кругом. - Хорошо, - сказал Кот и исчез — на этот раз очень медленно. Первым исчез кончик его хвоста, а последней - улыбка; она долго парила в воздухе, когда все остальное уже пропало.
Льюис Кэрролл. Приключения Алисы в стране чудес
В «старших» версиях Delphiу формы появилось одно замечательное свойство - AlphaBlendValue, -, которое вполне может послужить основой для анимации формы.
Значение этого свойства, равное 0, делает окно абсолютно прозрачным, а максимальное значение 255 - абсолютно непрозрачным. Все промежуточные значения этого свойства придают окну частичную прозрачность, то есть сквозь него будут «просвечивать» окна, находящиеся ниже
Полупрозрачные окна хороши уже сами по себе и их вполне можно использовать в программах для вывода окон справки, настройки, помощи и тому подобных, но мы пойдём ещё дальше и при появлении формы на экране будем постепенно уменьшать её (не)прозрачность от 0 до 255.
Форма появляется на экране совершенно прозрачной:
procedure TForm2.FormShow(Sender: TObject); begin
AlphaBlend:= TRUE;
AlphaBlendValue:= 0; end;
Обратите внимание, что мы должны установить флажок AlphaBlend, иначе свойство AlphaBlendValue не будет действовать!
Затем в цикле мы плавно уменьшаем прозрачность нового окна (если вы хотите оставить окно слегка непрозрачным, чтобы добавить шарма, то вычтите в выделенной строке некоторое число из значения AlphaBlendValue):
procedure TForm2.FormActivate(Sender: TObject);
var i,n: integer;
begin
n:= 100;
for I := 0 to n do begin
AlphaBlendValue:= 255 * i div n;//-100
delay(10);
end;
end;
В процедуре delayцикл делает небольшую паузу, чтобы эффект анимации стал доступен человеческому глазу:
//ЗАДЕРЖКА
procedure Delay(MSecs: Longint); var
FirstTickCount, Now: Longint; begin
FirstTickCount := GetTickCount; repeat
Application.ProcessMessages;
Now := GetTickCount; until (Now - FirstTickCount >= MSecs) or (Now < FirstTickCount); end;
С точностью до наоборот при закрытии программы мы стираем окно с экрана:
procedure TForm2.FormClose(Sender:
TObject; var Action: TCloseAction);
var i,n: integer;
begin
n:= 100;
for I := n downto 0 do begin
AlphaBlendValue:= 255 * i div n;
delay(10);
end;
end;
Правда, в отличие от Чеширского Кота от него не останется даже улыбки. Впрочем, может быть, она останется у вас - как результат хорошо сделанной работы.