Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > AlpphaBlend - не работает прозрачность...


Автор: SneG0K 11.1.2008, 16:50
Код

var
i:integer;
h:THandle;
begin
form1.AlphaBlend:=true;
h:=CreateEvent(nil, true, false, 'et');
for i:=1 to 255 do
begin
Form1.AlphaBlendValue:=i;
WaitForSingleObject(h,50);
application.ProcessMessages;
Form1.Repaint;
end;
if i=255 then
Form1.AlphaBlend:=false;
Closehandle(h);

Вот я попробовал украсить свою программу и добавил этот код в формгреат... Поидее форма должна стать из прозрачной непрозрачной, постепенно... но это не происходит=( при запуске форма просто задерживаеться на секунд 15-20 и потом появляеться... что я не так делаю?

Автор: Alexeis 11.1.2008, 17:06
Советую сначала репаинт, потом процесмессажес и только потом паузу делать.

Автор: THandle 11.1.2008, 17:09
Не знаю. Наверно просто ужасный вариант, но другого не придумал. Вот сожержимое .dpr файла проекта:

Код

program Project1;

uses
  Forms, Windows,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

procedure ShowAB;
var
i:integer;
h:THandle;
begin
  form1.Show;
  form1.AlphaBlend:=true;
  h:=CreateEvent(nil, true, false, 'et');
  for i:=1 to 255 do
    begin
      Form1.AlphaBlendValue:=i;
      WaitForSingleObject(h,50);
      application.ProcessMessages;
    end;
  if i=255 then
  Form1.AlphaBlend:=false;
  Closehandle(h);
end;

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  ShowAB;
  Application.Run;
end.


ЗЫ: form1.AlphaBlend:=true; лучше поставь в design-time, чтобы форма не мелькала.

Автор: VICTAR 11.1.2008, 17:19
Может лучше
Код

procedure TForm1.FormCreate(Sender: TObject);
begin
  AnimateWindow(Handle, 1000, AW_BLEND);
end;

Автор: Vitazi 27.3.2008, 10:23
Код

procedure TForm1.ApplicationEvents1Idle(Sender: TObject;
  var Done: Boolean);
begin
if go then begin
for alpa:=1 to 255 do
   begin
       Form1.AlphaBlendValue:=alpa;
      Application.ProcessMessages;
      Sleep(10);
    end;
    go:=false; // чтоб выполнилось только один раз
 end;
end;

сколько вариантов пробывал это самый нормальный.
естесно в настройках формы 
form1.AlphaBlend:=true;
Form1.AlphaBlendValue:=0;

Автор: Vitazi 28.1.2009, 23:27
Добавлю для новичков.. нужно на форму поместить компонент ApplicationEvents
у него как раз в Object Inspector на вкладке Events  есть свойство OnIdle  в это событие и вставлен предыдущий код!

Автор: Poseidon 29.1.2009, 09:45
Цитата(Vitazi @  27.3.2008,  10:23 Найти цитируемый пост)
сколько вариантов пробывал это самый нормальный.
Самый "нормальный" вариант, а точнее самый правильный, это тот, который предложил VICTAR. И нечего изобретать велосипед.

Автор: Vitazi 29.1.2009, 10:33
Как то не обратил внимания smile 
Действительно отличный вариант! smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)