FindFirst — Функция Delphi


FindFirst — Функция Delphi

Описание
Функция используется в цепочке FindFirst — FindNext — FindClose для повторного поиска файла. Первый поиск осуществляется с помощью функции FindFirst. Функция FindNext возвращает следующий найденный файл, удовлетворяющий условиям поиска определенным при вызове функции FindFirst. В случае успешного выполнения, функция FindNext возвращает 0, а в случае возникновения ошибки — код ошибки Windows. По окончанию поиска необходимо высвободить память с помощью функции FindClose.

FindFirst — Функция Delphi

Описание
Функция находит файл с набором атрибутов Attr в каталоге и по маске, определенных константой Path. Найденное имя файла записывается в переменную F. Если указанный файл найден, то функция возвращает 0, иначе возвращается код ошибки Windows. Параметр Attr — комбинация нескольких констант атрибутов файла или их значений. Константа Path представляет собой полный путь с маской файла (например, ‘C:\MYDIR\*.ini’ ). Повторный поиск файла производится с помощью функции FindNext. По окончанию поиска необходимо высвободить память, выделенную при вызове функции FindFirst, с помощью процедуры FindClose.

Delphi

КОМПЬЮТЕРНЫЕ КУРСЫ «ПОИСК»

Поиск файлов

При поиске файлов с помощью Delphi используется запись TSearchRec и следующие три функции: FindFirst, FindNext и FindClose. Запись TSearchRec и три функции объявлены в модуле SysUtils.

Чтобы начать поиск каталога, вы должны вызвать функцию FindFirst:

function FindFirst(const Path: string; Attr: Integer; var F: TSearchRec): Integer;

При вызове функции FindFirst для начала поиска файлов вы должны передать в параметре Path как путь к каталогу, так и маску файлов. Следовательно, если необходимо найти все текстовые файлы в корневом каталоге диска С. укажите С:\*.txt в параметре Path.

Параметр Attr позволяет искать дополнительные типы файлов — системные файлы, скрытые файлы и тому подобные. В качестве параметра Attr могут быть переданы следующие константы, которые также объявлены в модуле SysUtils: faReadOnly, faHidden, faSysFile, faDirectory, faArchive и faAnyFile. Существует также константа faVolumelD, но она нигде не является важной и обозначена как неиспользуемая.

При вызове функций FindFirst и FindNext в качестве параметра F необходимо передавать переменную TSearchRec. Обе функции хранят результаты поиска в параметре F, и обе возвращают 0, если файл был найден, или флаг ошибки, не равный 0, если подходящих файлов найдено не было.

Если функция FindFirst возвращает 0, вы можете вызвать функцию FindNext в цикле, чтобы попробовать найти другие файлы, совпадающие с критерием поиска.

В конце следует вызвать функцию FindClose, чтобы освободить память, занимаемую функцией FindFirst:

procedure FindClose (var F: TSearchRec);

В листинге ниже показано, как производится поиск всех файлов в корневом каталоге диска С.

Перечисление доступных устройств

Перечислить доступные устройства можно с помощью API-функции GetLogicalDrives или API-функции GetDriveType (обе функции объявлены в модуле Windows).
Функция GetLogicalDrives является очень простой, поскольку она не принимает никаких параметров;

function GetLogicalDrives: DWORD; stdcall;

Эта функция имеет серьезный недостаток: необходимо знать о том, как проверить, что определенный бит в результирующем значении включен или выключен. Она возвращает битовую маску, в которой бит в позиции 0 представляет устройство А, бит в позиции 1 — устройство В и так далее.

Процедура EnumerateDrives демонстрирует использование функции GetLogicalDrives для перечисления доступных устройств.

Код для перечисления доступных устройств будет более понятен, если использовать функцию GetDriveType. Функция GetDriveType служит для определения, является ли устройство фиксированным, съемным или другим, однако ее можно использовать и для перечисления устройств.

Функция GetDriveType принимает указатель на строку с завершающим нулем, содержащую корневой каталог диска, который требуется проверить. Строка, содержащая корневой каталог, должна включать символ обратной косой черты, например, х:\.

function GetDriveType(lpRootPathName: PChar): UINT; stdcall;

В случае успешного выполнения эта функция возвращает одну из констант, перечисленных ниже.

Результаты выполнения функции GetDriveType

Константа Описание
DRIVE_UNKNOWN Неизвестный тип устройства.
DRIVE_NO_ROOT_DIR Корневой каталог не существует.
DRIVE_REMOVAELE Устройство является съемным.
DRIVE_FIXED Устройство является фиксированным.
DRIVE_REMOTE Устройство является сетевым диском.
DRIVE_CDROM Устройство является приводом CD-ROM.
DRIVE_RAMDISK Устройство является виртуальным диском (RAM-диском).

Процедура EnumerateDrives2 в листинге ниже демонстрирует использование функции GetDriveType для перечисления доступных устройств.

В заключение, можно создать простой обозреватель каталогов, добавив в окно Designer Surface (Окно конструктора) компонент TComboBox, и добавив в него доступные устройства в событии OnCreate формы.

Вам придется также присвоить свойству Style компонента TComboBox значение csDropDownList, чтобы пользователь мог выбирать только существующие элементы, и написать обработчик события для его события OnChange, чтобы просматривать корневой каталог выбранного диска:

Источник: Иван Хладни — Внутренний мир Borland Delphi 2006.

FindFirst — Функция Delphi

The Attributes define files to search for in addition to regular files.

If a match is found, then the return value is 0, otherwise, it is negative (and the result record is not filled in).

The FileMask may contain a path, as well as a file name. The file name may contain wild cards:

? : Match any one character
* : Match 0, 1 or more characters

The Attributes may be set as follows:

faAnyFile : Any file
faReadOnly : Read-only files
faHidden : Hidden files
faSysFile : System files
faVolumeID : Volume ID files
faDirectory : Directory files
faArchive : Archive files

You may set Attributes from one or more of the above by concatenating them.

The SearchResult record comprises many fields. Some are used by subsequent calls to FindNext. Others are available to your program :

Name : Of the long name of the file found
Size : The size of the file in bytes
Time : Last modified date/time of the file
Attr : The file attributes (as above)
Notes Warning : you must call FindClose after a successful FindFirst when you have finished searching (finished calling FindNext). This frees up resources held by the find process (such as the SearchResult record).

If the FileMask contains no path information, then the search is in the current directory.

Delphi — нить и функция FindFirst

Я сталкиваюсь с большой проблемой, когда я пытаюсь сделать рекурсивную функцию поиска внутри потока (с помощью DELPHI 7) ниже является кодом:

ок, вероятно, код не является немного перепутались, но я не понимаю, почему нить заканчивается на «FindFirst» часть . я гугле его, ничего не найдено.

любая помощь будет оценен по достоинству!

В вашем публикуемом коде , который я вижу , что вы попробуйте поймать и забыть исключение. Когда вы нарушили код , который содержит что — то подобное, самое первое , что я делаю , это удалить пустые , за исключением блока. Разногласия , которые не знают , что происходит , потому что ваши метания вам информацию прочь.

У вас есть два вызова FindFirst() в коде. Использование того , где вы пытаетесь найти каталог подозреваемый. Я хотел бы изменить свой код , чтобы что — то вроде этого.

Тогда вы увидите причину FindFirst() Failed.

