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

Вниз

Копаясь в примерах нашел такой кусок кода.   Найти похожие ветки 

 
kronprince ©   (2003-01-10 20:17) [0]


if FindFirst(Edit1.Text, FileAttrs, sr) = 0 then
begin
with StringGrid1 do
begin

Кто знает - зачем нужно следующее сравнение - ведь мы и так ищем FileAttrs ???

if (sr.Attr and FileAttrs) = sr.Attr then
begin
Cells[1,RowCount-1] := sr.Name;
Cells[2,RowCount-1] := IntToStr(sr.Size);
end;
while FindNext(sr) = 0 do
begin
if (sr.Attr and FileAttrs) = sr.Attr then
begin
RowCount := RowCount + 1;
Cells[1, RowCount-1] := sr.Name;

Cells[2, RowCount-1] := IntToStr(sr.Size);
end;
end;
FindClose(sr);
end;
end;


 
Maximator Vetera ©   (2003-01-10 20:34) [1]

Кто первым нашел с того и спрос.


 
kronprince ©   (2003-01-10 20:44) [2]

2Maximator © (10.01.03 20:34)
Так нечесно :-\


 
Anatoly Podgoretsky ©   (2003-01-10 20:48) [3]

мы ищем не FileAttrs, а Edit1.Text, и указываем какие нас аттрибуты в дополнение интересуют.


 
kronprince ©   (2003-01-10 20:57) [4]

2Anatoly Podgoretsky © (10.01.03 20:48)
Извините - надо было написать вот так :
не ищем FileAttrs ??? а ищем имя файла - атрибуты которого входят в множество атрибутов заданных в FileAttrs с маской имени файла заданной в Edit1.Text

Ну зачем же так придираться :(

Я про то что после FindFirst()=0 и так (TSearchRec.Attr and FileAttrs) = TSearchRec.Attr ведь FileAttrs никто же не менял.


 
Сатир ©   (2003-01-10 21:09) [5]

а может злой жук закрался в алгоритм или банальная очепятка?


 
Anatoly Podgoretsky ©   (2003-01-10 21:10) [6]

Придирки нет и смысл совсем жругой, чем у тебя
Пример пусть
FileAttrs = 0110,
1. получено 0101
2. получено 0111

Только вариант 2 сработает, а вариант 1 нет
Зачем это нужно в примере не знаю, обычно интересует только faDirectory для выполнения рекурсивных обращений или фильтрации каталогов, реже другии.


 
Anatoly Podgoretsky ©   (2003-01-10 21:21) [7]

Поправка, все четыре возможных варианта

1. получено 0000
2. получено 0010
3. получено 0100
4. получено 0110


 
kronprince ©   (2003-01-10 21:30) [8]

2Anatoly Podgoretsky © (10.01.03 21:21)
Анатолий вот смотрите:
FileAttrs := 0110;
получили
TSearchRec.Attr = 0100;
(TSearchRec.Attr and FileAttrs) = (0100 & 0110) = 0100;
т.е. получается что условие
if (sr.Attr and FileAttrs) = sr.Attr then
будет срабатывать всегда - тогда зачем лишняя проверка ???

ЗЫ: Пример взят > F1(FindFirst) > Example


 
Anatoly Podgoretsky ©   (2003-01-10 21:36) [9]

Не условия не выполнится, так как 0100 <> 0110


 
TTCustomDelphiMaster ©   (2003-01-10 21:48) [10]

Anatoly Podgoretsky © (10.01.03 21:36)
0100 and 0110 <> 0100 ?


 
Юрий Зотов ©   (2003-01-10 21:49) [11]

> kronprince

Во-первых, пример этот оставляет желать лучшего. Любое исключение - и FindClose вызвана не будет. Здравствуй, утечка памяти. Лучше было бы так:

if FindFirst(..) = 0 then
try
repeat
... // Наши действия
until FindNext(..) <> 0
finally
FindClose(..)
end;

Во-вторых, проверка
if A and B = B
это обычная проверка по маске. То есть, проверка, того сброшен ли в A хоть один бит из тех, что установлены в B. Стандартная вещь. Рапишите A и B в двоичном коде и проведите эту проверку вручную - сразу все увидите.



Страницы: 1 вся ветка

Текущий архив: 2003.01.27;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.021 c
1-86901
Vladk
2003-01-16 13:07
2003.01.27
нажатие


7-87164
Sergey_MV
2002-11-15 09:25
2003.01.27
Количество распечатанных листов на принтере


1-86785
ol
2003-01-16 08:57
2003.01.27
Цвет кнопки


7-87163
BJValentine
2002-11-14 17:42
2003.01.27
Ура COM приложению


6-87011
sen
2002-11-27 16:01
2003.01.27
Сокеты в Делфи