Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.10.15;
Скачать: [xml.tar.bz2];

Вниз

Список каталогов   Найти похожие ветки 

 
RainKMM   (2006-09-28 13:43) [0]

Здравствуйте!
Подскажите пожалуйста, как получить список всех подкаталогов в каталоге?


 
Elen ©   (2006-09-28 13:47) [1]

Попробуй DirectoryListBox. или сторонними компонентами типа LMD или FindFirst...FindNext


 
MsGuns ©   (2006-09-28 14:09) [2]

>Elen ©   (28.09.06 13:47) [1]
>Попробуй DirectoryListBox. или сторонними компонентами типа LMD или FindFirst...FindNext

Я очень извиняюсь, но Вы не в первый раз советуете ерунду новичкам. Для того, чтобы научиться плавать вовсе необязательно ехать на Гавайи. LMD - это всего-навсего набор красивых побрякушек, большинство из которых не представляют из себя никакой практической ценности. Кроме того, у нее совсем слабо с преемственностью версий и, как следствие, гарантированы траблы при переносе проектов с ПК на ПК.

Для сабжа достаточно просто почитать основы работы с файлами в Дельфи.
Или тот же FindFirst+F1


 
Johnmen ©   (2006-09-28 14:11) [3]

http://delphimaster.net/view/2-1159384035/


 
RainKMM   (2006-09-28 15:32) [4]

Че то я со все етим разобратся не могу? Помогите толковой инфой по етой теме


 
Elen ©   (2006-09-28 15:35) [5]


> MsGuns

Ну почему же? У меня никогда не было тарблов со сторонними компонентами. Как правило все мои проги содержат чего-то из инета и ни разу не глюкнули на других тачках (если конечно я их четко отлаживаю). Сторонние компоненты - это возможность избавить программистов от рутины. Разве не так?


 
Zeqfreed ©   (2006-09-28 15:37) [6]

> [5] Elen ©   (28.09.06 15:35)

Использовать сторонний компонент ради того, чтобы не писать 10 строк кода?


 
RainKMM   (2006-09-28 15:39) [7]

нашел на delphi world такую процедуру но она ругаэтся на AddDirSeparator, а я понять не могу как от етого избавиться.
procedure GetSubDirs(const sRootDir: string; slt: TStrings);
var
  srSearch: TSearchRec;
  sSearchPath: string;
  sltSub: TStrings;
  i: Integer;
begin
  sltSub := TStringList.Create;
  slt.BeginUpdate;
  try
    sSearchPath := AddDirSeparator(sRootDir);
    if FindFirst(sSearchPath + "*", faDirectory, srSearch) = 0 then
      repeat
        if ((srSearch.Attr and faDirectory) = faDirectory) and
          (srSearch.Name <> ".") and
          (srSearch.Name <> "..") then
        begin
          slt.Add(sSearchPath + srSearch.Name);
          sltSub.Add(sSearchPath + srSearch.Name);
        end;
      until (FindNext(srSearch) <> 0);

    FindClose(srSearch);

    for i := 0 to sltSub.Count - 1 do
      GetSubDirs(sltSub.Strings[i], slt);
  finally
    slt.EndUpdate;
    FreeAndNil(sltSub);
  end;
end;


 
Elen ©   (2006-09-28 15:41) [8]


> Zeqfreed

в 10 строках можно допустить кучу ошибок. Вообще я компоненты придлагаю как вариант. никто не спорит что лучше будет на API, но мне кажется как раз для новичков сначала проще было-бы не заморачиваться на внутренностях. А вообще это дело вкуса...


 
RainKMM   (2006-09-28 15:45) [9]

Э народ, я помощи прошу, а ви соритесь :(


 
Zeqfreed ©   (2006-09-28 15:48) [10]

> [7] RainKMM   (28.09.06 15:39)


> нашел на delphi world такую процедуру но она ругаэтся на
> AddDirSeparator

Замени на IncludeTrailingPathDelimiter.


> в 10 строках можно допустить кучу ошибок.

Если допускать в 10 строчках кучу ошибок, тогда надо не компоненты брать, а разбираться в ошибках.


 
Elen ©   (2006-09-28 15:49) [11]

Если не ошибаюсь AddDirSeparator добавляет взад директории "\".
Тогда добавь от себя
if sRootDir[length(sRootDir)-1]<>"\" thensRootDir:=sRootDir+"\";
и
sSearchPath := sRootDir;


 
Zeqfreed ©   (2006-09-28 15:54) [12]

> [11] Elen ©   (28.09.06 15:49)


> Тогда добавь от себя
> if sRootDir[length(sRootDir)-1]<>"\" thensRootDir:=sRootDir+"\";

А компилятор ругнется, что, мол, нельзя присваивать значение константам ;)


 
Elen ©   (2006-09-28 15:56) [13]

Так убрать const


 
RainKMM   (2006-09-28 16:07) [14]

Zeqfreed, спасибо помогло, сейчас зазбераюсь как ети пути прописать явно в memo, чтоб потом использовать.


 
RainKMM   (2006-09-28 16:15) [15]

не чето тут явно не чисто. процедуру визиваю:
GetSubDirs("с:\test"; listbox1.items);
программа заходит в процедуру
if FindFirst(sSearchPath + "*", faDirectory, srSearch) = 0 then на етой строке, а потом переходит на обработку FindClose(srSearch); хотя в исходной папке имеются вложение папки.


 
Elen ©   (2006-09-28 16:24) [16]


> RainKMM

Поставь бряк и проверь чему sSearchPath равна


 
RainKMM   (2006-09-28 16:29) [17]

sSearchPath = с:\test\


 
Elen ©   (2006-09-28 16:35) [18]


> RainKMM

Странно у меня все работает. :-\ Точно путь правильный?


 
RainKMM   (2006-09-28 16:37) [19]

Я понял в чем прикол. папка в которой ми ищем должна бить корневой, а не подпапкой в которой есть папки. и ето скажу я вам очень плохо.


 
Elen ©   (2006-09-28 16:43) [20]


> Я понял в чем прикол. папка в которой ми ищем должна бить
> корневой

НЕТ! У меня ищет там где я скажу. Побоку ему вложенность. Иши ошибку дальше


 
RainKMM   (2006-09-28 16:47) [21]

хорошо, учту при тесте


 
MsGuns ©   (2006-09-28 17:23) [22]

>Elen ©   (28.09.06 15:35) [5]
>У меня никогда не было тарблов со сторонними компонентами.

У Вас, очевидно, очень маленький опыт групповой разработки проектов и тем более руководства такой группой.

>Как правило все мои проги содержат чего-то из инета и ни разу не глюкнули на других тачках (если конечно я их четко отлаживаю).

Я бы никогда не купил у Вас программу. Просто интересно, кто у Вас были учителя ?

>Сторонние компоненты - это возможность избавить программистов от рутины. Разве не так?

Нет, причем абсолютно. Бензопилу придумали не для того, чтобы избавиться от лобзика, а чтобы столяр-краснодеревщик не пилил деревья "Дружбой".
Вы тягаете компоненты из Сети только потому, что они Вам ничего не стОят. Если бы Вам пришлось заплатить свои кровные баксов по 10-15 (и это еще сущая ерунда) за каждый прибамбасенный LMDEdit и LMDLabel, я уверен, что кол-во заимствованных компонент в Ваших проектах резко снизилось.
Есть смысл приобретать сторонние компоненты в трех случаях:
1. Имеется экономическая целесообразность. Другими словами, время, сэкономленное на программировании и отладке (особенно) "велосипедов" (хотя в большинстве случаев использования сторонних компонент я считаю этот термин не совсем верным), сопоставимо с их стоимостью.
2. Ваш проект носит "разовый" характер, не подлежит длительному сопровождению другими людьми и даже фирмами. Т.е. действует принцип "Сделал"-"продал"-"забыл".
3. Руководимый Вами коллектив разработчиков будет работать эффективнее если Вы приобретете поддерживаемую  библиотеку компонент.

Из своего сегодняшнего опыта. На заводе, где сейчас обитаю, года 2 назад работал один молодой человек, подобно Вам любитель шаровых, но "красивых" компонент. Сегодня по его программам возникают вопросы (это естественно - время не стоит на месте) и НИ ОДНОГО ПРОЕКТА я не смог скомпиллировать ни под 6, ни под 7 делфей. А все потому, что то одна библиотека (а их там около 10 штук, включая Rx,Eh,LMD,какой-то Eagle и черт еще какие), то другая не хотят "дружить" с версией делфи позднее 5.0

Сколько с ними мороки - можно представить.


 
Плохиш ©   (2006-09-28 17:38) [23]


> Elen ©   (28.09.06 15:49) [11]
> Если не ошибаюсь AddDirSeparator добавляет взад директории
> "\".
> Тогда добавь от себя
> if sRootDir[length(sRootDir)-1]<>"\"

А почему Вы считаете, что обратный слеш должен быть предпоследним символом?


 
Ketmar ©   (2006-09-28 17:45) [24]

>[11] Elen(c) 28-Sep-2006, 15:49
>Тогда добавь от себя
> if sRootDir[length(sRootDir)-1]<>"\"
>then sRootDir:=sRootDir+"\";
хихик. представим, что sRootDir равна "".


 
RainKMM   (2006-09-28 18:29) [25]

все ребята всем спасибо, все получилось


 
Anatoly Podgoretsky ©   (2006-09-28 20:06) [26]


>  LMD - это всего-навсего набор красивых побрякушек, большинство
> из которых не представляют из себя никакой практической
> ценности

Так для кого написан


 
Anatoly Podgoretsky ©   (2006-09-28 20:10) [27]

RainKMM   (28.09.06 18:29) [25]
Сходи ко мне на сайт и возьми ФИДО FAQ в HTML формате, там подробно описано с нюансами.


 
RASkov   (2006-09-29 00:06) [28]

Хоть и автор нашол решение его вопроса, всеже кину на всякий случай кусок кода вырезанный из filectrl.pas (помоему правильно написал) идущий вместе с дельфёй

function SlashSep(const Path, S: String): String;
begin
 if AnsiLastChar(Path)^ <> "\" then
   Result := Path + "\" + S
 else
   Result := Path + S;
end;

function ReadDirectoryNames(const ParentDirectory: string;
 DirectoryList: TStrings): Integer;
var
 Status: Integer;
 SearchRec: TSearchRec;