Вместо того , чтобы использовать FindFirst() в том случае , если ваш ищет каталог , я бы использовать DirectoryExists() вызов вместо.

Программный поиск файлов на Delphi (исходники)

В этом уроке мы с вами ознакомимся с основными принципами программной организации поиска файлов. Для начала определимся, зачем нам это может быть нужно. Например, вам нужно при запуске программы на выполнение просканировать определенный каталог на присутствие DOC файлов, и при наличии таковых открыть их на редактирование или напечатать. А как вам такая идея: фоновый поиск EXE файла в сети, и при обнаружении новой версии, автоматическое обновление.

Многим известны программы, где можно искать файлы, правила поиска файла. Файлы можно искать как с файловых командирах (нортон, волков, дос навигатор, фар), так в любой операционной системе. В операционной системе windows диалоговое окно поиска файла вызывается «Пуск» — «Поиск» — «Файлы и папки». В открывшимся окне необходимо задать условие искомого файла (название, маска) и путь начального поиска (каталог). На других вкладках этого диалогового окна можно расширить возможности поиска по дате изменения, по содержащемуся тексту, по размеру.

Вспомним правила поиска файлов. Вы можете задать как имя искомого файла, так и его маску, если название неизвестно или необходимо найти несколько. Т.е. применяя специальный шаблон поиска, вы можете организовать условия выборки найденных файлов. Сразу оговорюсь, что поиск можно применять как к файлам, так и к каталогам. Будем их называть элементами файловой системы. В шаблон маски искомых элементов может входить:

  1. Буквы и цифры в названии и расширении.
  2. Символ * (звездочка, математический знак «умножить»), заменяющий любое количество всевозможных букв и цифр в названии или расширении.
  3. Символ ? (знак вопроса), заменяющий одну букву или цифру в названии или расширении искомого элемента.

Например, вы ищите все текстовые файлы с расширением TXT. В поле имени искомого файла вам нужно ввести «*.TXT» (пишется без кавычек) и система найдет все такие файлы в указанном диске или каталоге. Если вам надо найти все файлы с названием semen, то в поле поиска файла нужно ввести «semen.*». Если вам нужно найти элементы с третьей буквой k и с первой буквой t в расширении, то вводите «??k*.t*». Здесь знак вопроса указывает на любой символ, третьим символом по порядку идет буква k, далее название файла (каталога) может состоять из любого количества букв и цифр, указываем звездочку. В расширении первая буква t, дальше следует любое расширение.
Примечание: файлы и каталоги в операционной системе windows ищутся без учета регистра, т.е. строчние и прописные буквы не различаются.

Теперь рассмотрим программный поиск файлов с помощью языка программирования object pascal.

Вся организация цикла поиска, а именно это и есть цикл с продолжением поиска, сводится к:

  1. Задание условий поиска. Это каталог и маска искомого элемента или элементов, атрибуты элемента(ов). При задании условий поиска сразу происходит поиск первого подходящего под условие. Это функция FindFirst.
  2. Продолжение поиска следующего элемента по заданным в первом пункте условиям. Это функция FindNext и она может вызываться сколько угодно раз, пока все файлы и каталоги, удовлетворяющие условию, не будут найдены.
  3. Закрытие поиска и освобождение памяти, выделяемую системой под поиск. Команда FindClose.

Функция FindFirst

где: Каталог для поиска и маска искомого элемента — строковая величина, имеющая тип String, может, например, содержать ‘c:\*.*’ — все элементы в корне диска С. Обратите внимание, что указывается полный путь для поиска.

Атрибуты искомого элемента это пользовательские или системные атрибуты, которые может иметь файл (каталог, метка диска). Вот их перечень:

  • faReadOnly — Файлы «только чтение». Такой атрибут устанавливается на файлы, которые не рекомендовано изменять, удалять. Такой атрибут имеют файлы, например, записанные на компакт-дисках.
  • faHidden — Скрытые файлы. При обычных установках браузера и командира эти файлы невидимы.
  • faSysFile — Системные файлы.
  • faVolumeID — Файл метки диска. Такой элемент в своем имени имеет название диска (максимум 11 символов).
  • faDirectory — Атрибут признака каталога.
  • faArchive — Обычный файл. По умолчанию устанавливается на заново создаваемых файлах.
  • faAnyFile — Если установить в качестве атрибута искомых элементов, то будет произведен поиск по всем вышесказанным атрибутам.

Если вам нужно искать только элементы, имеющие атрибут «каталог» и «скрытый», то можно применить знак математического сложения, например faDirectory + faHidden.

Поисковая переменная имеет тип TSearchRec. В нее, при успешном результате поиска, будет занесены все необходимые данные о найденном файловом элементе.

Поскольку FindFirst является функцией, то она должна сама возвращать некоторое значение. Это значение имеет тип Integer и означает результат поиска файла (код ошибки поиска). Если файл найден, то принимает нулевое значение.

Функция FindNext

Эта функция продолжает поиск, заданный в функции FindNext. Возвращает значение результата поиска (нулевое в случае успешного поиска).

Процедура FindClose

Закрывает поиск и освобождает память, выделенную системой под поиск.

Теперь рассмотрим пример. Допустим, нам надо найти все файлы и каталоги в каталоге DELPHI, находящийся на диске C:. В дальнейшем, вы можете самостоятельно, изменяя маску, менять условия поиска. Для формы с компонентом ListBox1 и кнопкой Button1 реакция на OnClick по кнопке:

Представленный пример кода, в принципе, является основой для организации более углубленного поиска, поиска файлов по времени создания, по содержащимся словам. Если вы запустите эту программу на выполнение, то при нажатии на кнопку Button1 вы увидите в списке в первой и второй строке элементы «.» и «..». Это элементы, имеющие атрибут «каталог». Первый содержит связь с корневым каталогом диска, второй содержит связь к каталогом верхнего уровня. Со вторым вы встречаетесь в дисковых командных оболочках, например нортон, когда выбираете каталог «..» и нажимаете на «ввод». Тем самым вы попадаете в каталог на уровень выше. Естественно, в нашей поисковой программе такие элементы не надо вносить в список, поэтому мы игнорируем их нахождение. Исправляем процедуру нажатия на кнопку Button1:

В этом случае, при нахождении каталога с именем «.» или с именем «..» программа продолжит обработку цикла поиска без вывода найденного имени элемента в компонент списка ListBox1.

Теперь рассмотрим тип TSearchRec. Он имеет в себе несколько полезных свойств:

  • Name — название найденного каталога (файла);
  • Size — размер файла в байтах;
  • Attr — атрибуты каталога (файла);
  • Time — упакованное значение времени и даты создания каталога (файла).

Все вышеперечисленные свойства мы уже рассмотрели или они понятны сразу, за исключением свойства Time. Оно имеет тип Integer и содержит в себе упакованное значение даты и времени создания файла. Распаковка производится с помощью функции FileDateToDateTime, которая в результате возвращает значение даты и времени.
Теперь добавим в нашу форму компонент DateTimePicher1 (страница Win32) и допишем несколько строк.

Как вы уже заметили, мы отбираем файлы и каталоги по дате создания, начиная с указанной в компоненте DateTimePicker1.

