Marco Cantù 1998, Mastering Delphi 4

Project: CLASSREF.DPR


Project Structure


CLASSREF.DPR

program ClassRef;

uses
  Forms,
  CRefF in 'CRefF.pas' {Form1};

{$R *.RES}

begin
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

CREFF.PAS

unit CRefF;

interface

uses
  SysUtils, Windows, Messages, Classes, Graphics, Controls,
  Forms, Dialogs, StdCtrls, ExtCtrls;

type
  // class reference type (redeclaration)
  TControlClass = class of TControl;

  TForm1 = class(TForm)
    Panel1: TPanel;
    RbtnRadio: TRadioButton;
    RbtnButton: TRadioButton;
    RbtnEdit: TRadioButton;
    procedure RbtnRadioClick(Sender: TObject);
    procedure RbtnButtonClick(Sender: TObject);
    procedure RbtnEditClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    ClassRef: TControlClass;
    Counter: Integer;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.RbtnRadioClick(Sender: TObject);
begin
  ClassRef := TRadioButton;
end;

procedure TForm1.RbtnButtonClick(Sender: TObject);
begin
  ClassRef := TButton;
end;

procedure TForm1.RbtnEditClick(Sender: TObject);
begin
  ClassRef := TEdit;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  ClassRef := TRadioButton;
end;

procedure TForm1.FormMouseDown(
  Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  NewCtrl: TControl;
  MyName: String;
begin
  // create the control
  NewCtrl := ClassRef.Create (self);
  // hide it temporarily, to avoid flickering
  NewCtrl.Visible := False;
  // set parent and position
  NewCtrl.Parent := self;
  NewCtrl.Left := X;
  NewCtrl.Top := Y;
  // compute the unique name (and caption)
  Inc (Counter);
  MyName := ClassRef.ClassName + IntToStr (Counter);
  Delete (MyName, 1, 1);
  NewCtrl.Name := MyName;
  // now show it
  NewCtrl.Visible := True;
end;


end.

CREFF.DFM

object Form1: TForm1
  Left = 183
  Top = 148
  Width = 474
  Height = 344
  Caption = 'Component Builder'
  Font.Charset = ANSI_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OnCreate = FormCreate
  OnMouseDown = FormMouseDown
  PixelsPerInch = 96
  TextHeight = 13
  object Panel1: TPanel
    Left = 0
    Top = 0
    Width = 466
    Height = 33
    Align = alTop
    TabOrder = 0
    object RbtnRadio: TRadioButton
      Left = 24
      Top = 8
      Width = 89
      Height = 17
      Caption = 'Radio Button'
      Checked = True
      TabOrder = 0
      TabStop = True
      OnClick = RbtnRadioClick
    end
    object RbtnButton: TRadioButton
      Left = 144
      Top = 8
      Width = 61
      Height = 17
      Caption = 'Button'
      TabOrder = 1
      OnClick = RbtnButtonClick
    end
    object RbtnEdit: TRadioButton
      Left = 240
      Top = 8
      Width = 49
      Height = 17
      Caption = 'Edit'
      TabOrder = 2
      OnClick = RbtnEditClick
    end
  end
end


Copyright Marco Cantù 1998