Показать сообщение отдельно
  #7  
Старый 08.10.2012, 03:45
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от SCrat.ORS
сложно, потому что это отдельные части кода, моей одной программки, ...
Что-то я не увидел связи между тем "почему так сложно" и тем что это "части кода твоей программки". Или ты намекаешь на то, что тебе платят пропорционально количеству строк в твоей программе и поэтому где только можно ты пытаешься увеличить их количество?
Цитата:
Сообщение от SCrat.ORS
в 1 части, да,.. возможно и можно проще, но не во второй
Что значит "но не во второй"? Мой второй код тоже проще и короче твоего. У меня законченный и рабочий код, а твой до конца не дописан: нет завершения цикла while, нет освобождения ресурса FindClose(SR). Кроме того дважды используется FindNext (и нужен ещё третий), хотя достаточно одного, и ещё дважды используется Continue (которое имеет свойство ухудшать читабельность кода, правда не настолько сильно как goto, но всё же). И напоследок ошибки: переменная FindRes у тебя почему-то строкового типа - это ошибка, такое не скомпилируется; и у тебя в программе ошибочно предполагается, что расширение файла всегда трёхсимвольное и всегда маленькими буквами.

Если дописать твою версию до рабочего варианта, получим следующее:
Код:
procedure FindFile(Dir: string);
var
  SR: TSearchRec;
  exten, Name: string;
  FindRes, k: Integer;
begin
  FindRes := FindFirst(Dir + '*.*', faAnyFile, SR);
  if FindRes = 0 then
  try
    while FindRes = 0 do
    begin
      Name := Dir;
      if ((SR.Attr and faDirectory) = faDirectory) and ((SR.Name = '.') or (SR.Name = '..')) then
      begin
        FindRes := FindNext(SR);
        Continue;
      end;
      if ((SR.Attr and faDirectory) = faDirectory) then /// если найден каталог, то
      begin
        FindFile(Dir + SR.Name + '\');
        FindRes := FindNext(SR);
        Continue;
      end;
      Name := Name + SR.Name;
      k := length(SR.Name);
      exten := copy(SR.Name, k - 2, 3);
      if exten = 'txt' then
      begin

      end;
      FindRes := FindNext(SR);
    end;
  finally
    FindClose(SR);
  end;
end;
Теперь сравни с моей версией:
Код:
procedure FindFile(Path: string);
var
  SR: TSearchRec;
  FullFileName, FileExt: string;
begin
  if FindFirst(Path + '*.*', faAnyFile, SR) = NO_ERROR then
  try
    repeat
      FullFileName := Path + sr.Name;
      if (SR.Attr and faDirectory) = faDirectory then // Это каталог
      begin
        if (SR.Name <> '.') and (SR.Name <> '..') then FindFile(FullFileName + '\');
      end else // Это файл
      begin
        FileExt := AnsiLowerCase(ExtractFileExt(FullFileName));
        if FileExt = '.txt' then
        begin

        end;
      end;
    until FindNext(SR) <> NO_ERROR;
  finally
    FindClose(sr);
  end;
end;
Ответить с цитированием