Теперь попробуем организовать поиск файлов во всех вложенных каталогах. Это не так просто, как может показаться на первый взгляд. Нам придется вручную организовывать весь цикл входа-выхода из каталога, перебор файлов. Немного сложноватый материал, но возможно те из вас, кто уже работал с языком программирования pascal или другим, знакомы с технологией многократности и многовложенности использования одного и того же программного кода. Коротко объясню алгоритм работы такой программы.

  1. Задание начальных условий поиска, поиск первого элемента.
  2. Если найден файл, то выводим его и соответственно обрабатываем (выводим в список, открываем, удаляем и т.п.).
  3. Если найден каталог, то начинаем новую процедуру поиска. Но программный код остается прежним. Мы просто заново вызываем и входим в эту же процедуру поиска.
  4. Обрабатываем таким же образом все вложенные в этот каталог файлы и каталоги (начинаем новый поиск в обнаруженном каталоге).
  5. Если элементов во вложенном каталоге больше нет, то обработка процедуры поиска в нем завершается, и мы выходим из нее. При этом мы оказываемся в том же месте, откуда и вызвали эту процедуру. Но она была вызвана из этой же процедуры. Поэтому программа продолжает свое выполнение дальше с момента возврата.

Таким образом, сколько витков программа наматывает на так называемый клубок, столько витков она и размотает. Программа на выполнении проходит все дерево вложенных каталогов, выполняя один и тот же кусок программного кода! И при этом данные условий поиска не перепутываются, и для каждой уникальной процедуры они сохраняются.

Рассмотрим пример. Создайте новый проект. Для создания отдельной процедуры поиска нам нужно объявить ее в соответствующем разделе (создаем ее вручную, поэтому и самостоятельно объявляем).

В разделе public пишем строку:

А в разделе кода программы, до слова «end.» вставляем пустой каркас процедуры

На форму вставляем компонент списка ListBox1, Button1, Edit1. Для компонента Edit1 свойство Text устанавливаем в «c:\delphi\». Обратите внимание на последний символ, знак «\», присутствие которого в начальном пути поиска обязательно. Дальше процедура OnClick для кнопки Button1 выглядит следующим образом:

Созданная нами вручную процедура поиска:

Если вы в компоненте Edit1 в качестве начального условия поиска файлов зададите корневую папку диска, например «С:\», то вы получите полный перечень всех файлов на данном диске. Обратите внимание на скорость поиска файлов и скорость работы вашей программы.

Delphi Example Using FindFirstFile & FindFirstFileEx

Would somebody please give me a couple of Delphi (7) examples using FindFirstFile & FindFirstFileEx? I can use FindFirst okay, but keep screwing up the parameters when I try to use the other two.

Premium Content
Premium Content
  • Facebook
  • Twitter
  • LinkedIn
  • https://www.experts-exchange.com/questions/20869112/Delphi-Example-Using-FindFirstFile-FindFirstFileEx.html copy

With the Delphi FindFirst function:

var sr: TSearchRec;
ec: integer;
begin
ec := FindFirst(‘c:\*.txt’,faAny File,sr);
while ec=0 do begin
// do something with sr.name for example.
FindNext(sr);
end;
FindClose(sr);
end;

For the API FindFirstFile function see this example:

function WindowsFindFileList(filema sk: string; showFiles, showFolders, fullPath: boolean): TStringList;
var h: THandle;
wfa: WIN32_FIND_DATA;
show: boolean;
begin
Result := TStringList.Create;
h := Windows.FindFirstFile(PCha r(filemask ),wfa);
if h<>INVALID_HANDLE_VALUE then begin
repeat
show := true;
if ((wfa.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY)> 0) and (not showfolders) then show := false;
if ((wfa.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY)= 0) and (not showfiles) then show := false;
if show then begin
case fullPath of
false: Result.Add(wfa.cFileName);
true: Result.Add(ExtractFilePath (filemask) +wfa.cFile Name);
end;
end;
until not Windows.FindNextFile(h,wfa );
end;
Windows.FindClose(h);
end;

That works great! Now, anything in the way of FindFirstFileEx?

Well, yes, here is one (which does the same as the FindFirstFile one, but can be adjusted with two additional parameters):

function WindowsFindFileList(filema sk: string; showFiles, showFolders, fullPath: boolean): TStringList;
var h: THandle;
wfa: ^WIN32_FIND_DATA;
show: boolean;
dwAdditionalFlags: Dword;
indexInfoLevels: _FINDEX_INFO_LEVELS;
indexSearchOps: _FINDEX_SEARCH_OPS;
begin
Result := TStringList.Create;
New(wfa);
dwAdditionalFlags := 0;
indexInfoLevels := FindExInfoStandard;
indexSearchOps := FindExSearchNameMatch;
h := THandle(Windows.FindFirstF ileEx(PCha r(filemask ),indexInf oLevels,wf a,indexSea rchOps,nil ,dwAdditio nalFlags)) ;
if h<>INVALID_HANDLE_VALUE then begin
repeat
show := true;
if ((wfa.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY)> 0) and (not showfolders) then show := false;
if ((wfa.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY)= 0) and (not showfiles) then show := false;
if show then begin
case fullPath of
false: Result.Add(wfa.cFileName);
true: Result.Add(ExtractFilePath (filemask) +wfa.cFile Name);
end;
end;
until not Windows.FindNextFile(h,wfa ^);
end;
Windows.FindClose(h);
end;

You’ve got to set the indexInfoLevels and indexSearchOps to your personal preferences of course, see the Platform SDK for an explanation of the possible values:
http://msdn.microsoft.com/library/en-us/fileio/base/findfirstfileex.asp

IT issues often require a personalized solution. With Ask the Experts™ , submit your questions to our certified professionals and receive unlimited, customized solutions that work for you.

FindFirst — Функция Delphi

Разделы сайта:

Связь:

Доброго времени суток, уважаемые читатели!

Поздравляю всех с прошедшими праздниками: Новым Годом, Рождеством и Старым Новым Годом!

Наконец-то пришло время представить общественности систему, о которой речь шла месяца полтора назад. Это система получения файлов с нашего сайта по электронной почте. В настоящее время эта система практически готова и теперь она запущена в тестовый режим. Возможно, система может работать неправильно. Если Вы заметили ошибки или файл не пришёл вовсе — сообщайте об этом. А теперь о том, как пользоваться системой. Система очень проста:
— Отправляете письмо на адрес robot@delphi.int.ru с темой » GetFile=N » (без кавычек), где N — индексный номер файла, который Вы хотите получить. Эти номера присутствуют в каждой из ссылок на файлы. Перейдите, к примеру, в раздел «Файловый архив» и наведите курсор на любую из ссылок «Загрузить» — Вы увидите саму ссылку, в конце которой и указан номер файла. Именно это значение и нужно подставить вместо » N «. Обратите внимание: эта служебная строка (» GetFile «) должна быть прописана именно в теме письма, а не в его тексте. Если запрос будет неверный, робот проигнорирует письмо. А теперь самое главное — робот не работает постоянно . В целях снижения нагрузки на сервер, робот активируется лишь 4 раза в сутки — в 00:00 , 06:00 , 12:00 и в 18:00 (МСК). Соответственно, запрошенные файлы отправятся на e-mail примерно в это время. Будьте внимательны: сколько запросов отправлено, столько файлов и пришлёт робот, даже если файл один и тот же. Надеюсь, Вам понравится эта система!

