Отправляет email-рассылки с помощью сервиса Sendsay

Delphi на каждый день

  Все выпуски  

Delphi на каждый день Выпуск #0


Служба Рассылок Subscribe.Ru проекта Citycat.Ru

Delphi - это не игра в кубики.
Это - игра Бога в создание мира.

Delphi на каждый день
Рассылка для тех, кто увлекается программированием на Delphi.
Рассылку для Вас ведет Баринов Александр
Выпуск #0

2 cентября 2001 года



Здравствуйте, уважаемые подписчики!

Я рад, что Вы подписались на эту новую рассылку. Со своей стороны я постараюсь приложить все усилия, чтобы эта рассылка оказалась полезной для Вас. Сразу же здесь хочу отметить, что рассылка предназначена именно для увлекающихся программированием на Delphi, а не для профессионалов, которые, к сожаленью, видимо, не смогут здесь подчеркнуть что-то новенькое. Хотя... Как знать???

Итак, о чём здесь, собственно говоря, будет рассказываться? Честно говоря, определенной тематики пока нет. Видимо здесь будут статейки, в которых будет рассказываться о чем-нибудь интересном, полезном, занимательном. Например, Вы никогда не задумывались о том, как открыть или закрыть CD-ROM с помощью Delphi? Это, оказывается, делается всего лишь одной командой... Но, не буду забегать вперед.

Кроме того, уважаемые подписчики, помните, что для того, чтобы сделать рассылку более занимательной и интересной, мне просто необходима Ваша помощь: Ваши советы (как сделать рассылку более интересной), ваши замечания и комментарии (они помогут мне лучше понять Вас), предложения. Это подписка создана для Вас! Давайте же вместе сделаем ее такой, чтобы она нравилась каждому! Заранее благодарен Вам за любую помощь!

Ну, что же... Не будем больше терять времени! Я приглашаю Вас в удивительный мир Delphi!

В этом выпуске:
- Алгоритм: ищем файл.
- Обзор компонент: TLabel - Properties
- Hardware: CD-ROM, откройся...
- Хитрость: %WinDir - что бы это значило?
- Юмор: программист и лампочка.


Алгоритм: ищем файл.

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

В Delphi существует две функции для поиска файлов. Это -

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

Разберемся, что же означают эти функции. Для начала возьмем первую - FindFirst. Разберемся сначала с переменными.

Path - это переменная, как видно из названия, показывающая путь к директории, где будет производиться поиск файла. Кроме этого, в эту переменную входит также и имя файла (файлов), которые должны быть найдены. Причем, в названии файла можно пользоваться такими символами: * (звездочка) и ? (знак вопроса). Значения этих символов стандартны: знак вопроса - любой допустимый символ, звездочка - комбинация любых допустимых символов. Под допустимыми символами я понимаю символы, которые могут использоваться в операционной системе для обозначения имен файлов.

Пример использования переменной Path:

Path:='c:\*.*'; {поиск файлов с любым именем на в корневой директории диска C:}

Path:='e:\audio\song3?.wav'; {поиск файлов в директории E:\AUDIO с именем song3?.wav (это могут файлы, например, song30.wav, song31.wav, song3f.wav и другие)}

Обратите внимание! Недопустимо использовать символы * и ? в названии директории. Эти символы могут использоваться только в имени файла.

Attr - эта переменная задает тип файлов, которые будут найдены. Тип переменной - Integer. Чтобы не мучаться с запоминанием цифр, рекомендую Вам запомнить такие слова:

faReadOnly - файлы, у которых установлен аттрибут "Только для чтения".
faHidden - файлы, у которых установлен атрибут "Скрытые".
faSysFile - файлы, у которых установлен атрибут "Системный".
faArchive - файлы, у которых установлен атрибут "Архивный".
faDirectory - директория. То есть поиск поддиректорий в директории.
faAnyFile - любой файл (в том числе и faDirectory, и faVolumeID).

Теперь с этими словами можно обращаться как с цифрами - складывать их и вычитать. Например:

Attr:=faHidden+faSysFile; {поиск Скрытых и Системных файлов}

Attr:=faAnyFile-faReadOnly; {поиск всех файлов, кроме файлов, имеющих атрибут "Только для чтения"}

Однако учтите, что при применении вычитания результат может получиться несколько неожиданным, поэтому им лучше не злоупотреблять.

Теперь разберемся, что же выдает функция. Функция возвращает 0, если была выполнена успешно, или, в противном случае, код ошибки. Кроме того, если функция нашла файл, удовлетворяющий и условиям переменной Path, и условиям переменной Attr, то она записывает результат в переменную F (типа TSearchRec), которая, естественно, должна быть объявлена командой Var.

Тип TSearchRec можно представить как:

type TSearchRec = Record
  Time: Integer;
  Size: Integer;
  Attr: Integer;
  Name: TFileName;
  ExcludeAttr: Integer;
  FindHandle: THandle;
  FindData: TWin32FindData;
end;

Теперь разберемся, что означает функция FindNext.

Если команда FindFirst нашла какой-либо файл, то, возможно, если имя файла задано с символами * и/или ?, есть еще один или несколько файлов, удовлетворяющих условию поиска. В этом случае и используется команда FindNext. Функция также возвращает 0, если была выполнена успешно, или, в противном случае, код ошибки. И также записывает данные в переменную F.

Теперь, зная эти две команды, можно составить и алгоритм поиска заданного файла.

Простейший алгоритм:

Var F: TSearchRec;
    Path: String;
    Attr: Integer;
