主窗口main_frm 放了三个按钮 想实现三种不同的测试功能 结构是一样的 只是内部的算法不同 请问该怎么实现? 下面是我写的代码 请问错在哪里?在main_frm 中 代码如下const CeShiYi=1;
      CeShiEr=2;
      CeShiSan=3;
procedure Tmain_frm.bt1Click(Sender:TObject);
begin
if my_frm=nil then
my_frm:=Tmy_frm.Create(Self,1);
my_frm.Show;
end;procedure Tmain_frm.bt2Click(Sender: TObject);
begin
if my_frm=nil then
my_frm:=Tmy_frm.Create(Self, 2);
my_frm.Show;
end;procedure Tmain_frm.bt3Click(Sender: TObject);
begin
if my_frm=nil then
my_frm:=Tmy_frm.Create(Self, 3);
my_frm.Show;
end;
在my_frm中 代码如下var W:integer;procedure Tmy_frm.FormPaint(Sender: TObject);      
begin
    if W=1 then
       begin
      ...........
       end;
     if W=2 then
begin
         .........
end;
     if W=3 then
        begin
         ........
        end;end;

解决方案 »

  1.   

    设置三个Button的Tag属性分别为1,2,3
    三个按钮使用同一个事件:
    代码
    procedure Tmain_frm.btCommonClick(Sender: TObject);
    begin
    if my_frm=nil then
      my_frm:=Tmy_frm.Create(Self, (Sender as TButton).Tag);
    my_frm.Show;
    end;
      

  2.   

    没看清楚Tmy_frm的Create只接受一个参数的,可以有两种算法.
    一种是在Tmy_frm重写Create
    constructor Tmy_frm.Create(AOwner: TComponent; AW: Integer);
    begin
      inherited Create(AOwner);
      W := AW;
    end;调用
    调用时
    procedure Tmain_frm.btCommonClick(Sender: TObject);
    begin
    if my_frm=nil then
      my_frm:=Tmy_frm.Create(Self, (Sender as TButton).Tag);
    my_frm.Show;
    end;第二种,因为你W定义了全局,最好建议是定义成Tmy_frm的属性.
    property W: Integer read FW write FW;调用:
    procedure Tmain_frm.btCommonClick(Sender: TObject);
    begin
    if my_frm=nil then
    begin
      my_frm:=Tmy_frm.Create(Self);
      my_frm.W := (Sender as TButton).Tag;
    end;
    my_frm.Show;
    end;
      

  3.   

    是不是事件没有实现?
    主要是你给w赋值,应该是在窗体的create事件里吧?
    而你
    if my_frm=nil then
    my_frm:=Tmy_frm.Create(Self, 3);判断my_frm为nil的时候,才创建my_frm,可是,你没有释放my_frm,所以,第二次运行的时候不会触发你的create事件,总得来说,只有点的第一个按钮好用,到第二个和第三个按钮的时候,无事件反映。
      

  4.   

    函数参数不符,连编译都过不去,要不重载函数,要不,
    if my_frm=nil then
    my_frm:=Tmy_frm.Create(Self);
    my_frm.W:=1;
    my_frm.Show;
      

  5.   

    to chenzhuo 谢谢你 我试试看
      

  6.   

    解决办法是:要么换个方法给W赋值,要么每次处理测试后释放掉my_frm。
    1:如:3楼,不过if my_frm=nil then
    begin
      my_frm:=Tmy_frm.Create(Self);
    end;
      my_frm.W := (Sender as TButton).Tag;   这句要放到外面
      
    2:
    try
      if my_frm=nil then
        my_frm:=Tmy_frm.Create(Self,1);
      my_frm.ShowModal;
    finally
      my_frm.free;
    end;
      

  7.   

    额,在你按钮事件的第一句,加上
    if my_frm<> nil then my_frm.Free;
    应该也可以
      

  8.   

    在main_frm 中 对my_frm单元的引用已经添加上了在按钮事件中  按钮的tag属性分别改为了1,2,3
    procedure Tmain_frm.bt1Click(Sender: TObject);
    begin
    if my_frm=nil then
    begin
      my_frm:=Tmy_frm.Create(Self);
      my_frm.W := (Sender as TButton).Tag;
    end;
    my_frm.Show;
    end; 
    在my_frm中 public    constructor Create(AOwner: TComponent; AW: integer);
        { Public declarations }
        property W: Integer read FW write FW;  end;
    请问这样定义W可以吗?
      

  9.   

      public
        { Public declarations }
        w :integer;
        Constructor Create(AOwner: TComponent;s:Integer);constructor TForm2.Create(AOwner: TComponent;s:Integer);
    begin
      inherited Create(AOwner);
      w:= s;
    end;procedure TForm2.Button1Click(Sender: TObject);
    begin
    //  showmessage(inttostr(w));
      case w of
      1 : ;
      2 : ;
      end;
    end;窗体调用procedure TForm1.Button1Click(Sender: TObject);
    begin
      if Form2 <> nil then Form2.Free;
        Form2:= TForm2.Create(self,2);
    //  Form2:= TForm2.Create(self,1);
      Form2.Show;
    end; 
      

  10.   

    应该也可以,不过你的  my_frm.W := (Sender as TButton).Tag;
    这句,放错位置了,应该if my_frm=nil then
    begin
      my_frm:=Tmy_frm.Create(Self);
    end;  
    my_frm.W := (Sender as TButton).Tag;my_frm.Show;
    end;
      

  11.   

    to  Allanlove(山上的红叶疯了) 谢谢 你的方法行得通 非常感谢
    to chenzhuo 谢谢 都非常好 谢谢大家的帮忙