Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.48 MB
Время: 0.029 c
1-89285
User_OKA
2003-10-14 10:24
2003.10.27
Api или TRegistry


8-89405
CiD
2003-06-26 08:27
2003.10.27
текст на TBitmap невыводится . . .


1-89200
Ал
2003-10-16 11:02
2003.10.27
Программа вызывает ошибку Explorer-а


14-89537
stone
2003-10-08 15:14
2003.10.27
Клавиша Shift снимет защиту от копирования CD :)


1-89341
Star
2003-10-16 02:59
2003.10.27
Вопрос по RichEdit-у...