begin
  Path:='e:\audio\album31\*.wav'; {Искать все файлы в заданной директории с расширение WAV,}
  Attr:=faReadOnly+faArchive;     {которые имеют атрибуты "Только для чтения" и "Архивный"}

  FindFirst(Path,Attr,F);

  If F.Name<>'' then begin       {Если хотя бы один файл найден, то продолжить поиск}
    ListBox1.Items.Add(F.Name);  {Добавление в TListBox имени найденного файла}
    While FindNext(F)=0 do ListBox1.Items.Add(F.Name);
  end;
  FindClose(F);
end.

Обратите внимание на процедуру FindClose. Она освобождает память, которую заняли функции FindFirst и FindNext.

Вот и все! А теперь домашнее задание: подумайте, как сделать, чтобы поиск производился и во всех вложенных директориях. Ваши ответы можете присылать мне в файле PAS. Я их проверю, а лучшие будут опубликованы в следующем выпуске.


Обзор компонент: TLabel - Properties.

Казалось бы, что может быть проще и естественнее, чем TLabel. Однако, сейчас я расскажу о некоторых свойствах, о которых Вы, возможно, не знаете, и которые могут достаточно часто употребляться.

property Layout: TTextLayout; (type TTextLayout = (tlTop, tlCenter, tlBottom);) - определяет, как будет выравниваться текст по вертикали. tlTop - текст располагается вверху компоненты; tlCenter - текст располагается по центру компоненты; tlBottom - текст располагается внизу компоненты. Данное свойство вступает в силу, когда высота TLabel больше высоты написанного в ней текста.

property Transparent: Boolean; - если значение установлено True, то TLabel становится "прозрачной", а противном случае - не "прозрачной". Поэкспериментируйте с этим свойством сами, лучше перед этим изменить, например, цвет формы.

property WordWrap: Boolean; - если значение установлено True, и если текст не помещается в одну строчку, то текст будет переноситься. Однако надо позаботиться о том, чтобы высота TLabel была достаточной, чтобы уместилось несколько строк текста. А вот если значение свойства установлено False, то ничего такого происходить не будет.

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


Hardware: CD-ROM откройся...

Оказывается с помощью Delphi можно открывать/закрывать CD-ROM. Делается это достаточно просто: одной командой.

Для закрытия CD-ROMа:
mciSendString('Set cdaudio door closed wait', nil, 0, handle);

Для открытия CD-ROMа:
mciSendString('Set cdaudio door open wait', nil, 0, handle);

Только не забудьте добавить в Uses библиотеку MMSystem.


Хитрость: %WinDir - что бы это значило?

Часто можно видеть что-то похожее на это: "файл располагается в директории %WinDir\file.ext, где %WinDir - системная директория Windows." Так что бы это значило - %WinDir?

Если Вы устанавливали Windows, принимая все по умолчанию, то Windows у Вас установлен в директорию C:\WINDOWS. Однако иногда люди по каким-либо побуждениям устанавливают Windows в другую директорию, например, C:\WIN0000.

Иногда нужно бывает обратиться к какому-либо файлу, который находится как раз в этой %WinDir директории. Можно, конечно, написать C:\WINDOWS, но, тогда с уверенностью можно сказать, что на части компьютеров эта программа не пройдет.

Предлагаю Вам такую процедуру:

Var F:TextFile;
    St,Res:String;
begin
  AssignFile(F,'c:\msdos.sys'); Reset(F);
  While not Eof(F) do begin
    ReadLn(F,St);
    If Copy(St,1,6)='WinDir' then Break;
  end;
  CloseFile(F);
  Res:=Copy(St,8,Length(St)-7);
end.

После выполнения этой процедуры в переменную Res записывается значение %WinDir.

В качестве домашнего задания предлагаю Вам подумать и написать мне недостатки этой процедуры. Лучшие ответы будут опубликованы в следующем выпуске.


Юмор: программист и лампочка.

Сегодняшней темой нашего "уголка смеха" будет проблема программистов и лампочек. Итак, главный вопрос: Сколько нужно программистов, чтобы ввернуть лампочку?

- Сколько нужно программистов, чтобы ввернуть лампочку?
- Девять: один держит лампочку, четыре следующих крутят его так, чтобы лампочка закрутилась, а еще четыре ходят так, чтобы у первого не закружилась голова.

- Сколько нужно программистов, чтобы ввернуть лампочку?
- Нисколько. Лампочка - это проблема Hardware, а программисты этим не занимаются.

- Что нужно юзеру, чтобы заменить перегоревшую лампочку?
- Ну, лампочка, табуретка, минута свободного времени...
- А программисту?..
- Лампочка, интернет, инструкция от производителя лампочки, инструкция от производителя патрона, инструкция по технике безопасности и две недели времени, чтобы это все изучить.
- А хакеру?
- Один знакомый юзер.


Если Вам интересны примеры, с использованием приведенных в этом выпуске алгоритмов или Вы хотите посмотреть работу алгоритмов в действии, то архив с примерами можно скачать прямо сейчас.
Размер архива: 8,5 Кбайт. Формат: ZIP. Архив содержит файлы, написанные в Delphi 5, но не откомпилированные.


Если Вам понравилась рассылка, Вы можете подписать своего друга на эту рассылку! Для этого достаточно ввести e-mail друга в форме ниже и нажать кнопку OK. Только, пожалуйста, не забудьте предупредить товарища, что Вы подписали его.

Рассылки Subscribe.Ru
Delphi на каждый день

До скорой встречи!

Всегда Ваш Баринов Александр.

http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу
Рейтингуется SpyLog

В избранное