怎样动态创建控件

解决方案 »

  1.   

    创建一个颜色选取下拉框    
        
    unit ColorComboBox;interfaceusesWindows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,StdCtrls;typeTIdent = RecordColor:Integer;Name:String;end;TColorComboBox = class(TCustomComboBox)private{ Private declarations }ColorArray:array of TIdent;function GetSelectedColor: TColor;procedure SetSelectedColor(Value: TColor);protected{ Protected declarations }procedure CreateWnd; override;procedure DrawItem(Index: Integer; Rect: TRect; State: TOwnerDrawState); override;procedure Click;override;public{ Public declarations }constructor Create(AOwner: TComponent); override;destructor Destroy; override;published{ Published declarations }property SelectedColor: TColor read GetSelectedColor write SetSelectedColor;end;procedure Register;implementationprocedure Register;beginRegisterComponents('Samples', [TColorComboBox]);end;{ TColorComboBox }procedure TColorComboBox.Click;VarColorDlg:TColorDialog;beginif ItemIndex=High(ColorArray) thenBeginColorDlg:=TColorDialog.Create(Self);if ColorDlg.Execute thenColorArray[ItemIndex].Color:=ColorDlg.Color;ColorDlg.Free;End;inherited;end;constructor TColorComboBox.Create(AOwner: TComponent);begininherited;Style := csOwnerDrawFixed;Height:=25;itemHeight:=19;Font.Charset := GB2312_CHARSET;Font.Name := '宋体';Font.Height:=-15;SetLength(ColorArray,10);ColorArray[0].Color:=clRed;ColorArray[0].Name:='红色';ColorArray[1].Color:=clGreen;ColorArray[1].Name:='绿色';ColorArray[2].Color:=clBlue;ColorArray[2].Name:='蓝色';ColorArray[3].Color:=clYellow;ColorArray[3].Name:='黄色';ColorArray[4].Color:=clWhite;ColorArray[4].Name:='白色';ColorArray[5].Color:=clMaroon;ColorArray[5].Name:='褐色';ColorArray[6].Color:=clNavy;ColorArray[6].Name:='深蓝色';ColorArray[7].Color:=clSilver;ColorArray[7].Name:='银灰色';ColorArray[8].Color:=clAqua;ColorArray[8].Name:='浅蓝色';ColorArray[9].Color:=clWhite;ColorArray[9].Name:='定制';end;procedure TColorComboBox.CreateWnd;varIndex: integer;begininherited CreateWnd;Items.BeginUpdate;for Index := 0 to High(ColorArray) doItems.Add(ColorArray[Index].Name);Items.EndUpdate;ItemIndex := 0;end;destructor TColorComboBox.Destroy;begininherited;end;procedure TColorComboBox.DrawItem(Index: Integer; Rect: TRect;State: TOwnerDrawState);varSquare: TRect;beginTControlCanvas(Canvas).UpdateTextFlags;if odSelected in State thenbeginCanvas.Brush.Color := clHighlight;end;Canvas.FillRect(Rect);Canvas.Brush.Color := clBlack;Square := Rect;Square.Left := Square.Left + 1;Square.Right := Square.Left + ItemHeight -2;Square.Top := Square.Top + 1;Square.Bottom := Square.Bottom - 1;Canvas.FrameRect(Square);Canvas.Brush.Color := ColorArray[Index].Color;InflateRect(Square, -1, -1);Canvas.FillRect(Square);if odFocused in State thenbeginCanvas.Brush.Color := clHighlightText;Canvas.DrawFocusRect(Rect);end;Inc(Rect.Left, ItemHeight);InflateRect(Rect, 0, -1);if odSelected in State thenbeginCanvas.Pen.Color := clHighlightText;Canvas.Brush.Color := clHighlight;endelsebeginCanvas.Pen.Color := Font.Color;Canvas.Brush.Color := Color;end;DrawText(Canvas.Handle, PChar(Items[Index]), Length(Items[Index]), Rect, DT_VCENTER or DT_LEFT or DT_SINGLELINE);end;function TColorComboBox.GetSelectedColor: TColor;beginResult := ColorArray[ItemIndex].Color;end;procedure TColorComboBox.SetSelectedColor(Value: TColor);varIndex: Integer;beginfor Index := 0 to High(ColorArray) doif ColorArray[Index].Color = Value thenbeginItemIndex := Index;Exit;end;end;end.
     
       
      

  2.   

    这么长的代码,没有空看.
    动态创建控件,如果没有指定其 Parent 属性是无法显示的.
    比如:
     With TEdit1.Create(Self) Do Begin
       Parent:= Self;
       Top:= 0;
       Left:= 0
      .....
      End;
      

  3.   

    界面上放一Button,Panel
    procedure TForm1.Button1Click(Sender: TObject);
    var
      i:integer;
      btnArray : array of TButton;
    begin
      SetLength(btnArray,5);
      for i:=0 to 4 do
      begin
        btnArray[i]:=TButton.Create(self);
        if i=0 then
          btnArray[i].Top :=20
        else
          btnArray[i].Top :=btnArray[i-1].Top +30;    btnArray[i].Left    :=20;
        btnArray[i].Width   :=100;
        btnArray[i].Caption :='DynamicButton'+IntToStr(i);
        btnArray[i].Parent  :=Panel1;//必须指定Parent
      end;
    end;
      

  4.   

    var AButton:TButtonAButton:=TButton.Create(nil);
    with AButton do
    begin
     Parent:=AParent;
     Visible:=True;
     OnClick:=AButtonOnClick;
    end;
      

  5.   

    with TButton.Create(Self) do
    begin
    Parent := yourparent;
    Visible := True;
    OnClick := yourclick;
    end;