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

Вниз

Перестал ловиться глюк!   Найти похожие ветки 

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.011 c
1-89335
killer
2003-10-16 12:52
2003.10.27
PopupMenu


1-89326
GreySerg
2003-10-16 15:20
2003.10.27
Как сделать , чтобы прога была только в tray при её загрузке ?


1-89355
TUser
2003-10-16 09:18
2003.10.27
Перестал ловиться глюк!


6-89444
Mear
2003-08-30 00:13
2003.10.27
Интеграция в Outlook или Bat...


1-89360
hedgehock
2003-10-16 07:07
2003.10.27
Не могу поставить защиту на лист в Excel





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский