比如Form 上有一个实例MyCombo1,希望它的实例在运行时:如果 tag=1,那么它的items就为:
 最近一个月
 最近三个月
 最近六个月
 最近一年如果 tag=2,那么它的items就为:
 最近10天
 最近20天
 最近30天
 最近70天
要求这个效果不要在Form中写代码,而是在封装的MyCombo.pas中写代码实现。
我试过TMyCombo.show,它是是静态的,不能overload。其它事件好象就找不出来了一样。盼高人指点,谢谢!

解决方案 »

  1.   

    procedure CreateWnd;override;
    procedure TfontComboBox.CreateWnd;
    begin
      inherited CreateWnd();
      if Tag =1  then begin
        Items.Add('最近一个月');
        Items.Add('最近三个月');
        Items.Add('最近六个月');
        Items.Add('最近一年');
        ItemIndex:=0;
      end;
      if tag =2 then  begin
        Items.Add('最近10天');
        Items.Add('最近20天');
        Items.Add('最近30天');
        Items.Add('最近70天');
        ItemIndex:=0;
      end;
      //Items:=Screen.Fonts;
    end;
    /////////////////////////////////////////完整代码如下
    unit FontComboBox1;interfaceuses
      Windows, Messages, SysUtils, Classes, Controls, StdCtrls,forms;type
      TfontComboBox = class(TComboBox)
      private
        { Private declarations }
      protected
        { Protected declarations }
      public
        { Public declarations }
        Constructor Create(Aowner:TComponent);override;
        procedure CreateWnd;override;
      published
        { Published declarations }
        Property Style default csDropDownList;
        Property Items stored false;
      end;procedure Register;implementationprocedure Register;
    begin
      RegisterComponents('sxf', [TfontComboBox]);
    end;
    {Constructor}
    Constructor TfontComboBox.Create(Aowner:TComponent);
    begin
      inherited Create (Aowner);
      style:=csDropDownList;
    end;
    procedure TfontComboBox.CreateWnd;
    begin
      inherited CreateWnd();
      if Tag =1  then begin
        Items.Add('最近一个月');
        Items.Add('最近三个月');
        Items.Add('最近六个月');
        Items.Add('最近一年');
        ItemIndex:=0;
      end;
      if tag =2 then  begin
        Items.Add('最近10天');
        Items.Add('最近20天');
        Items.Add('最近30天');
        Items.Add('最近70天');
        ItemIndex:=0;
      end;
      //Items:=Screen.Fonts;
    end;
    end.
      

  2.   

    老兄我给你一个重写的控件代码 
    unit RocComb;interfaceuses
      SysUtils, Classes, Controls, StdCtrls;type
      TRocComb = class(TComboBox)
      private
        { Private declarations }
        FTag:Longint;
        procedure SetFTag(Value:Longint);
      protected
        { Protected declarations }
      public
        { Public declarations }
      published
        { Published declarations }
        property Tag  read FTag write SetFTag default 0;
      end;procedure Register;implementationprocedure Register;
    begin
      RegisterComponents('rocxu', [TRocComb]);
    end;{ TRocComb }procedure TRocComb.SetFTag(Value: Integer);
    begin
       FTag:=Value;
       if Value=1 then
       begin
          Items.Clear;
          Items.Add('1');
          Items.Add('2');
          Items.Add('3');
          Items.Add('4');
       end
       else if  Value=2 then
       begin
          Items.Clear;
          Items.Add('一');
          Items.Add('二');
          Items.Add('三');
          Items.Add('四');
       end;
    end;end.
      

  3.   

    谢谢楼上二位: sxf_zero(从头再来)  和 winxkm(蹩脚的程序员) ,想不到这么快就有结果了!
    待我先试试看。
      

  4.   

    测试结果:
        以上二位的方法都能达到题目所述的目的,达也有一点点差别的。
        winxkm(蹩脚的程序员)的方法,会在放Form的DFM文件中记录那些item的值,也就是说在设计Form时也同时在运行组件中的TRocComb.SetFTag。如此来,每个放实例的Form的DFM文件中都会记录相应items,似乎达不到精简代码的目的。----不知道我说的对不对~~~
      

  5.   

    另外请教一个问题: 在 CreateWnd 中,怎样的表达式或以求出它所在的FORM ?
      

  6.   

    上面打错了,应是:另外请教一个问题: 在 CreateWnd 中,怎样的表达式可以求出它所在的FORM ?