Delphi 7 AlphaBlend 不适用于动态表单
Delphi 7 AlphaBlend not working for dynamic form
我已经创建了下一个动态表单 :
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 行),它看到 OnCreate
是 nil
,因此什么都不做。您在第 5 行的指令无效。
这就像告诉你的朋友“请在你下班回家的路上买些牛奶”在你的朋友已经下班回家后。
解决方案
1:在设计时设置属性
当然,您可以在设计时使用Object Inspector设置TForm2
的AlphaBlend
和AlphaBlendValue
属性。但我怀疑你想动态地做,因为你问了这个问题。
2:在 TForm2
上使用 OnCreate
处理程序
只需在表单编辑器中打开 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
的这个实例 -- 它不会影响 class 本身。
所有这些方法都有效。
有个“但是”
你的线路
Frm.Parent := Self
意味着你把这个表单做成一个控件而不是顶层window。
和 layered windows(VCL AlphaBlend
功能所基于的 Win32 功能)仅在 Windows 8 及更高版本中作为子 windows 受支持。
因此,如果您使用的是 Windows 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 行),它看到 OnCreate
是 nil
,因此什么都不做。您在第 5 行的指令无效。
这就像告诉你的朋友“请在你下班回家的路上买些牛奶”在你的朋友已经下班回家后。
解决方案
1:在设计时设置属性
当然,您可以在设计时使用Object Inspector设置TForm2
的AlphaBlend
和AlphaBlendValue
属性。但我怀疑你想动态地做,因为你问了这个问题。
2:在 TForm2
上使用 OnCreate
处理程序
只需在表单编辑器中打开 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
的这个实例 -- 它不会影响 class 本身。
所有这些方法都有效。
有个“但是”
你的线路
Frm.Parent := Self
意味着你把这个表单做成一个控件而不是顶层window。
和 layered windows(VCL AlphaBlend
功能所基于的 Win32 功能)仅在 Windows 8 及更高版本中作为子 windows 受支持。
因此,如果您使用的是 Windows 7 或更早版本,则无法在这种情况下使用 AlphaBlend
。