А теперь от хорошего к плохому. Особенно остро стоит вопрос о форуме сайта. На форуме присутствуют всего несколько активных участников. Новые темы практически не создаются. Зато скапливается большое количество спама. Уже несколько раз делалась глобальная чистка, но. Зачем нужен форум, если им никто не пользуется? Только занимать лишнее дисковое пространство? В связи с этим я вынуджен конкретно поставить вопрос:

Что делать с форумом на сайте?

Этот опрос не является шуткой. У меня действительно есть желание закрыть форум. Впрочем, результаты опроса серьёзно повлияют на моё мнение. Если не трудно, укажите также своё мнение об этой ситуации.

Внимание! Вопросы и ответы для следующего выпуска рассылки принимаются до 21.01.2006 18:00 . Будьте внимательны. Письма, присланные позже откладываются для публикации в следующем выпуске.

Разделы рассылки:

Количество читателей рассылки: 3918.

Подписка на рассылку:

Лидеры по количеству баллов:

Сегодня я решил немного «приоткрыть занавес» и показать не 10 лидеров, а первые 15 позиций.

Ermakova Dasha Садовников Владимир Матвеев И.В. Андрей Лучников Ершов Денис Igor Danilevych Трапезников Антон

А вот некоторая статистическая информация:

Статусы экспертов и их возможности:

Примечание: Под форматированием текста понимается возможность оформлять ответы с использованием html-тегов.

Если Вы хотите, чтобы Вашего имени (ника) не было в данной таблице, отправьте письмо по этой ссылке с зарегистрированного у нас адреса. В теле письма, пожалуйста, укажите причину удаления имени из таблицы. Нам важно ваше мнение.


Основные правила нашей рассылки:

1. Не присылайте ответов на вопросы вроде «да я не знаю» или «да/нет». Такие ответы не публикуются.
2. Вопросы, не касающиеся Delphi, не принимаются (для этого существуют другие рассылки).
3. Запрещено присылать вложенные файлы, объёмом выше установленного ограничения (ограничения указаны в правилах).
4. Не изменяйте тем присылаемых писем. Письма с «неправильными» темами не обрабатываются! Используйте текстовый (не HTML) формат писем. HTML-теги применяйте только в том случае, если Вы уже достигли статуса, где это разрешено (см. правила).
5. Запрещено задавать вопросы, содержащие два (или несколько) вопросов разной тематики. Каждый из таких вопросов должен быть оформлен отдельным письмом.

Вопрос #216 (автор вопроса: Jake; вопрос отправлен: 31.12.2005 20:14):

У меня такая ситуация: имеется форма и компоненты RadioButton (порядка 20) на ней, после компиляции (во время работы с написаной программой) некоторые RadioButton`ы переходят в состояние Disabled, как и задумано ранее. Вопрос такой: как сделать кнопку «сброс» (сам код) которая при нажати переводила бы все RadioButton`ы в Enabled, или же открывала форму заново? Желательно какое-нибудь «компактное решение», а не:

RadioButton1.Enabled:= True; RadioButton2.Enabled:= True; .

Вопрос #217 (автор вопроса: Sadowsky Vladimir T; вопрос отправлен: 01.01.2006 17:42):

Здравствуйте, уважаемые эксперты! С Новым 2006 Годом Вас. Подскажите пожалуйста: как используя объект TShellTreeView создать новый подкаталог и отобразить его в окне TShellTreeView? Заранее всем спасибо. [Ответить на вопрос]

Вопрос #218 (автор вопроса: Олег; вопрос отправлен: 03.01.2006 13:29):

Всем привет! Есть желание, но нет возможности замутить для своего чата банальные смайлики. Чат на сокетах для локальной сети. Что можно использовать в качестве отображения мессаджей и смайлов? Если есть компонент специальный, подскажите пожалуйста, где его взять. Спасибо заранее. [Ответить на вопрос]

Вопрос #219 (автор вопроса: illuha; вопрос отправлен: 04.01.2006 20:51):

Здравствуйте!
Первый вопрос такой: Программа сканирует реестр, и когда дохожу к ключу HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Services\lanmanserver\Shares, то функция RegQueryInfoKey выдает, NumSubKeys=1, а MaxSubKeyLen=0 и дальше пошла ошибка получения имени ключа. В чем причина? Открываю RegOpenKeyEx с атрибутом KEY_READ.
А вот и второй: В некоторых ключах RegOpenKeyEx выдает ошибку 2 или 5, хотя в ключе присутствуют данные, почему? [Ответить на вопрос]


Вопрос #220 (автор вопроса: Роман; вопрос отправлен: 06.01.2006 02:16):

Как на Delphi 7 создать красивую форму наподобие Winamp’a? [Ответить на вопрос]

Вопрос #221 (автор вопроса: Садовников Владимир; вопрос отправлен: 06.01.2006 18:13):

Нужно написать что-то вроде текстового чата. Для этого я решил использовать два консольных буфера (CreateConsoleBuffer), которые потом копируются на общую консоль. С выводом, вроде всё в порядке. Кто-нибудь может подсказать, как при помощи WinAPI написать функцию ввода строки в нужном месте главной консоли, используя один из буферов? [Ответить на вопрос]

Вопрос #222 (автор вопроса: Ilay Babakov; вопрос отправлен: 10.01.2006 20:33):

Уважаемые программисты, подскажите как из БД Access оперировать данными (числами) (арифметические действия), или вывести определённую ячейку? Заранее благодарен. [Ответить на вопрос]

Вопрос #223 (автор вопроса: Игорь; вопрос отправлен: 13.01.2006 10:29):

Есть поле редактирования RichEdit2, строки в котором переписываются через заданое время. Нужно, чтобы при перемещении над полем курсора мыши, строки, вернее текст в этих строках, который попадает под курсор мыши становился жирным и подчеркнутым, также чтобы менялся вид курсора мыши. И все это чтобы возвращалось в прежнее состояние при потере курсора мыши. Также нужно, чтобы при двойном нажатии клавиши мыши, текст находящийся под курсором мыши, сохранялся в какую то текстовую переменную, или заносился в поле редактирования Edit1. Как это все сделать? [Ответить на вопрос]

Вопрос #205 (автор вопроса: Vitek; вопрос отправлен: 10.12.2005 21:05):

У меня такой вопрос: как можно написать DLL для нормального чтения mov и avi в кодировке DivX(Xvid), mpeg4, ну и др. какие-нибудь? Или есть какие компоненты? Использую MediaPlayer из Delphi7. Просто когда открываю такой файл, то нет звука, чёрный экран, или изображение идёт по ключевым фреймам. [Ответить на вопрос]

Вопрос #212 (автор вопроса: Владимир; вопрос отправлен: 18.12.2005 20:30):

Подскажите пожалуйста, кто работал с XStringGrid, как прикрутить форму к FormCellEditor? Что-то разобраться не могу, и документации никакой на офсайте нет, или ссылку на документацию. [Ответить на вопрос]

Вопрос #215 (автор вопроса: Аркадий; вопрос отправлен: 27.12.2005 05:06):

Как сделать поиск в mdb или mde, в обьектах (таблицы, запросы, макросы, модули) и изменять функции? [Ответить на вопрос]

Вопрос #197 :
Я новичок в программировании. Как можно в Delphi на OpenGL загрузить .x файл? P.S. Просто этот файл удобен тем, что его можно открыть обычным текстовым блокнотом и просмотреть его структуру. А я очень хочу понять принцип — как загружать файлы 3D сцен в Delphi (как осуществлять перехот от одной координаты в другую, записанную в файле 3D модели, как отличать один объект от другого и т.д.) Буду очень благодарен за исходник с подробными объяснениями. Спасибо заранее!

