CRefForm.pas
上传用户:fh681027
上传日期:2022-07-23
资源大小:1959k
文件大小:2k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. unit CRefForm;
  2. interface
  3. uses
  4.   SysUtils, Windows, Messages, Classes, Graphics, Controls,
  5.   Forms, Dialogs, StdCtrls, ExtCtrls;
  6. type
  7.   // class reference type (redeclaration)
  8.   TControlClass = class of TControl;
  9.   TForm1 = class(TForm)
  10.     Panel1: TPanel;
  11.     RbtnRadio: TRadioButton;
  12.     RbtnButton: TRadioButton;
  13.     RbtnEdit: TRadioButton;
  14.     procedure RbtnRadioClick(Sender: TObject);
  15.     procedure RbtnButtonClick(Sender: TObject);
  16.     procedure RbtnEditClick(Sender: TObject);
  17.     procedure FormCreate(Sender: TObject);
  18.     procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
  19.       Shift: TShiftState; X, Y: Integer);
  20.   private
  21.     ClassRef: TControlClass;
  22.     Counter: Integer;
  23.   public
  24.     { Public declarations }
  25.   end;
  26. var
  27.   Form1: TForm1;
  28. implementation
  29. {$R *.DFM}
  30. procedure TForm1.RbtnRadioClick(Sender: TObject);
  31. begin
  32.   ClassRef := TRadioButton;
  33. end;
  34. procedure TForm1.RbtnButtonClick(Sender: TObject);
  35. begin
  36.   ClassRef := TButton;
  37. end;
  38. procedure TForm1.RbtnEditClick(Sender: TObject);
  39. begin
  40.   ClassRef := TEdit;
  41. end;
  42. procedure TForm1.FormCreate(Sender: TObject);
  43. begin
  44.   ClassRef := TRadioButton;
  45. end;
  46. procedure TForm1.FormMouseDown(
  47.   Sender: TObject; Button: TMouseButton;
  48.   Shift: TShiftState; X, Y: Integer);
  49. var
  50.   NewCtrl: TControl;
  51.   MyName: String;
  52. begin
  53.   // create the control
  54.   NewCtrl := ClassRef.Create (Self);
  55.   // hide it temporarily, to avoid flickering
  56.   NewCtrl.Visible := False;
  57.   // set parent and position
  58.   NewCtrl.Parent := Self;
  59.   NewCtrl.Left := X;
  60.   NewCtrl.Top := Y;
  61.   // compute the unique name (and caption)
  62.   Inc (Counter);
  63.   MyName := ClassRef.ClassName + IntToStr (Counter);
  64.   Delete (MyName, 1, 1);
  65.   NewCtrl.Name := MyName;
  66.   // now show it
  67.   NewCtrl.Visible := True;
  68. end;
  69. end.