Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.024 c
1-86829
trotski
2003-01-16 17:59
2003.01.27
array of shortint


6-87004
Eugene_Popov
2002-11-30 10:59
2003.01.27
найти машину в сети


14-87062
Supreme
2003-01-05 20:44
2003.01.27
Vopros k LINUXOIDAM


3-86685
Nil
2003-01-08 12:07
2003.01.27
Помогите пожалуста правильно написать SQL-запрос !


9-86614
Hub
2002-06-21 13:07
2003.01.27
Деньги




   Наверх