begin
 Result := 0;
 Status := FindFirst(SlashSep(ParentDirectory, "*.*"), faDirectory, SearchRec);
 try
   while Status = 0 do
   begin
     if (SearchRec.Attr and faDirectory = faDirectory) then
     begin
       if (SearchRec.Name <> ".") and (SearchRec.Name <> "..") then
       begin
         DirectoryList.Add(SearchRec.Name);
         Inc(Result);
       end;
     end;
     Status := FindNext(SearchRec);
   end;
 finally
   FindClose(SearchRec);
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 Caption:=IntToStr(ReadDirectoryNames("C:\Temp\", ListBox1.Items));
end;


И вопрос задам, если можно, кто из предков ComboBox ловит сообщение CB_DIR
SendMessage(ComboBox1.Handle, CB_DIR, DDL_DIRECTORY, LParam(PChar("C:\*"))); - сюда даходят

SendMessage(ListBox1.Handle, CB_DIR, DDL_DIRECTORY, LParam(PChar("C:\*"))); - а сюда нет


 
ASoft   (2006-09-29 06:24) [29]


> MsGuns ©   (28.09.06 17:23) [22]

отчасти, согласен, так как, однажды, наступил на собственные грабли:
пришлось модернизировать свою прогу на девственно-чистом Delphi, где небыло никаких сторонних компонентов. Пришлось убить всякие LMD (которые я когда-то на радостях от приобретения впихнул в программу) из кода и писать все, чуть ли не с нуля :-)
<сорри, если офтоп>


 
Elen ©   (2006-09-29 07:50) [30]


> MsGuns

Все это верно сказано, пожелайте мне удачи не наступать на такие грабли как было у Вас, Господа!. Я использую компоненты в программах, не для продажи, а для внутренних целей предприятия. Слава богу этого пока хватает и не было еще особых проблем с перестройкой и модернизацией моих программ, т.к. на делфи у нас програмлю только я. У меня действительно ло " маленький опыт групповой разработки проектов и тем более руководства такой группой",


> представим, что sRootDir равна "".

Тогда надо добавить проверку на пусто


> Anatoly Podgoretsky ©   (28.09.06 20:06) [26]
>
>
> >  LMD - это всего-навсего набор красивых побрякушек, большинство
>
> > из которых не представляют из себя никакой практической
>
> > ценности
>
> Так для кого написан

Написан как раз для одиночных разработок - такими как раз я и занимаюсь, поэтому мне удобнее так.
Господа я уважаю Ваш огромный опыт и, поверте, нисколько с ним не спорю - я лиш предлагаю возможные варианты от простого к сложному. Не думаю что новичкам с подобными вопросами нужно отбрасывать такую возможность как компоненты, в начале разработки они помагают как мне кажется определить цель работы и желаемый результат достыточно быстро и при этом естесственно при последующем апгрейде программы как можно белюше заменить стороннего на свое.

По этому поводу Всем мой глубокий Respect!!!


 
Elen ©   (2006-09-29 07:52) [31]


> А почему Вы считаете, что обратный слеш должен быть предпоследним
> символом?

Упс... Конечно же последним :-)


 
Elen ©   (2006-09-29 07:54) [32]


> И вопрос задам, если можно, кто из предков ComboBox ловит
> сообщение CB_DIR
> SendMessage(ComboBox1.Handle, CB_DIR, DDL_DIRECTORY, LParam(PChar("C:
> \*"))); - сюда даходят
>
> SendMessage(ListBox1.Handle, CB_DIR, DDL_DIRECTORY, LParam(PChar("C:
> \*"))); - а сюда нет

А сюда кажись надо LB_DIR (ListBox_Dir)


 
RASkov   (2006-09-29 23:34) [33]

> [32] Elen ©   (29.09.06 07:54)

И в самом деле...
>....
Тады можно и так вопрос решить - АПИ и строк меньше.
с учетом заполнения подкаталогов в ListBox

procedure GetSubDirs(const Path: String; LB: TListBox);
begin
LB.Clear;
SendMessage(LB.Handle, LB_DIR, DDL_DIRECTORY or DDL_EXCLUSIVE, LParam(PChar(Path+"\*")));
end;

procedure TForm1.Button1Click(...);
begn
 GetSubDirs("C:\Windows", ListBox1);
end;


Не пробовал, поверил на слово:) мож чё Path в процедырке подправить надо будет...
ЗЫ Ну не у всех конэчна вында на Ц стаит в папке "окна"


 
RASkov   (2006-09-29 23:38) [34]

блин, ... процедурке... :)
сначало постим потом читаем
семь раз прочти, а потом запость © Новая пословица
зато так прикольно получается... если наоборот.



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2006.10.15;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.54 MB
Время: 0.045 c
1-1157127682
gear
2006-09-01 20:21
2006.10.15
Как сделать чтобы открытое PopupMenu не закрывалось при смене...


3-1155561816
Alex'
2006-08-14 17:23
2006.10.15
Где Cascade Update в ORACLE 10g


2-1159428483
memo
2006-09-28 11:28
2006.10.15
DLLCHILD...


2-1159176559
mfender
2006-09-25 13:29
2006.10.15
AccesViolation в XML


2-1159271382
Андрей Иванов
2006-09-26 15:49
2006.10.15
базы данных





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский