Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 296

Раздел: Delphi » Прочее
/ вопрос открыт /

Здравствуйте, эксперты!
Не могу решить проблему вот в этом.

Это всё конечно работает, НО! После всего найденного я хочу сохранить содержимое lst2 в файл, а он почемуто не хочет!

(Использую Delphi Lite lst-это listBox и так далее).

Подскажите пожалуйста в чём подвох! Заранее спасибо!

Приложение:
  1. procedure TForm1.DirFilePath(path:string);
  2. var sr:TSearchRec;
  3. ras:string;
  4. begin
  5. chdir(path);
  6. if FindFirst(path+'\*.*',faAnyfile,sr) = 0 then
  7. try
  8. repeat
  9. if (sr.name='.') or (sr.name='..') then continue;
  10. if (sr.attr and faDirectory)=0 then begin
  11.  
  12. lst2.items.add(path+'\'+sr.name);
  13. lst1.items.add(sr.name);
  14. ras:=copy(sr.name,LastDelimiter('.',sr.name),maxint);
  15. if ras<>'.mp3' then begin
  16. lst2.Items.Delete(lst1.Items.Count-1);
  17. lst1.Items.Delete(lst1.Items.Count-1);
  18. end;
  19.  
  20. end else begin
  21. DirFilePath(path+'\'+sr.name);
  22. chdir('..');
  23. end;
  24. application.processmessages;
  25. until findnext(sr)<> 0;
  26. finally
  27. FindClose(sr);
  28. end;
  29. end;


eclipse Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: eclipse (статус: Посетитель)
Вопрос отправлен: 17 октября 2009, 11:24
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: min@y™

Отвратительное форматирование исходника!
Пришлось обработать напильником, чтобы проанализировать код.
Посмотри внимательно:

procedure TForm1.DirFilePath(path: string);
var
  sr: TSearchRec;
  ras: string;
begin
  chdir(path); // <-- это лишнее
 
  if FindFirst(path + '\*.*', faAnyfile, sr) = 0
    then try
           repeat
             if (sr.name = '.') or (sr.name = '..')
               then continue;
 
             if (sr.attr and faDirectory) = 0
               then begin
                      lst2.items.add(path + '\' + sr.name);
                      lst1.items.add(sr.name);
                      ras:= copy(sr.name, LastDelimiter('.', sr.name), maxint); // <-- Не знаешь про функцию
ExtractFileExt()?
 
                      if ras <> '.mp3'
                        then begin
                               lst2.Items.Delete(lst1.Items.Count - 1); // <-- зачем удалять после добавления?
                               lst1.Items.Delete(lst1.Items.Count - 1); // <-- не проще ли просто НЕ добавлять НЕ
mp3-файлы?
                             end;
                    end
               else begin
                      DirFilePath(path + '\' + sr.name);
                      chdir('..'); // <-- это лишнее
                    end;
 
             application.processmessages();
           until findnext(sr) <> 0;
         finally
           FindClose(sr);
         end;
end;
 
{После всего найденного я хочу сохранить содержимое lst2 в файл,
а он почемуто не хочет!}
 
// А где код, в котором ты пытаешься сохранить содержимое lst2 в файл?
procedure TForm1.FindButtonClick(Sender: TObject);
begin
  DirFilePath('C:\Музяка\Попса\Дом-2\Разное'); // :)))
  lst2.Items.SaveToFile('C:\Музяка\Попса\Дом-2\Разное\PlayList.m3u');
end;

Если у тебя всё же был кусок кода сохранения, но ты почему-то его суда не скопипастил, и этот код даёт ошибку, то какую?

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 17 октября 2009, 11:55
Оценка за ответ: 5

Комментарий к оценке: про функцию ExtractFileExt() --- не знал, но догадывался что что-то есть такое!

зачем удалять после добавления? --- пробовал не добавлять! работает криво! смотрит только что в первом каталоге и всё.

Да к стати додумался вот так -------------------------
procedure TForm1.DirFilePath(path:string);
Var SR:TSearchRec;
    FindRes:Integer;
    ras:string;
begin
FindRes:=FindFirst(path+'\*.*',faAnyFile,SR);
While FindRes=0 do
   begin
      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
            // входим в процедуру поиска с параметрами текущего каталога +
            // каталог, что мы нашли
            DirFilePath(path+'\'+SR.Name);
            FindRes:=FindNext(SR);
            // после осмотра вложенного каталога мы продолжаем поиск
            // в этом каталоге
            Continue; // продолжить цикл
         end;

      Lst2.Items.Add(path+'\'+sr.name);
      lst1.items.add(sr.name);
ras:=copy(sr.name,LastDelimiter('.',sr.name),maxint);
if ras<>'.mp3' then begin
      lst2.Items.Delete(lst1.Items.Count-1);
      lst1.Items.Delete(lst1.Items.Count-1);
      end;

      FindRes:=FindNext(SR);
   end;
FindClose(SR);
end;

Мини-форум вопроса

Всего сообщений: 11; последнее сообщение — 17 октября 2009, 13:34; участников в обсуждении: 4.
min@y™

min@y™ (статус: Доктор наук), 17 октября 2009, 12:25 [#1]:

Цитата (eclipse):


про функцию ExtractFileExt() --- не знал, но догадывался что что-то есть такое!


Тогда почему не использовал?

Цитата (eclipse):


зачем удалять после добавления? --- пробовал не добавлять! работает криво! смотрит только что в первом каталоге и всё.


Ога, вставлял маску прямо в FindFirst()?

if FindFirst(path + '\*.mp3', faAnyfile, sr) = 0
  then ...

Такой вариант подходит только для поиска в каталоге без захода в подкаталоги, ведь их имена (подкаталогов) могут не иметь расширения "mp3".

Цитата (eclipse):


Да к стати додумался вот так


Второй вариант ещё более жуткий, чем первый. Ладно, не мучайся, я взял напильник помельче и...

uses Masks;
 
// Пусть это быдет функция, которая на всякий случай
// возвращает количество найденных файлов.
function TForm1.DirFilePath(path: string): Cardinal;
var
  sr: TSearchRec;
begin
  Result:= 0;
 
  if FindFirst(path + '\*.*', faAnyfile, sr) = 0
    then try
           repeat
             if (sr.name = '.') or (sr.name = '..')
               then Continue;
 
             if ((sr.attr and faDirectory) = 0) and MatchesMask(sr.Name, '*.mp3')
               then begin
                      lst2.items.add(path + '\' + sr.name);
                      lst1.items.add(sr.name);
                      Inc(Result);
                    end
               else Inc(Result, DirFilePath(path + '\' + sr.name));
 
             if Result mod 256 = 255 // Для ускорения работы
               then Application.ProcessMessages();
           until FindNext(sr) <> 0;
         finally
           FindClose(sr);
         end;
end;
 
procedure TForm1.FindButtonClick(Sender: TObject);
begin
  lst1.Items.BeginUpdate();
  lst2.Items.BeginUpdate();
  FindButton.Enabled:= False;
  try
    DirFilePath('C:\Музяка\Попса\Дом-2\Разное'); // :)))
  finally
    FindButton.Enabled:= True;
    lst1.Items.EndUpdate();
    lst2.Items.EndUpdate();
    lst2.Items.SaveToFile('C:\Музяка\Попса\Дом-2\Разное\PlayList.m3u');
  end;
end;
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
eclipse

eclipse (статус: Посетитель), 17 октября 2009, 12:32 [#2]:

про функцию ExtractFileExt() --- не знал, но догадывался что что-то есть такое! --------говорил же НЕ ЗНАЛ!


Ога, вставлял маску прямо в FindFirst()?

if FindFirst(path + '\*.mp3', faAnyfile, sr) = 0
then ...-------- ну так пашет же!

Блин! могу весь исходник кинуть (плеера)
min@y™

min@y™ (статус: Доктор наук), 17 октября 2009, 12:38 [#3]:

Цитата (eclipse):

Блин! могу весь исходник кинуть (плеера)


Ой, не надо!
Мой код работает?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Егор

Егор (статус: 10-ый класс), 17 октября 2009, 12:41 [#4]:

Цитата (min@y™):

C:\Музяка\Попса\Дом-2\Разное\PlayList.m3u

:)))))))))))))))))))))))))))
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
eclipse

eclipse (статус: Посетитель), 17 октября 2009, 12:43 [#5]:

ХА :)
min@y™

min@y™ (статус: Доктор наук), 17 октября 2009, 12:52 [#6]:

Цитата (eclipse):

ХА :)


Чо ХА?!
Код мой работает, я спрашиваю?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
eclipse

eclipse (статус: Посетитель), 17 октября 2009, 13:11 [#7]:

не пробовал! пока мой вариант устраивает
min@y™

min@y™ (статус: Доктор наук), 17 октября 2009, 13:19 [#8]:

Цитата (eclipse):

не пробовал! пока мой вариант устраивает


Не понял?!! Я тут для кого стараюсь?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Ерёмин А.А.

Ерёмин А.А. (статус: *Администратор), 17 октября 2009, 13:22 [#9]:

eclipse:
Ваш код я переместил в приложение. Примечание в данном случае не имеет смысла, сейчас удалю его.
eclipse

eclipse (статус: Посетитель), 17 октября 2009, 13:28 [#10]:

min@y™: я ж выше написал сперва , что дошло до меня и я всё сделел так как мне надо! СПАСИБО ОГРОМНОЕ ЧТО ПОМОГЛИ!
min@y™

min@y™ (статус: Доктор наук), 17 октября 2009, 13:34 [#11]:

Цитата (eclipse):

что дошло до меня и я всё сделел так как мне надо


С удалением из списка добавленных файлов с раширением, отличным от mp3?!
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:49
Выполнено за 0.04 сек.