先把WINDOWS目录下的EXE全都读到一个文件中..
可以用DOS 的 DIR 命令实现 : DIR *.EXE /B /S > XXX.TXT
然后根据每行命令动态创建按钮. CAPTION 也可以直接从 XXX.TXT 中得到.

解决方案 »

  1.   

    建议动态创建button:
    var
      SearchRec:TSearchRec;
      found,i:integer;
      button:array[0..10]of TButton;
      path:string;
    begin
      path:='c:\windows\';
      i:=0;
      found:=FindFirst(path+'*.exe',faAnyFile,SearchRec);
      while found=0 do
      begin
        if (SearchRec.Name<>'.')and(SearchRec.Name<>'..')and(SearchRec.Attr<>faDirectory)//判断是否为文件
        then
          with button[i].Create(self) do
          begin
            caption:=SearchRec.name;
            Visible:=true;
          end;
        found:=FindNext(SearchRec);
      end;
      

  2.   

    //一种方法:动态取得WIN目录下所有文件创建BUTTON,每行三个
    procedure TForm1.CreateWinDirExeList;
    var
      SRec: TSearchRec;
      Path,Fn,Fx,TitleStr:string;
      retval:integer;
      Button:TButton;
      Dir,Mask:String;
      X,Y,Number:Integer;
      WinDir:Array[0..125] of Char;
    begin
      GetWindowsDirectory(WinDir,125);  //搜索路径
      Path :=StrPas(WinDir);
      Mask :='\*.*';
      X:=0;
      Y :=0;
      Number :=0;
      retval := FindFirst( Path+Mask,faAnyFile,SRec);   //开始
      While retval=0 Do
      Begin
        If (SRec.Attr and (faDirectory or faVolumeID)) = 0 Then //是文件
        begin
          Application.ProcessMessages;
          Fn:=SRec.Name;                                        //取文件名
          TitleStr :=Fn;
          Fx :=UpperCase(ExtractFileExt(Fn));                              //取扩展名
          Delete(TitleStr,Length(TitleStr)-3,4);                            //取文件前名称
          if (Fx ='.EXE') then
          Begin
            Button :=TButton.Create(Self);
            Button.Parent :=Form1;
            Button.Caption :=TitleStr;
            Button.Hint :=Fn;
            Button.Top :=Y;
            Button.Left :=X;
            Button.ShowHint :=True;
            Number :=Number +1;
            X :=X+100;
            if X >(100 *2) then
            Begin
              Y :=Y+40;
              X :=0;
            end;
          end;
        end;
        retval := FindNext(SRec);                               //找下一个
      End;
      SysUtils.FindClose(SRec);
    end;