-1

こんにちは、フォルダから文字列リストにファイル名のリストをロードしようとしています。.jpg で終わるファイルの名前だけを追加したいのですが、実行するとアクセス違反エラーが発生します。これが私が得たものです。

ディレクトリを選択します。

procedure TMainForm.Load1Click(Sender: TObject);
var
  DirName: string;
begin
    mylist.Free;
    myList := TList<TBitmap>.Create;
  DirName := 'c:\';
  if SelectDirectory(DirName,[sdAllowCreate, sdPerformCreate, sdPrompt],SELDIRHELP)
  then;
    LoadImages(DirName);
end;

フォルダー内の合計ファイル数を取得します

function GetFilesCount(Dir : string; Mask : string) : integer;
var
  Path : string;
begin
  Result := 0;
  for Path in TDirectory.GetFiles(Dir, Mask) do
    inc(Result);
end;

フォルダからファイル名を取得します

function TMainForm.GetFilenames(Path: string ):TStrings;
var
  Dest: TStrings;
  SR: TSearchRec;
begin
  Dest.create;
  if FindFirst(Path+'*.*', faAnyFile, SR) = 0 then
  repeat
    Dest.Add(SR.Name);
  until FindNext(SR) <> 0;
  FindClose(SR);
  Result := Dest;
  Dest.Free;
end;

と負荷画像

    procedure TMainForm.LoadImages(const Dir: string);
    const
      FIRST_IMAGE = 0;
    var
      iFile : Integer;
      CurFileName: string;
      FoundFile : boolean;
      FileNameTemplate : string;
      FileNames : Tstrings;
    begin
       FileNames.Create;
       FileNameTemplate := IncludeTrailingPathDelimiter(Dir) + '*.jpg';          FileNames:=GetFileNames(FileNameTemplate);                                                 
      try
        ifile := 0;                                                                 
        repeat
          CurFileName := FileNames.Names[ifile];                                      
          showmessage(Curfilename);
 if FoundFile then
      begin
        end;
        Inc(iFile);
      end;
    until not FoundFile;
end;
4

2 に答える 2

5

問題はここにあります(実際には2つの問題があります)-実際には、コードに同じ問題が2回あります:

Dest.Create;  // In GetFileNames

FileNames.Create; // In LoadImages

まず、TStrings抽象クラスです。そのインスタンスを作成することはできません。のような他のより具体的なクラスの基礎ですTStringList。代わりに、これらの具象クラスの 1 つを作成してください。

次に、 を作成し、TStringListそれへの参照を保存する必要があります。

FileNames := TStringList.Create;

それを行うためのより良い方法は、文字列リストを作成して関数またはプロシージャに渡すことです。これは、返されたときに結果が必要になるためです。そのうちの 1 つについて簡単に説明します。

function TMainForm.GetFilenames(const Path: string; const FileList: TStringList ): Boolean;
var
  SR: TSearchRec;
begin
  Assert(Assigned(FileList));      // Make sure it was created and passed in
  FileList.Clear;                  // Remove any previous names
  if FindFirst(Path+'*.*', faAnyFile, SR) = 0 then
  repeat
    FileList.Add(SR.Name);
  until FindNext(SR) <> 0;
  FindClose(SR);
  Result := FileList.Count > 0;  // Return true if we have found any files
end;

次のように呼び出します。

FileNames := TStringList.Create;
try
  if GetFileNames(PathToFolder, FileNames) then
  begin
    // Process files here
    for i := 0 to FileNames.Count - 1 do
    begin
      CurrFile := FileNames[i];
      // Use the file here from CurrFile
    end;

  end;
finally
  FileNames.Free;
end;
于 2012-06-18T18:57:10.423 に答える
0
function GetAllFiles(AFolder: string; AMask: string; AStringList: TStringList): integer;
// Add all files matching AMask in AFolder to AStringList. Returns number of files
var
  iSearch: TSearchRec;
  iCount: integer;
  iFileAttrs: integer;
begin
  iCount := 0;
  iFileAttrs := $23 - faHidden;
  // Find all files
  if FindFirst(IncludeTrailingPathDelimiter(AFolder) + AMask, iFileAttrs, iSearch) = 0 then
  begin
    repeat
      // Add the files to the stringlist
      AStringList.Add(IncludeTrailingPathDelimiter(AFolder) + iSearch.name);
      inc(iCount);
    until FindNext(iSearch) <> 0;
  end;
  FindClose(iSearch);
  Result := iCount;
end;
于 2012-06-18T18:58:44.470 に答える