Форум: "Потрепаться";
Текущий архив: 2003.01.27;
Скачать: [xml.tar.bz2];
Вниз
Копаясь в примерах нашел такой кусок кода. Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.01 c