1. [Отвечает: midav.land.ru, 03.01.2006 14:34]: К сожалению, я не знаю формата файла .x и в интернете не нашёл ничего внятного. Приведи пример файла или программу, который может их обрабатывать. А в общем для загрузки пишут лексический анализатор. Тема достаточно избита в узких кругах и при наличии сведений о структуре решается достаточно просто.

Оценка за ответ: 4 .

Вопрос #209 :
Можно ли узнать когда был «расшарен» каталог в сети. Т.е. узнать дату, когда на каталог был установлен общий доступ, если этот каталог находится не на моей машине и я имею к нему только «сетевой» доступ?

1. [Отвечает: PVS, 03.01.2006 10:43]: Вряд-ли. Разве только на машине настроено очень подробное журналирование и у Вас есть доступ на чтение журналов (удаленное чтение, если я правильно понял). Если же нужный каталог на win98 — это, скорее всего, нереально ни при каких условиях.

Оценка за ответ: 5 .

Вопрос #210 :
Здравствуйте уважаемые эксперты! Подскажите пожалуйста: как превратить ячейку StringGrid’a в многострочный редактор типа TMemo, другими словами — добавить свойство Lines? Заранее всем спасибо.

1. [Отвечает: Деревянко Евгений, 31.12.2005 13:08]: Если нужно только отображать, то для этого может быть достаточно отключить DefaultDrawing для грида и переопределить рисование ячейки. А как разделителем строк в поле cells[ACol, ARow] можно записать какой-то символ или их комбинацию, например символ

. Тогда нужно будет анализивовать cells на разделитель и выводить в строках. А если необходимо и редактировать текст, то на событие GetEditText грида можно подставлять Memo точно по размеру ячейки и передать туда текст из ячейки грида, а на MemoOnExit спрятать memo и передать в ячейку грида текст: cells[ACol, ARow] := memo.lines[1]+’

‘+memo.lines[2]. и т.д. Вариант не идеальный, но остальное можно по надобности дофантазировать.

Оценка за ответ: 5 .

2. [Отвечает: Матвеев И.В., 31.12.2005 05:08]: Если Вы хотите просто выводить многострочный текст в ячейках StringGrid’а — просто так это не получится сделать, так как StringGrid использует метод TCanvas.TextRect для рисования текста, а он не умеет выводить многострочный текст. Но Вы можете самостоятельно обрабатывать событие OnDrawCell и рисовать там многострочный текст, вот пример:

Оценка за ответ: 5 .

3. [Отвечает: dasha ermakova, 04.01.2006 14:42]: Многострочность ячеек StringGr >var Form1: TForm1; NCol,NRow: integer; implementation uses Types; <$R *.dfm>procedure TForm1.FormCreate(Sender: TObject); begin Memo1.Height:=StringGr ; Memo1.Top:=StringGr >

Оценка за ответ: 5 .

4. [Отвечает: Антон Трапезников, 09.01.2006 09:23]: Здравствуйте, Денис. Сперва необходимо установить свойство DefaultDrawing в False. Далее, необходимо вставить следующий код в обработчик события OnDrawCell:

procedure TForm1.StringGr , hGrid.Cells[Col, Row]); if ptr > 0 then begin Line1 := Copy(hGr > 0 then hGrid.Canvas.TextOut(Rect.Left, Rect.Top — hGrid.Canvas.Font.Height + 3, Line2); end;

Теперь достаточно для переноса строки вставить в неё точку с запятой. Так же не забудьте изменить высоту строки так, чтобы переносы строки поместились в ячейку:

Оценка за ответ: 5 .

Вопрос #211 :
Как написать программу, которая будет определять какие пользователи есть на компьютере? Допустим, нажать кнопку и в memo создастся список всех пользователей.

1. [Отвечает: MiXei4, 30.12.2005 17:27]: Пишем модуль.

unit GetUser; interface uses Sysutils, > NERR_SUCCESS) or (info = nil) then Exit; p := PChar(info); for i := 0 to dwERead — 1 do begin inf := PUSER_INFO_10(p + i * SizeOf(TUSER_INFO_10)); ulist.Add(WideCharToString(PWideChar((inf^).usri10_name))); end; NetApiBufferFree(info); end; end.

Дальше в программе используем процедуру GetLocalUserList из этого модуля, передавая в качестве параметра переменную типа TStringList. В ней и будет список всех пользователей.

Оценка за ответ: 5 .

2. [Отвечает: Матвеев И.В., 31.12.2005 05:08]: Все данные есть в реестре + функция LookupAccountSid, привожу пример, позволяющий определить список пользователей не только на своем, но и на сетевых компьютерах. См. Приложение. Загрузить прикреплённый файл >>

Оценка за ответ: 5 .

3. [Отвечает: PVS, 03.01.2006 11:19]: Надо использовать функцию NetUserEnum. При праметре level=0 (это как раз имя пользователя) ее может использовать любой пользователь. На локальном компьютере ServerName=nil. Filter — по надобности. BufPtr -указатель на USER_INFO_0 . PrefMaxLen = SizeOf(USER_INFO_0)

repeat
.
retval=NetUserEnum(. );
.
until retval<>ERROR_MORE_DATA;

Оценка за ответ: 5 .

4. [Отвечает: mfred, 04.01.2006 17:24]: Привет, вот код для вывода всех пользователей я его нашел на delphiworld.narod.ru. У меня не работает, попробуй может что придумаешь.

unit Func; interface uses Sysutils, > NERR_SUCCESS) or (info = nil) then Exit; p := PChar(info); for i := 0 to dwERead — 1 do begin inf := PUSER_INFO_10(p + i * SizeOf(TUSER_INFO_10)); ulist.Add(WideCharToString(PWideChar((inf^).usri10_name))); end; NetApiBufferFree(info); end; end.

Оценка за ответ: 5 .

5. [Отвечает: dasha ermakova, 04.01.2006 17:39]: В папке «C:\Documents and Settings» все папки, кроме скрытых, а также «All Users» и «Administrator» именованы логинами пользователей. Поэтому составить их список можно так:

procedure TForm1.Button1Click(Sender: TObject); var Dir: string; SearchRec:TSearchRec; begin Dir:=’C:\Documents and Settings\’; if FindFirst(Dir+’*.*’,faAnyFile,SearchRec)=0 then repeat if (SearchRec.name=’.’) or (SearchRec.name=’..’) then continue; if ((SearchRec.Attr and faDirectory)<>0) and ((SearchRec.Attr and faH >’All Users’) and (SearchRec.Name<>‘Administrator’) then try Memo1.Lines.Add(SearchRec.Name) except end; until FindNext(SearchRec)<>0; FindClose(SearchRec); end;

Оценка за ответ: 5 .

6. [Отвечает: Антон Трапезников, 09.01.2006 09:24]: Здравствуйте, Павел. GetLocalUserList — возвращает список пользователей (Windows NT, Windows 2000). Исходник.

Оценка за ответ: 5 .

Вопрос #213 :
Каким образом узнать количество страниц в документе Word и загрузить в OleContainer страницу с нужным номером?

1. [Отвечает: midav.land.ru, 03.01.2006 14:21]: Кажись никак. Он по умолчанию грузит с самого начала. Проще наверное разбить на странички (один документ — одна страничка).

Оценка за ответ: 3 .

Вопрос #214 :
Нужно сделать небольшую программу для обмена сообщениями в локальной сети. Программа должна сидеть в трее и реагировать на входящие собщения. Вопрос: какие компоненты будет лучше всего использовать?

1. [Отвечает: Матвеев И.В., 31.12.2005 05:08]: Передавать данные через сеть можно либо по протоколу TCP/IP, либо по UDP. Если Вы хотите использовать TCP/IP — используйте компоненты TClientSocket/TServerSocket (палитра Internet). Готовый пример чата из книги Сергея Бобровского «Delphi 6 и Kylix» смотите в приложении к письму. Если UDP — используйте TIdUDPClient/TIdUDPServer с палитры Indy. Загрузить прикреплённый файл >>

Оценка за ответ: 5 .

2. [Отвечает: PVS, 03.01.2006 11:32]: Зависит от того какая версия Delphi. В разных версиях туда включались разные не-Borland’овские компоненты, которые, в принципе, могут облегчить задачу, но если нужно самое работающее(на мой взгляд) решение, то надо использовать TSocket — он есть везде (кажется и в Kylix’e).

Оценка за ответ: 5 .

3. [Отвечает: m >.

Оценка за ответ: 5 .

4. [Отвечает: dasha ermakova, 04.01.2006 16:47]: Для локальной сети удобно использовать UDPClient и UDPServer. Нужно поставить на них одинаковый номер Port и DefaultPort, после чего в свойстве сервера Bindings создать новый элемент, указав IP address = all и свой номер порта. Очень важно, чтобы этот номер нигде не использовался. А еще установить BroadcastEnabled = true. После чего можно посылать сообщения клиентом с помощью Broadcast или Send. При этом указывать свой номер порта, а в случае Send — IP принимающего компьютера. Для реакции на входящие сообщения есть событие сервера OnUDPRead. Для общения приложения с треем очень удобный компонент CoolTrayIcon, он есть на сайте рассылки.

Оценка за ответ: 5 .

5. [Отвечает: mfred, 04.01.2006 17:39]: Я бы использовал ClientSocket и ServerSocket которые нужно установить: Компоненты/Установить пакеты дальше надо открыть файл dclsockets70.bpl ОК. И они появятся на вкладке интернет.

Оценка за ответ: 4 .

6. [Отвечает: Антон Трапезников, 09.01.2006 09:56]: Для Вашей задачи лучше всего, имхо, использовать протокол udp (TUDPSocket), т.к. в нем нет таких понятий как клиент и сервер. Минусом дейтаграмного протокола является то, что он, в отличие от TCP, не гарантирует правильную доставку пакета получателю, а просто шлет данные. Если же Вы хотите использовать TCPSocket-ы, то кто-то должен быть сервером, а кто-то клиентом, что, конечно же, не удобно. В сети очень много исходных текстов для аналогичных программ. Вот ссылка на один из них: http://www.sources.ru/delphi/internet/rlmes.zip. З.Ы. В examle-ах к Delphi есть пример чат программы с использованием TCP.

Оценка за ответ: 5 .

Все вопросы и ответы на них Вы всегда можете найти на нашем сайте в разделе «Эксперт»: http://www.delphi.int.ru/modules.php?name=expert.

Программный поиск файлов

Многим известны программы, где можно искать файлы, правила поиска файла. Файлы можно искать как с файловых командирах (NC, VC, DOS Navigator, Far), так в любой операционной системе. В операционной системе windows диалоговое окно поиска файла вызывается «Пуск» — «Поиск» — «Файлы и папки». В открывшимся окне необходимо задать условие искомого файла (название, маска) и путь начального поиска (каталог). На других вкладках этого диалогового окна можно расширить возможности поиска по дате изменения, по содержащемуся тексту, по размеру.

Вспомним правила поиска файлов. Вы можете задать как имя искомого файла, так и его маску, если название неизвестно или необходимо найти несколько. Т.е. применяя специальный шаблон поиска, вы можете организовать условия выборки найденных файлов. Сразу оговорюсь, что поиск можно применять как к файлам, так и к каталогам. Будем их называть элементами файловой системы. В шаблон маски искомых элементов может входить:

  1. Буквы и цифры в названии и расширении.
  2. Символ * (звездочка, математический знак «умножить»), заменяющий любое количество всевозможных букв и цифр в названии или расширении.
  3. Символ ? (знак вопроса), заменяющий одну букву или цифру в названии или расширении искомого элемента.

Например, вы ищите все текстовые файлы с расширением TXT. В поле имени искомого файла вам нужно ввести «*.TXT» (пишется без кавычек) и система найдет все такие файлы в указанном диске или каталоге. Если вам надо найти все файлы с названием semen, то в поле поиска файла нужно ввести «semen.*». Если вам нужно найти элементы с третьей буквой k и с первой буквой t в расширении, то вводите «??k*.t*». Здесь знак вопроса указывает на любой символ, третьим символом по порядку идет буква k, далее название файла (каталога) может состоять из любого количества букв и цифр, указываем звездочку. В расширении первая буква t, дальше следует любое расширение.

Примечание: файлы и каталоги в операционной системе windows ищутся без учета регистра, т.е. строчние и прописные буквы не различаются.

Теперь рассмотрим программный поиск файлов с помощью языка программирования object pascal.

Вся организация цикла поиска, а именно это и есть цикл с продолжением поиска, сводится к:

  • Задание условий поиска. Это каталог и маска искомого элемента или элементов, атрибуты элемента(ов). При задании условий поиска сразу происходит поиск первого подходящего под условие. Это функция FindFirst.
  • Продолжение поиска следующего элемента по заданным в первом пункте условиям. Это функция FindNext и она может вызываться сколько угодно раз, пока все файлы и каталоги, удовлетворяющие условию, не будут найдены.
  • Закрытие поиска и освобождение памяти, выделяемую системой под поиск. Команда FindClose.

Функция FindFirst.

FindFirst (КАТАЛОГ_ПОИСКА_И_МАСКА_ФАЙЛА, АТРИБУТЫ_ИСКОМОГО_ФАЙЛА , ПОИСКОВОЯ_ПЕРЕМЕННАЯ);

где: Каталог для поиска и маска искомого элемента — строковая величина, имеющая тип String, может, например, содержать ‘c:\*.*’ — все элементы в корне диска С. Обратите внимание, что указывается полный путь для поиска.

Атрибуты искомого элемента это пользовательские или системные атрибуты, которые может иметь файл (каталог, метка диска). Вот их перечень:

  • faReadOnly — Файлы «только чтение». Такой атрибут устанавливается на файлы, которые не рекомендовано изменять, удалять. Такой атрибут имеют файлы, например, записанные на компакт-дисках.
  • faHidden — Скрытые файлы. При обычных установках браузера и командира эти файлы невидимы.
  • faSysFile — Системные файлы.
  • faVolumeID — Файл метки диска. Такой элемент в своем имени имеет название диска (максимум 11 символов).
  • faDirectory — Атрибут признака каталога.
  • faArchive — Обычный файл. По умолчанию устанавливается на заново создаваемых файлах.
  • faAnyFile — Если установить в качестве атрибута искомых элементов, то будет произведен поиск по всем вышесказанным атрибутам.

Эти вам нужно искать только элементы, имеющие атрибут «каталог» и «скрытый», то можно применить знак математического сложения, например faDirectory + faHidden.

Поисковая переменная имеет тип TSearchRec. В нее, при успешном результате поиска, будет занесены все необходимые данные о найденном файловом элементе.

Поскольку FindFirst является функцией, то она должна сама возвращать некоторое значение. Это значение имеет тип Integer и означает результат поиска файла (код ошибки поиска). Если файл найден, то принимает нулевое значение.

Эта функция продолжает поиск, заданный в функции FindNext. Возвращает значение результата поиска (нулевое в случае успешного поиска).

Закрывает поиск и освобождает память, выделенную системой под поиск.

Теперь рассмотрим пример. Допустим, нам надо найти все файлы и каталоги в каталоге DELPHI, находящийся на диске C:. В дальнейшем, вы можете самостоятельно, изменяя маску, менять условия поиска. Для формы с компонентом ListBox1 и кнопкой Button1 реакция на OnClick по кнопке:

procedure TForm1.Button1Click(Sender: TObject); Var SR:TSearchRec; // поисковая переменная FindRes:Integer; // переменная для записи результата поиска begin ListBox1.Clear; // очистка компонента ListBox1 перед занесением в него списка файлов // задание условий поиска и начало поиска FindRes:=FindFirst(‘c:\delphi\*.*’,faAnyFile,SR); While FindRes=0 do // пока мы находим файлы (каталоги), то выполнять цикл begin ListBox1.Items.Add(SR.Name); // добавление в список название // найденного элемента FindRes:=FindNext(SR); // продолжение поиска по заданным условиям end; FindClose(SR); // закрываем поиск end;

Представленный пример кода, в принципе, является основой для организации более углубленного поиска, поиска файлов по времени создания, по содержащимся словам. Если вы запустите эту программу на выполнение, то при нажатии на кнопку Button1 вы увидите в списке в первой и второй строке элементы «.» и «..». Это элементы, имеющие атрибут «каталог». Первый содержит связь с корневым каталогом диска, второй содержит связь к каталогом верхнего уровня. Со вторым вы встречаетесь в дисковых командных оболочках, например нортон, когда выбираете каталог «..» и нажимаете на «ввод». Тем самым вы попадаете в каталог на уровень выше. Естественно, в нашей поисковой программе такие элементы не надо вносить в список, поэтому мы игнорируем их нахождение. Исправляем процедуру нажатия на кнопку Button1:

procedure TForm1.Button1Click(Sender: TObject); Var SR:TSearchRec; FindRes:Integer; begin ListBox1.Clear; FindRes:=FindFirst(‘c:\delphi\*.*’,faAnyFile,SR); While FindRes=0 do begin // если найденный элемент каталог и if ((SR.Attr and faDirectory)=faDirectory) and // он имеет название «.» или «..», тогда: ((SR.Name=’.’)or(SR.Name=’..’)) then begin FindRes:=FindNext(SR); // продолжить поиск Continue; // продолжить цикл end; ListBox1.Items.Add(SR.Name); FindRes:=FindNext(SR); end; FindClose(SR); end;

В этом случае, при нахождении каталога с именем «.» или с именем «..» программа продолжит обработку цикла поиска без вывода найденного имени элемента в компонент списка ListBox1.

Теперь рассмотрим тип TSearchRec. Он имеет в себе несколько полезных свойств:

  • Name — название найденного каталога (файла);
  • Size — размер файла в байтах;
  • Attr — атрибуты каталога (файла);
  • Time — упакованное значение времени и даты создания каталога (файла).

Все вышеперечисленные свойства мы уже рассмотрели или они понятны сразу, за исключением свойства Time. Оно имеет тип Integer и содержит в себе упакованное значение даты и времени создания файла. Распаковка производится с помощью функции FileDateToDateTime, которая в результате возвращает значение даты и времени.

Теперь добавим в нашу форму компонент DateTimePicker1 (страница Win32) и допишем несколько строк.

procedure TForm1.Button1Click(Sender: TObject); Var SR:TSearchRec; FindRes:Integer; begin ListBox1.Clear; FindRes:=FindFirst(‘c:\delphi\*.*’,faAnyFile,SR); While FindRes=0 do begin if ((SR.Attr and faDirectory)=faDirectory) and ((SR.Name=’.’)or(SR.Name=’..’)) then begin FindRes:=FindNext(SR); Continue; end; // если у файла (каталога) дата создания меньше, // чем установлено в DateTimePicker1, то if FileDateToDateTime(SR.Time) procedure FindFile(Dir:String);

А в разделе кода программы, до слова «end.» вставляем пустой каркас процедуры

procedure TForm1.FindFile(Dir:String); begin end;

На форму вставляем компонент списка ListBox1, Button1, Edit1. Для компонента Edit1 свойство Text устанавливаем в «c:\delphi\». Обратите внимание на последний символ, знак «\», присутствие которого в начальном пути поиска обязательно. Дальше процедура OnClick для кнопки Button1 выглядит следующим образом:

procedure TForm1.Button1Click(Sender: TObject); begin ListBox1.Clear; // очистка списка файлов FindFile(Edit1.Text); // поиск файлов с начальными условиями, заданных в Edit1 end;

Созданная нами вручную процедура поиска:

procedure TForm1.FindFile(Dir:String); Var SR:TSearchRec; FindRes:Integer; begin FindRes:=FindFirst(Dir+’*.*’,faAnyFile,SR); While FindRes=0 do begin if ((SR.Attr and faDirectory)=faDirectory) and ((SR.Name=’.’)or(SR.Name=’..’)) then begin FindRes:=FindNext(SR); Continue; end; // если найден каталог, то if ((SR.Attr and faDirectory)=faDirectory) then begin // входим в процедуру поиска с параметрами текущего каталога + // каталог, что мы нашли FindFile(Dir+SR.Name+’\’); FindRes:=FindNext(SR); // после осмотра вложенного каталога мы продолжаем поиск // в этом каталоге Continue; // продолжить цикл end; ListBox1.Items.Add(SR.Name); FindRes:=FindNext(SR); end; FindClose(SR); end;

Если вы в компоненте Edit1 в качестве начального условия поиска файлов зададите корневую папку диска, например «С:\», то вы получите полный перечень всех файлов на данном диске. Обратите внимание на скорость поиска файлов и скорость работы вашей программы.

Присылайте свои статьи по адресу info@delphi.int.ru с темой ‘Articles’ (без кавычек), и они будут опубликованы в ближайших выпусках рассылки и на сайте. Также вы можете заполнить вот эту форму. Большая просьба: статью оформляйте в -txt или -doc формате и используйте -zip или -rar сжатие (без самораспаковки).

Из данного раздела Вы можете скачать различные файлы: компоненты, plug-in’ы для Delphi, документацию по программированию, программы, игры, написанные на Delphi и всё остальное. Вы можете добавить свои файлы в данный раздел. Чтобы сделать это, пожалуйста, заполните форму на сайте.

Новые файлы на сайте:

Color’a — Программа для работы с цифровым значением цвета. Подбор необходимого цвета и перевод в различные форматы. Писалась и обрастала функциональностью по мере необходимости, при написании курсового проекта по курсу «Графическое геометрическое моделирование». Имеет подобие экранной лупы. ASCII — Таблица ASCII кодов с пометкой клавиш. Кодировки Win/DOS. Чтение скен-кодов клавиш при нажатии; единственная клавиша, которая не распознаётся — Tab (но она есть в списке). Готовый пример чата из книги Сергея Бобровского «Delphi 6 и Kylix».

Чтобы перейти к разделу «Файловый архив» на сайте, нажмите на эту ссылку.

Здесь представлены ссылки на дружественные сайты нашего портала. Если вы тоже хотите стать нашим другом, разместите наш баннер на своём сайте. Подробнее о том, как это сделать, можно прочитать на странице данного раздела на нашем сайте. Узнать о всех наших друзьях более подробно вы сможете на той же странице.

http://www.sassoft.narod.ru/ — На данном сайте вы сможетt найти разные полезные программы. Также имеется подписка на рассылку и разная полезная информация программисту.

http://www.excode.ru/ — Статьи, исходники, компоненты, книги, кодерский магазин.

http://xskernel.narod.ru/ — XSystem Kernel Project. Сайт, посвящённый написанию операционной системы. Новости, информация об XSystem Kernel Team, документация, глоссарий, исходники системы. Open Source — наше направление.

http://tpascal.h15.ru/ — Сайт Злобина Евгения Сергеевича «ВСЁ О ПАСКАЛЕ». Здесь найдётся всё: исходники, программы, документация, алгоритмы, олимпиада, конкурсы, форум, уроки и многое, многое другое. Вступайте в сообщество ПаскALL. Сайт постоянно обновляется и развивается.

http://www.hkdsoft.narod.ru/ — H.K.D. Soft — Программирование на Delphi, C/C++, Assembler, Pascal, Basic/VB/VBA/VBS. Компоненты, статьи, исходники, множество е-книг, форум. Бесплатный софт. Скачать программу GamesBase — базу данных по играм содержащую описания, скриншоты, коды, прохождения игр.

http://infomania2004.webhost.ru/ — Этот сайт создан для того, чтобы вы могли получить интересующую вас информацию с минимальными затратами сил и времени. Если вы не нашли здесь нужной информации, вы можете оставить заявку на ее поиск. Как только информация будет найдена, она появится на сайте, а вам сообщат об этом.

http://www.visualbasic.noka.ru/ — Программирование на Visual Basic & Basic. На сайте Вы найдете множество примеров, статьи, исходники, ActiveX, а также многое другое!

http://www.sashook.hut1.ru/ — Игры, коллекция флешек, обои и заставки, компьютерные приколы, картинки, тосты и алкогольные присказки, смешные истории и анекдоты.

http://www.ssgroup.fatal.ru/ — Delphi 39. Ресурс для программистов. Статьи, исходники, компоненты, учебники, справочники, FAQ, программы и многое другое.

Сегодня ничего нет. Давайте просто улыбнёмся.

Пожалуйста, присылайте свои анекдоты по этой ссылке: info@delphi.int.ru и они обязательно будут опубликованы! Желательно на компьютерную тему.

Вы можете оказать помощь нашему проекту через систему WebMoney: R379291065219, Z165075684614. Будем очень признательны!

FindFirst — Функция Delphi

ТС, ответьте на несколько вопросов:
1) Такой поиск по всему диску C: должен выполняться уйму времени. Вы точно дожидаетесь окончания поиска?

2) Пробовали ли вы после окончания поиска поискать свои «потерявшиеся» файлы в середине/конце/любом_другом_месте_ списка (в вашей реализации там они и должны оказаться)?

