Текущий архив: 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)
И в самом деле...
>....
Тады можно и так вопрос решить - АПИ и строк меньше.
с учетом заполнения подкаталогов в ListBoxprocedure 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.54 MB
Время: 0.041 c