1

I have created dynamic Form as the next :

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;

and when am trying to change the AlphaBlend property, the transparency wouldn't change..

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

Also overriding the constructor it gave the same result ..

Thanks.

Issam
  • 65
  • 5

1 Answers1

3

Your approach

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

cannot possibly work because you set the OnCreate handler on line 5, which is after the form has been created on line 1; consequently, at the time the form is created (line 1), it sees that OnCreate is nil and so does nothing. Your instruction on line 5 has no effect.

This is like telling your fiend "Please buy some milk on your way home from work" after your friend has already come home from work.

Solutions

1: Set the properties at design time

Of course, you can use the Object Inspector to set the AlphaBlend and AlphaBlendValue properties of TForm2 at design time. But I suspect you want to do it dynamically, because you ask this question.

2: Use the OnCreate handler on TForm2

Just open TForm2 in the form editor and double click it to give it its own OnCreate handler:

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

3: Override TForm2's constructor

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

4: Set the properties when you create the object

// 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;

Unlike the previous three approaches, this one affects only this instance of TForm2 -- it doesn't affect the class itself.

All these approaches work.

There is a "but"

Your line

Frm.Parent := Self

means that you make this form into a control instead of a top-level window.

And layered windows (the Win32 feature on which the VCL's AlphaBlend feature is based) are only supported as child windows in Windows 8 and later.

Therefore, if you are using Windows 7 or earlier, you cannot use AlphaBlend in this case.

Andreas Rejbrand
  • 105,602
  • 8
  • 282
  • 384