Если вам нужен вывод файлов и содержимого подпапок не вперемешку (вангую, что проблема именно в этом), а «упорядоченно, то предлагаю следующий вариант:

Главное чтобы памяти и размера стека хватило ))

Функция FindFirstFile

Функция FindFirstFile ищет каталог файла или подкаталог, название которого соответствует указанному имени файла.

Чтобы определить дополнительные атрибуты, которые используются в поиске, используйте функцию FindFirstFileEx .

[in] Указатель на символьную строку с нулем в конце, которая определяет правильный каталог или путь и имя файла, которое может содержать символы подстановки ( * и ? ). Если символьная строка заканчивается символом подстановки, точкой или именем каталога, пользователь должен иметь доступ к корневому каталогу и всем вложенным в него каталогам на пути.

Windows NT/2000/XP: В версии ANSI этой функции, имя ограничено значением числа символов MAX_PATH . Чтобы выйти за пределы этого ограничения до длины 32 767 символов, вызовите Unicode версию этой функции и присоедините спереди пути «\\?\«. Подробную информацию см. в статье Именование файлов.

Windows 95/98/Me: Эта символьная строка не должна выходить за пределы количества символов значения MAX_PATH .

[out] Указатель на структуру WIN32_FIND_DATA, которая получает информацию о найденном файле или вложенном каталоге.

