Перейти из форума на сайт.


Система IP-видеонаблюдения "Линия". Скачать бесплатную демо-версию для 16 камер. НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (до версии 2009) - часть 6

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121

Открыть новую тему     Написать ответ в эту тему

ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Продолжение темы Вопросы по Delphi (до версии 2009) - часть 5

Познаем сами, помогаем другим...
Обсуждаем вопросы, не связанные с юникоидными версиями Delphi - для этого есть соответствующая тема (см. ссылки ниже).

Правила топика:
    Прежде чем спрашивать:
  1. Желательно изучить вопрос, попытаться найти ответ в прилагаемых мануалах, хелпах и анализируя исходники.
  2. Выполнить поиск по топику (открыть "Версия для печати" и поискать ответ там).
  3. Применить фильтр по разделу "Прикладное программирование". Ответы на многие старые вопросы могли быть даны в отдельных темах.
  4. Продумайте вопрос. На поверхностные вопросы вы получите поверхностные ответы, или вообще ответов не получите.
  5. Желательно указывать версии используемого компилятора и операционной системы.
    Прежде чем отвечать:
  1. Если не можете помочь, не мешайте.
  2. Если уж вы отвечаете на вопрос, давайте ответ по сути.
  3. Если вы не уверены, так и говорите! Ошибочный, но авторитетно звучащий ответ хуже, чем отсутствие ответа.
  4. Задавайте дополнительные вопросы, чтобы получить больше информации.
  • Отсутствие ответа не равносильно игнорированию - иногда участники форума просто не знают ответ. Повторная посылка вопроса не приветствуется. Посты типа "неужели никто не знает ответа..." или "может мне все-таки кто-нибудь ответит" недопустимы.  
  • Все большие куски кода (более 5 строк) оформляем в тег [morе] дабы уменьшить размер поста. FAQ по тегу [morе].

     
    И старайтесь, чтобы ваш код не попал сюда

  • Всего записей: 3916 | Зарегистр. 29-07-2003 | Отправлено: 05:13 19-05-2010 | Исправлено: data man, 02:45 31-12-2010
    Alexzzy

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    GRom V

    Цитата:
    Как бы не так!!! Не найдет

    Как бы не так!!! Найдет!

    Всего записей: 1425 | Зарегистр. 10-07-2013 | Отправлено: 11:52 13-01-2018
    GRom V

    Full Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

    Цитата:
    Как бы не так!!! Найдет!

    Прежде чем утверждать - попробуй... Вот я пробовал, поэтому и создал эту тему.  
    Вопрос остается открытым!!!

    Всего записей: 454 | Зарегистр. 31-10-2006 | Отправлено: 05:03 14-01-2018
    Alexzzy

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    GRom V

    Цитата:
    Прежде чем утверждать - попробуй...  

    Прежде чем утверждать я естественно попробовал... Удачи!

    Всего записей: 1425 | Зарегистр. 10-07-2013 | Отправлено: 11:50 14-01-2018
    GRom V

    Full Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    ЕЩЕ РАЗ ГОВОРЮ ПАПКУ С ИМЕНЕМ 0.9.21.0 НЕ НАХОДИТ!!!

    Всего записей: 454 | Зарегистр. 31-10-2006 | Отправлено: 12:26 14-01-2018
    XenoZ



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    GRom V
    Alexzzy
    Данная процедура найдет целевую папку только в текущем каталоге. При явно указанной маске не работает рекурсивный вызов.

    ----------
    А оно мне надо?..

    Всего записей: 4983 | Зарегистр. 29-03-2006 | Отправлено: 15:15 14-01-2018
    GRom_V

    Full Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

    Цитата:
    Данная процедура найдет целевую папку только в текущем каталоге. При явно указанной маске не работает рекурсивный вызов.

    Находит папку и в подкаталогах, только если имя из букв (пробовал), но если имя 0.9.21.0 в подкаталогах не видит. Как решить проблему?
     
    Добавлено:
    Или может есть, у кого, код который адекватно работает?

    Всего записей: 454 | Зарегистр. 31-10-2006 | Отправлено: 00:52 15-01-2018
    ShIvADeSt



    Moderator
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    GRom_V
    Попробуй так.  

    Код:
     
    procedure ScanDir(StartDir: string; Ext: string; List: TStrings);
    var
      SearchRec: TSearchRec;
      srchMask : string;
    begin
      srchMask := '*.*';
      StartDir := IncludeTrailingBackslash(StartDir);
      if FindFirst(StartDir + srchMask,  faAnyFile, SearchRec) = 0 then
      begin
        repeat
          if (SearchRec.Attr and faDirectory) = faDirectory then
          begin
            if (SearchRec.Name <> '..') and (SearchRec.Name <> '.')then
              begin
                 List.Add('DIR: ' + StartDir + SearchRec.Name + '\');
                ScanDir(StartDir + SearchRec.Name + '\', Ext, List);
              end
          end
          else
            if ExtractFileExt(SearchRec.Name) = Ext then
              List.Add('FILE: ' + StartDir + SearchRec.Name);
          until FindNext(SearchRec) <> 0;
        FindClose(SearchRec);
      end;
    end;
     



    ----------
    И создал Бог женщину... Существо получилось злобное, но забавное...

    Всего записей: 3916 | Зарегистр. 29-07-2003 | Отправлено: 03:19 15-01-2018
    XenoZ



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    GRom_V
    Абсолютно индифферентно, из букв имя или из цифр.
    Для гарантированного обхода всех подкаталогов маску при вызове указывать не нужно, совсем. Совпадение обрабатывать внутри процедуры. Если цель - найти только первое совпадение, то добавить в условие цикла соответствующий флаг.

    ----------
    А оно мне надо?..

    Всего записей: 4983 | Зарегистр. 29-03-2006 | Отправлено: 07:00 15-01-2018
    Alexzzy

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    XenoZ

    Цитата:
    Для гарантированного обхода всех подкаталогов маску при вызове указывать не нужно, совсем. Совпадение обрабатывать внутри процедуры.  

    Проще, думаю, сначала делать цикл по маске без рекурсии. Затем цикл без маски по директориям с рекурсией.

    Всего записей: 1425 | Зарегистр. 10-07-2013 | Отправлено: 11:37 15-01-2018
    GRom V

    Full Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

    Цитата:
    [/q]
    [q]Попробуй так.  

    При таком раскладе не работает  ScanDir('d:\soft\Borland\', '0.9.21.0.2', ListBox1.Items); - просто показываются ВСЕ файлы в папке Borland и без разницы что я указываю в '0.9.21.0.2'.
    Ребят есть рабочий пример???

    Всего записей: 454 | Зарегистр. 31-10-2006 | Отправлено: 15:14 15-01-2018
    XenoZ



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    GRom V
    А поставить в начале процедуры брейкпойнт и пройти ее по шагам, чтобы понять, как оно работает, - это ведь так сложно...
    Пример...

    ----------
    А оно мне надо?..

    Всего записей: 4983 | Зарегистр. 29-03-2006 | Отправлено: 16:30 15-01-2018 | Исправлено: XenoZ, 16:32 15-01-2018
    VitaliM



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Вы как будто не заметили предложенный ShIvADeSt полностью рабочий пример?
    У вас спор ради спора? В том примере я только вместо '*.*' поставил '*', что бы не смущало количество точек, и тоже все работает. Я засунул искомую папку в "E:\Embarcadero\RAD Studio\7.0\include\0.9.21.0\" и прога немного пошуршав все равно её нашла.

    Всего записей: 1991 | Зарегистр. 12-01-2005 | Отправлено: 17:51 15-01-2018
    XenoZ



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    VitaliM
    Если к строке
    List.Add('DIR: ' + StartDir + SearchRec.Name + '\');
    добавить проверку
    if SearchRec.Name=Ext then List.Add('DIR: ' + StartDir + SearchRec.Name + '\');
    тогда пример будет полностью рабочий.

    ----------
    А оно мне надо?..

    Всего записей: 4983 | Зарегистр. 29-03-2006 | Отправлено: 18:53 15-01-2018
    Alexzzy

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Примеры не работают с маской. Для работы с маской я привел алгоритм.

    Всего записей: 1425 | Зарегистр. 10-07-2013 | Отправлено: 21:23 15-01-2018
    ShIvADeSt



    Moderator
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    XenoZ

    Цитата:
    if SearchRec.Name=Ext then List.Add('DIR: ' + StartDir + SearchRec.Name + '\');
    тогда пример будет полностью рабочий.

    Ага, я почему то подумал, что главное нормальную функцию дать, а со сравнением имени файла и искомой строки разберутся и так
     
    Alexzzy

    Цитата:
    Примеры не работают с маской. Для работы с маской я привел алгоритм.

    В моем примере маска поиска *.*, а потом уже идет сравнение с маской пользователя (допилить под свои нужды).

    ----------
    И создал Бог женщину... Существо получилось злобное, но забавное...

    Всего записей: 3916 | Зарегистр. 29-07-2003 | Отправлено: 01:58 16-01-2018
    GRom V

    Full Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Во первых спасибо за помощь!
    Сделал так:
    procedure ScanDir(StartDir: string; Ext: string; List: TStrings);
    var
      SearchRec: TSearchRec;
      srchMask : string;
    begin
      srchMask := '*.*';
      StartDir := IncludeTrailingBackslash(StartDir);
      if FindFirst(StartDir + srchMask,  faAnyFile, SearchRec) = 0 then
      begin
        repeat
          if (SearchRec.Attr and faDirectory) = faDirectory then
          begin
            if (SearchRec.Name <> '..') and (SearchRec.Name <> '.')then
              begin
                 List.Add('DIR: ' + StartDir + SearchRec.Name + '\');
                 if SearchRec.Name=Ext then List.Add('DIR: ' + StartDir + SearchRec.Name + '\');
                ScanDir(StartDir + SearchRec.Name + '\', Ext, List);
              end
          end
          else
            if ExtractFileExt(SearchRec.Name) = Ext then
              List.Add('FILE: ' + StartDir + SearchRec.Name);
          until FindNext(SearchRec) <> 0;
        FindClose(SearchRec);
      end;
    end;
     
     
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      ListBox1.Items.Clear;
      ScanDir('d:\soft\Borland\Delphi7\Projects', '0.9.21.0.2', ListBox1.Items);
      Label1.Caption := IntToStr(ListBox1.Items.Count);
    end;  
     
    Теперь в список выводятся вообще все просканированные папки и файлы. Как сделать чтоб выводились только каталоги в которых есть 0.9.21.0.2?

    Всего записей: 454 | Зарегистр. 31-10-2006 | Отправлено: 11:00 16-01-2018
    Alexzzy

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ShIvADeSt

    Цитата:
    а потом уже идет сравнение с маской пользователя (допилить под свои нужды).

    Для обработки маски надо регулярные выражения подключать. А зачем если в FindFirst и FindNext работа с маской уже заложена?
    Делается проще. Как то так.

    Код:
     
    procedure ScanDir(StartDir, Mask: string; List: TStrings);
    var
      SearchRec: TSearchRec;
    begin
      StartDir := IncludeTrailingPathDelimiter(StartDir);
     
      {поиск по маске в текущей директории}
      if FindFirst(StartDir + Mask, faAnyFile, SearchRec) = 0 then
      begin
        repeat
          if (SearchRec.Attr and faDirectory) = faDirectory then
          begin
            if (SearchRec.Name <> '..') and (SearchRec.Name <> '.') then
              List.Add('DIR: ' + StartDir + SearchRec.Name + '\');
          end
          else
            List.Add('FILE: ' + StartDir + SearchRec.Name);
        until FindNext(SearchRec) <> 0;
        FindClose(SearchRec);
      end;
     
      {рекурсивный обход всех поддиректорий}
      if FindFirst(StartDir + '*', faDirectory, SearchRec) = 0 then
      begin
        repeat
          if (SearchRec.Name <> '..') and (SearchRec.Name <> '.') then
            ScanDir(StartDir + SearchRec.Name, Mask, List);
        until FindNext(SearchRec) <> 0;
        FindClose(SearchRec);
      end;
    end;


    Всего записей: 1425 | Зарегистр. 10-07-2013 | Отправлено: 13:05 16-01-2018
    GRom V

    Full Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

    Цитата:
    Для обработки маски надо регулярные выражения подключать. А зачем если в FindFirst и FindNext работа с маской уже заложена?
    Делается проще. Как то так.  

     
    О... ЭТО КРУТО - ОГРОМНОЕ СПАСИБО!!!

    Всего записей: 454 | Зарегистр. 31-10-2006 | Отправлено: 13:35 16-01-2018
    GRom V

    Full Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Еще раз всем здравствуйте. Изначально задумка была такая - найти все папки с заданным именем и переименовать их все в другое.
    пытался в функцию  после:
    if (SearchRec.Name <> '..') and (SearchRec.Name <> '.') then begin
              List.Add('DIR: ' + StartDir + SearchRec.Name + '\');  
    добавить  
     
    MoveFile(PChar('DIR: ' + StartDir + SearchRec.Name), 'new_name'); - не получается.
    Подскажите плз как переименовать каждую найденную папку?

    Всего записей: 454 | Зарегистр. 31-10-2006 | Отправлено: 01:32 17-01-2018
    ShIvADeSt



    Moderator
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    GRom V
    Сразу скажу - делать так, идея в корне неверная. После переименования сбивается список файлов, в итоге получишь ерунду.
    Правильно - вначале получаешь список файлов/каталогов с помощью рекурсии, потом пробегаешься по списку и переименовываешь.  

    Цитата:
    MoveFile(PChar('DIR: ' + StartDir + SearchRec.Name), 'new_name'); - не получается.  

    ээээ, слово 'DIR: ' тут явно лишнее
     
    Alexzzy

    Цитата:
    Делается проще. Как то так.  

    Вариант

    ----------
    И создал Бог женщину... Существо получилось злобное, но забавное...

    Всего записей: 3916 | Зарегистр. 29-07-2003 | Отправлено: 02:41 17-01-2018
    Открыть новую тему     Написать ответ в эту тему

    Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (до версии 2009) - часть 6

    Имя:
    Пароль:
    Сообщение

    Для вставки имени, кликните на нем.

    Опции сообщенияДобавить свою подпись
    Подписаться на получение ответов по e-mail
    Добавить тему в личные закладки
    Разрешить смайлики?
    Запретить коды


    Реклама на форуме Ru.Board.

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.Board
    © Ru.Board 2000-2018

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru