Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.05.2007, 23:21   #1
CoreFox
 
Аватар для CoreFox
 
Регистрация: 22.05.2007
Сообщений: 3
По умолчанию Поиск По маске

Только недавно начал учить Delphi , вот так и немогу понять как поставить маску *.jpg ,*.gif ,*.jpeg и тд каждый раз копировать и заменять Маску поиска '*.jpg' мне кажется глупо ..



var
searchResult : TSearchRec;
f:integer;

begin
memo1.Clear;
if FindFirst('*.jpg' , faAnyFile, searchResult) = 0 then
begin
repeat
memo1.Lines.Add (String (''+searchResult.Name));//имя файла который нашли
until FindNext(searchResult) <> 0;
FindClose(searchResult);

f:=Form1.Memo1.Lines.Count;//щитаем строки
edit1.text:=IntToStr (f);// 1 Строка = 1 файл .Так узнаем сколько нашли

end;

Последний раз редактировалось CoreFox; 22.05.2007 в 23:32.
CoreFox вне форума Ответить с цитированием
Старый 22.05.2007, 23:32   #2
Alar
Александр
Администратор
 
Аватар для Alar
 
Регистрация: 28.10.2006
Сообщений: 17,501
По умолчанию

(FindFirst('*.jpg' , faAnyFile, searchResult) = 0)or(FindFirst('*.gif' , faAnyFile, searchResult) = 0)

then

и т.д.

То есть нужно использовать логические операторы.
Alar вне форума Ответить с цитированием
Старый 22.05.2007, 23:44   #3
CoreFox
 
Аватар для CoreFox
 
Регистрация: 22.05.2007
Сообщений: 3
По умолчанию

Цитата:
Сообщение от Alar Посмотреть сообщение
(FindFirst('*.jpg' , faAnyFile, searchResult) = 0)or(FindFirst('*.gif' , faAnyFile, searchResult) = 0)

then

и т.д.

То есть нужно использовать логические операторы.

Большое спасибо
CoreFox вне форума Ответить с цитированием
Старый 21.02.2008, 12:51   #4
mrandrey
Форумчанин
 
Регистрация: 30.03.2007
Сообщений: 124
По умолчанию

мужики помогите кто может

вот написал:
Код:
procedure TForm1.FormCreate(Sender: TObject);
var r:TSearchRec;
begin
lb.Clear;
SetCurrentDir('d:\');
if((FindFirst('*.m3u',faAnyFile,r)=0)or(FindFirst('*.doc',faAnyFile,r)=0))then
 repeat
  lb.items.Add(r.Name);
 until(FindNext(r)<>0);
FindClose(r);
end;
а он ищет только m3u файлы что не так?
Тут без 100г не розберешся.....
Спасибо не нужно, а на весы слева кликнуть не помешает!!!
mrandrey вне форума Ответить с цитированием
Старый 21.02.2008, 13:09   #5
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Во первых короткое вычисление булевых выражений - второе выражение не вычисляется. Во вторых FindFirst инициализирует R.

Не проще сделать отдельную функцию ?:

Код:
procedure findByMask(mask:String; items:TStrings);
begin
   if FindFirst(mask,faAnyFile,r) ...
end;

findByMask('*.m3u', Items);
findByMask('*.doc', Items);
alexBlack вне форума Ответить с цитированием
Старый 21.02.2008, 13:27   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
mrandrey
А может лучше делать по маске *.*, но проверять на нужное расширение уже в твоей проге?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.02.2008, 13:36   #7
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

НЕЛЬЗЯ здесь использовать логические операторы по двум причинам минимум:
1. Оптимизация вычислений логических выражений. Если мы определяем, чему равно выражение (X1 or X2) и X1 - истинно, то значение X2 вычисляться не будет, т.е. в данном случае FindFirst не будет вызвана второй раз.
2. все разновидности функции findfirst возвращают объект, который в дальнейшем используется функцией findnext, соответсвенно, если мы вызовем findfirst десять раз подряд, значение будет иметь только последний вызов.

В данном случае нужно вызывать findfirst для каждого расширения отдельно и пользоваться в дальнейшем группами findnext для каждого возвращенного разными findfirst хэндлами по отдельности.
B_N вне форума Ответить с цитированием
Старый 21.02.2008, 13:45   #8
mrandrey
Форумчанин
 
Регистрация: 30.03.2007
Сообщений: 124
По умолчанию

значит Alar бред советует, и если мне нужно найти файлы с неколькими розрешениями, прибется либо несколько раз либо проверять вручную?!!!
херово получается! Но все равно спасибо!
Тут без 100г не розберешся.....
Спасибо не нужно, а на весы слева кликнуть не помешает!!!
mrandrey вне форума Ответить с цитированием
Старый 21.02.2008, 14:26   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
значит Alar бред советует
Не совсем бред. Если не ошибаюсь отключение оптимизации для этого действия поможет ему выполняться так как ты хочеш,но все равно прислушайся к советам Бьена, он постом выше правильно сказал, посему если так делать то открывать два разных поиска.
I'm learning to live...

Последний раз редактировалось Stilet; 21.02.2008 в 14:36.
Stilet вне форума Ответить с цитированием
Старый 21.02.2008, 15:21   #10
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
Восклицание Как это делал я

Использвать для сравнения найденного пути, строк.
Здесь: S - сравниваемая строка, Lst - Массив масок;
Если True значит есть совпадения.

Код:
Uses Masks;
..................
Function TForm1.FileInMask(S :String; Lst :TStrings):Boolean;
Var I, II :LongInt;
begin//Проверка файла на наличие его в списке Маск поиска
 Result := False;
 IF Length(S)<=0 Then Exit;
   II := Lst.Count;
 IF II>0 Then
 For I:=0 To II - 1 DO
 begin
  Application.ProcessMessages();
  IF MatchesMask(S, Lst[I]) Then // Если соответствует маске, выходим
  begin
   Result := True;
   Break;
  end;
 end;
end;
..........................
___________________________________ ______________________________
Как видите не так сложно, ищет быстро.

Последний раз редактировалось Alter; 21.02.2008 в 15:23.
Alter вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск по "маске" Родион БД в Delphi 2 16.06.2008 07:33
Как удалить из строки подстроку по маске ? - fenix - Помощь студентам 4 23.04.2008 15:04
Найти окно по маске Иллидан Общие вопросы Delphi 2 28.02.2008 01:06
Поиск MAKEDON Общие вопросы Delphi 2 22.02.2008 22:47
Замена по маске Drain Общие вопросы Delphi 1 14.02.2008 16:08