Если функция завершается успешно, возвращаемое значение — дескриптор поиска, используемый в последующем вызове функции FindNextFile или FindClose .

Если функция завершается ошибкой, возвращаемое значение — INVALID_HANDLE_VALUE . Чтобы получить дополнительные данные об ошибке, вызовите GetLastError .

Функция FindFirstFile открывает дескриптор поиска и возвращает информацию о первом файле, имя которого соответствует указанному образцу. Она ищет и длинные и короткие имена файла. После того, как дескриптор поиска был установлен, функция FindNextFile используется, чтобы искать другие файлы, которые соответствуют некоторому шаблону. Когда дескриптор поиска — больше не нужен, закройте его, используя функцию FindClose.

В редких случаях, информация об атрибутах файла файловой системы NTFS может быть не текущей, когда Вы вызываете эту функцию. Чтобы получить текущие атрибуты файла NTFS, вызовите функцию GetFileInformationByHandle .

Эта функция ищет файлы только по имени; она не может использоваться для поиска на основе атрибута.

Вы не можете использовать корневые каталоги как вводимую строку в параметре lpFileName для FindFirstFile, с или без заключительного обратного слэша (\). Чтобы проверить файлы в корневом каталоге, используйте что то подобное «C:\* » и пройдитесь по всему каталогу при помощи функции FindNextFile. Чтобы получить атрибуты корневого каталога, используйте функцию GetFileAttributes . Присоединенная спереди символьная строка «\\?\ » не дает доступ к корневому каталогу.

Точно так же в сетевом ресурсе Вы можете использовать для параметра lpFileName форму «\\server\service\*«, но нельзя использовать lpFileName, который указывает на ресурс непосредственно, типа «\\server\service«.

Чтобы исследовать какой-либо каталог, а не корневой каталог, используйте соответствующий путь к этому каталогу без завершающего обратного слэша (\). Например, аргумент «C:\windows» возвратит информацию о каталоге «C:\windows«, а не о каком-либо каталоге или файле в «C:\windows«. Попытка открыть поиск с конечным обратным слэшем (\) будет всегда завершаться ошибкой.

Отдавайте себе отчет в том, что кто — то может создать или удалить этот файл в промежутке времени, когда Вы сделали запрос о результатах поиска и когда получили ответную информацию. Поэтому, если Вы надумали создать файл, лучше использовать функцию CreateFile с CREATE_NEW (сбой, если файл существует) или OPEN_EXISTING (сбой, если файл не существует).

Нижеследующий код показывает минимальное использование функции FindFirstFile.

Другой пример, см. в статье Список файлов в каталоге .

Размещение и совместимость FindFirstFile

Илон Маск рекомендует:  Шаблон сайта о природе HTML, CSS, JS
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL