原来窗体上的 button1 有一个事件. 后来我把button1 控件删了,但其事件代码还在,并且能通过编译执行.  本来这样对我的程式没有什么影响,但后来有近100多个button控件删了,他们的事件代码还在,这样编译执行速度就慢了很多. 现在我的窗体上有很多BUTTON,我不知哪个BUTTON控件不在但它的事件还在的. 
如何找出这些根本不起作用又占在代码里的多佘控件代码?非常感谢.这个"有趣"的问题已困扰了我一年多. 

解决方案 »

  1.   

    今夜失眠了,都1点了,还特精神...这我也想知道阿,delphi哪一天能做到自动把类里没有用到的数据、过程剔出出去,不进行编译阿?
      

  2.   

    不知道你们注意到了没有,平时写代码的主窗口,左半部分有个类似TreeView的部分,可以关闭它,也可以通过View->Code Explorer菜单重新打开它。这是一个导航窗口,可以快速地在各实例或函数间进行切换。而且是按字母顺序排序的。通过它,可以方便地看出哪个函数或过程目前已经没有用处了。比如,里面没有Button2,但是有Button2Click,这样的函数可能就是可以删除的函数了。希望能有所启发,呵呵
      

  3.   

    另外,每一个form都会有一个对应的.dfm文件,也可以通过分析它,找到相应的.pas里面无用的“事件”(.dfm里面有的就是有用的,没有的就是没用的了)做任何代码清理前,建议先做好备份,防止辛苦劳作不慎化为乌有。慎重!
      

  4.   

    你可以自己写个东西,首先根据DFM的特点查找出有关的函数名称,然后你在到你的PAS文件里去找相应的代码,比较以后找到没有用的代码
      

  5.   

    //使用如下代码搜索出闲置的方法
    uses TypInfo;procedure UnusedMethods(mComponent: TComponent; mStrings: TStrings);
    //设计 Zswang 2006-08-05 wjhu111#21cn.com 尊重作者,转贴请注明出处
    type
      PMethodInfo = ^TMethodInfo;
      TMethodInfo = packed record
        rSize: Word;
        rAddr: Pointer;
        rName: ShortString;
      end;type
      TMethodTable = packed record
        rCount: Word;
        rMethodInfo: array[0..0] of TMethodInfo;
      end;
      PMethodTable = ^TMethodTable;var
      vEventList: TList;  vMethodTable: PMethodTable;
      vMethodInfo: PMethodInfo;
      I: Integer;  procedure fScanEvent(mComponent: TComponent);
      var
        vPropList: PPropList;
        vPropCount: Integer;
        vMethod: TMethod;
        I: Integer;
      begin
        if not Assigned(mComponent) then Exit;
        vPropCount := GetPropList(mComponent, vPropList);
        for I := 0 to vPropCount - 1 do
        begin
          case vPropList[I].PropType^.Kind of
            tkMethod:
            begin
              vMethod := GetMethodProp(mComponent, vPropList[I].Name);
              if Assigned(vMethod.Code) then vEventList.Add(vMethod.Code);
            end;
          end;
        end;    for I := 0 to mComponent.ComponentCount - 1 do
          fScanEvent(mComponent.Components[I]);
      end;
    begin
      if not Assigned(mStrings) or not Assigned(mComponent) then Exit;
      vEventList := TList.Create;
      mStrings.BeginUpdate;
      try
        mStrings.Clear;
        vMethodTable := PPointer(PChar(mComponent.ClassType) + vmtMethodTable)^;
        if vMethodTable.rCount > 0 then
          vMethodInfo := @vMethodTable^.rMethodInfo[0];    fScanEvent(mComponent); //收集所有控件事件中使用到的方法地址
        for I := 0 to vMethodTable.rCount - 1 do //分析当前元件中声明但没有使用的方法
        begin
          if vEventList.IndexOf(vMethodInfo.rAddr) < 0 then
            mStrings.Add(vMethodInfo.rName);
          Inc(PChar(vMethodInfo), SizeOf(Word) + SizeOf(Pointer) + SizeOf(Byte) +
            Length(vMethodInfo^.rName));
        end;
        vEventList.Free;
      finally
        mStrings.EndUpdate;
      end;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      UnusedMethods(Self, Memo1.Lines); //输出结果
    end;