| 
| 
 | Вопрос # 3 296/ вопрос открыт / | 
 |  Здравствуйте, эксперты!Не могу решить проблему вот в этом.
 
 Это всё конечно работает, НО! После всего найденного я хочу сохранить содержимое lst2 в файл, а он почемуто не хочет!
 
 (Использую Delphi Lite lst-это listBox и так далее).
 
 Подскажите пожалуйста в чём подвох! Заранее спасибо!
 Приложение:Переключить в обычный режим procedure TForm1.DirFilePath(path:string);var sr:TSearchRec;    ras:string;beginchdir(path);if FindFirst(path+'\*.*',faAnyfile,sr) = 0 thentryrepeatif (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);if ras<>'.mp3' then begin      lst2.Items.Delete(lst1.Items.Count-1);      lst1.Items.Delete(lst1.Items.Count-1);      end; end else beginDirFilePath(path+'\'+sr.name);chdir('..');end;application.processmessages;until findnext(sr)<> 0;finallyFindClose(sr);end;end;
|  |   Вопрос задал: 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™ (статус: Доктор наук), 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 (статус: Посетитель), 17 октября 2009, 12:32 [#2]:про функцию ExtractFileExt() --- не знал, но догадывался что что-то есть такое! --------говорил же НЕ ЗНАЛ! 
 
 Ога, вставлял маску прямо в FindFirst()?
 
 if FindFirst(path + '\*.mp3', faAnyfile, sr) = 0
 then ...-------- ну так пашет же!
 
 Блин! могу весь исходник кинуть (плеера)
 |  
|   | 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 (статус: Посетитель), 17 октября 2009, 12:43 [#5]:ХА   |  
|   | min@y™ (статус: Доктор наук), 17 октября 2009, 12:52 [#6]: Цитата (eclipse): ХА   
 Чо ХА?!
 Код мой работает, я спрашиваю?
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | eclipse (статус: Посетитель), 17 октября 2009, 13:11 [#7]:не пробовал! пока мой вариант устраивает |  
|   | min@y™ (статус: Доктор наук), 17 октября 2009, 13:19 [#8]: Цитата (eclipse): не пробовал! пока мой вариант устраивает  
 Не понял?!! Я тут для кого стараюсь?
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Ерёмин А.А. (статус: *Администратор), 17 октября 2009, 13:22 [#9]:eclipse: Ваш код я переместил в приложение. Примечание в данном случае не имеет смысла, сейчас удалю его.
 |  
|   | eclipse (статус: Посетитель), 17 октября 2009, 13:28 [#10]:min@y™:  я ж выше написал сперва , что дошло до меня и я всё сделел так как мне надо! СПАСИБО ОГРОМНОЕ ЧТО ПОМОГЛИ! |  
|   | min@y™ (статус: Доктор наук), 17 октября 2009, 13:34 [#11]: Цитата (eclipse): что дошло до меня и я всё сделел так как мне надо 
 С удалением из списка добавленных файлов с раширением, отличным от mp3?!
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |