Текущий архив: 2003.10.27;
Скачать: CL | DM;
Вниз
Перестал ловиться глюк! Найти похожие ветки
← →
TUser (2003-10-16 09:18) [0]Писал вчера функцию, которая должна Выводить в TreeView дерево каталогов и сохраненных web страниц. Код абсолютно классический для тиках случаев
function AddToTree(n:TTreeNode, startDir:string):boolean;
var // объявим какие-то переменные
res:boolean; SRes:TSearchResult;
begin
workDir:=TreeView1.AddChild(n,startDir);
res:=false;
if FindFirst(...)=0 then begin
repeat
if SRes.Attr=16 {нашли папку} then res:=res or AddToTree(workDir, SRes.Name)
else begin
//Если файл имеет нужное нам расширение, добавляем его
//и ставим res:=true;
end;
until FindNext(...)<>0;
end;
FindClose(SRes);
if not res {если так ничего и не нашли} then //удаляем workDir
AddToTree:=res; // Если что-то есть, вернем true
end;
Т.е. функция возварщает true, если что-то найдено. Для всех подпапок рекурсивно вызываем самоё себя, поэтому true вернется, если что-то есть в папке и ееподпапках.
Все вроде правильно, но появился странный глюк - если в исходной папке больше, чем обда подпапка, то рекурсивоный вызов выполняется только для первой из них. Для остальных AddToTree не вызывается, хотя SRes.Attr=faDirectory. Сразу говорю - это не есть свойство конкретной папки.
Короче я писал по-азному, в конце концов заменил
if SRes.Attr=16 {нашли папку} then res:=res or AddToTree(workDir, SRes.Name)
else ...
на
if SRes.Attr=16 {нашли папку} then
begnin if AddToTree(workDir, SRes.Name) then res:=true; end
else ...
И все у меня заработало, хотя ведь я написал то же самое, только другими словами. Почему?
← →
MBo (2003-10-16 09:25) [1]>if SRes.Attr=16
Это неправильно. Надо
if (SRes.Attr and faDirectory)= faDirectory
пример есть в FAQ
← →
TUser (2003-10-16 09:32) [2]Примеров много. Я менял код по-разному, так тоже пробовал - глюк ловится. В вопросе я привел тот код, который у меня был перед исправлением глюка. Можно еще и (SRes.Attr and faDirectory)>0 поставить - но с тем же результатом. Можно еще что-то придумать.
Ведь faDirectory=16, это константа.
Я-то заменил только операор присвоения
res:=res or AddToTree
на begin if ... end
Тут всего 4 варианта
1. res=true, AddToTree=true --> res:=true;
2. res=true, AddToTree=false --> res:=true;
1. res=false, AddToTree=true --> res:=true;
1. res=false, AddToTree=false --> res:=true;
Результат, кажется, должен быть одинковым в любом случае. Так почему прога ведет себя по-разному.
← →
default (2003-10-16 09:38) [3]TUser © (16.10.03 09:32) [2]
и что, что faDirectory константа?в SRes.Attr могут быть "заложены" биты и других констант, это по-любому неправильно
← →
MBo (2003-10-16 09:39) [4]>Можно еще и (SRes.Attr and faDirectory)>0 поставить
Да, можно
>Ведь faDirectory=16, это константа.
>SRes.Attr=16
Так делать нельзя принципиально!!!
workdir - глобальная?
← →
Verg (2003-10-16 09:43) [5]
> Для остальных AddToTree не вызывается, хотя SRes.Attr=faDirectory.
> Сразу говорю - это не есть свойство конкретной папки.
Все очень просто:
res:=res or AddToTree(workDir, SRes.Name)
Если res уже true, то код не быде выполнять AddToTree, так как решит, что при операции or занчение этой ф-ции уже не играет никакой роли.
Complete boolean eval - о чем-то тебе говорит?
← →
TUser (2003-10-16 09:45) [6]
> workdir - глобальная?
Нет
Страницы: 1 вся ветка
Текущий архив: 2003.10.27;
Скачать: CL | DM;
Память: 0.46 MB
Время: 0.016 c