Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.10.15;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.042 c
15-1158777078
ArtemESC
2006-09-20 22:31
2006.10.15
BC_31, как откомпилить следующее...


2-1159193921
root
2006-09-25 18:18
2006.10.15
Нужна помощ!!!!


3-1155275966
rebroff
2006-08-11 09:59
2006.10.15
Загрузка фото из файла в blob-поле в run-time


15-1159026946
Alx2
2006-09-23 19:55
2006.10.15
"Раздумья ездового волка"


1-1157041266
Max.66RUS
2006-08-31 20:21
2006.10.15
Вопрос по сохранению имени и пароля....