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; 

也覆盖构造函数,它给出了相同的结果..

谢谢。

解决方法

你的方法

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

不可能工作,因为您在第 5 行设置了 OnCreate 处理程序,这是在第 1 行创建表单之后;因此,在创建表单时(第 1 行),它看到 OnCreatenil,因此什么也不做。您在第 5 行的说明无效。

这就像告诉你的朋友“请在你下班回家的路上买些牛奶”你的朋友已经下班回家了。

解决方案

1:在设计时设置属性

当然,您可以在设计时使用对象检查器来设置 AlphaBlendAlphaBlendValueTForm2 属性。但我怀疑你想动态地做,因为你问这个问题。

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

意味着你把这个表单变成一个控件而不是一个顶级窗口。

layered windows(VCL 的 AlphaBlend 功能所基于的 Win32 功能)仅支持作为 Windows 8 及更高版本中的子窗口。

因此,如果您使用的是 Windows 7 或更早版本,则在这种情况下不能使用 AlphaBlend

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...