Search code examples
delphidynamictransparencyalphablending

Delphi 7 AlphaBlend not working for dynamic form


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.


Solution

  • 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.