Delphi 7 AlphaBlend не работает для динамической формы

Я создал динамическую форму следующим образом:

procedure TForm1.Button1Click(Sender: TObject);
var
 Frm:TForm2;
begin

frm:=TForm2.Create(nil);
Frm.Left:=5;
Frm.Top:=5;
Frm.Parent:=Self;
Frm.OnCreate:=OncreateFrm;
Frm.Show;
end;

и когда я пытаюсь изменить свойство AlphaBlend, прозрачность не изменится.

procedure TForm1.OncreateFrm(Sender: TObject);
begin
AlphaBlend:=True;
AlphaBlendValue:=200;
end; 

Также переопределение конструктора дало тот же результат..

Спасибо.


person Issam    schedule 14.02.2021    source источник


Ответы (1)


Ваш подход

Frm := TForm2.Create(nil);
Frm.Left := 5;
Frm.Top := 5;
Frm.Parent := Self;
Frm.OnCreate := OncreateFrm;
Frm.Show;

не может работать, потому что вы установили обработчик OnCreate в строке 5, что происходит после создания формы в строке 1; следовательно, во время создания формы (строка 1) он видит, что OnCreate есть nil, и ничего не делает. Ваша инструкция в строке 5 не действует.

Это все равно, что сказать своему другу: «Пожалуйста, купи молока по пути домой с работы после того, как твой друг уже вернулся с работы.

Решения

1: Установите свойства во время разработки

Конечно, вы можете использовать Инспектор объектов, чтобы установить свойства AlphaBlend и AlphaBlendValue объекта TForm2 во время разработки. Но я подозреваю, что вы хотите сделать это динамически, потому что вы задаете этот вопрос.

2: Используйте обработчик OnCreate на TForm2

Просто откройте TForm2 в редакторе форм и дважды щелкните по нему, чтобы дать ему собственный обработчик OnCreate:

// in Unit2.pas
procedure TForm2.FormCreate(Sender: TObject);
begin
  AlphaBlend := True;
  AlphaBlendValue := 128;
end;

3: переопределить конструктор TForm2

// in Unit2.pas
constructor TForm2.Create(AOwner: TComponent);
begin
  inherited;
  AlphaBlend := True;
  AlphaBlendValue := 128;
end;

4: Установите свойства при создании объекта

// in Unit1.pas
procedure TForm1.Button1Click(Sender: TObject);
var
  Frm: TForm2;
begin
  Frm := TForm2.Create(nil);
  Frm.Left := 5;
  Frm.Top := 5;
  Frm.AlphaBlend := True;
  Frm.AlphaBlendValue := 128;
  Frm.Show;
end;

В отличие от предыдущих трех подходов, этот влияет только на этот экземпляр TForm2 — он не влияет на сам класс.

Все эти подходы работают.

Есть но

Ваша линия

Frm.Parent := Self

означает, что вы превращаете эту форму в элемент управления, а не в окно верхнего уровня.

И многоуровневые окна (функция Win32, на которой основана функция AlphaBlend VCL) поддерживаются только как дочерние окна в Windows 8 и более поздних версиях.

Поэтому, если вы используете Windows 7 или более раннюю версию, вы не можете использовать AlphaBlend в этом случае.

person Andreas Rejbrand    schedule 14.02.2021
comment
Я думаю, что это причина того, что он не работает, так как я пробовал все вышеупомянутые решения. Большое спасибо. - person Issam; 14.02.2021
comment
@Issam: Какую версию Windows вы используете? - person Andreas Rejbrand; 14.02.2021
comment
Я использую Windows 7. - person Issam; 15.02.2021
comment
@Issam: Да, тогда, боюсь, невозможно иметь многоуровневое дочернее окно. В Windows 7 можно создавать слои только для окон верхнего уровня. - person Andreas Rejbrand; 15.02.2021