рефераты конспекты курсовые дипломные лекции шпоры

Реферат Курсовая Конспект

Работа с массивами динамические массивы

Работа с массивами динамические массивы - раздел Образование,   Глава 10. Основные Приёмы Кодинга. .............................

 

Глава 10. Основные приёмы кодинга. ..................................................................................... 165

 

 

10.1 Работа с массивами (динамические массивы) ............................................................. 166

 

10.2 Многомерные массивы. ................................................................................................. 170

 

10.3 Работа с файлами............................................................................................................ 171

 

10.4 Работа с текстовыми файлами ...................................................................................... 174

 

10.5 Приведение типов .......................................................................................................... 178

 

10.6 Преобразование совместимых типов ........................................................................... 181

 

10.7 Указатели ........................................................................................................................ 182

 

10.8 Структуры, записи ......................................................................................................... 184

 

10.9 Храним структуры в динамической памяти................................................................ 186

 

10.10 Поиск файлов................................................................................................................ 187

 

10.11 Работа с системным реестром..................................................................................... 189

 

10.12 Потоки........................................................................................................................... 194

 

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

Здесь мы познакомимся с работой с реестром и потоками. Обе эти технологии просто необходимы любому программисту. Мы напишем кучу примеров максимально приближенных к боевым.

Я постараюсь дать побольше примеров различных приёмов кодинга как это делалось в предыдущих главах. Надеюсь, что это тебе в будущем пригодится.

Эта глава будет более практическая и теории здесь

будет уже намного меньше. Да и вообще, чем дальше мы

движемся, тем меньше теории и больше практики.

Большинство материала будет посвящено сохранению и чтению данных с разных источников информации (например из файлов или реестра). Остальной материал будет описывать то, что может понадобится при работе с источниками инфы.

10.1 Работа с массивами (динамические массивы).

 

то одна из необходимых тем в кодинге. Мы будем достаточно часто использовать массивы при программировании, поэтому тебе необходимо прочитать эту часть полностью и понять всё, что я буду говорить.

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

Что такое массив? Это просто набор каких-то данных следующиx друг за другом. Массив в Delphi обозначается как array. Чтобы объявить переменную типа массива нужно описать её в разделе varследующим образом:

Var

r: array [длина массива] of тип данных;

Как определяется, длина массива? Очень просто, это даже похоже на геометрическое определение. Например, тебе нужен массив из 12 значений. Длина такого массива может быть [0..11]или [1..12]. В квадратных скобках ты должен поставить начальное значение массива и конечное, а между ними две точки.

Тип данных может быть любой из уже пройдённых нами. Например, тебе надо объявить массив их 12 строк, это можно сделать следующим образом:

Var

r: array [0..11] of String;

В этом примере я объявил переменную r типа массив из 12 строк.

Чтобы получить доступ к какому-то элементу, нужно написать имя переменной массива и после этого, в квадратных скобках написать номер элемента, к которому нужно получить доступ. Например, давай прочитаем 5-й элемент и запишем 7-й элемент нашего массива:

Var

r: array [0..11] of String; Str:String;

begin Str:=r[5];

r[7]:=’Привет’; end;

В этом примере я в первой строке кода присваиваю переменной Str значение пятого элемента массива (Str:=r[5];). В следующей строке я седьмому элементу присваиваю строку «Привет» (r[7]:=’Привет’;).

Давай напишем какой-нибудь пример для работы с массивами. Допустим, нам надо узнать какой сегодня день недели. Я думаю, это будет полезный примерчик.

Создай новое приложение. Брось на форму один компонент TEdit (дадим ему имя DayOfWeekEdit) и одну кнопку (дадим ей имя GetDayButton и напишем в заголовке «Узнать день недели»). У меня получилась вот такая форма:

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

procedure TForm1.GetDayButtonClick(Sender: TObject);

var day:Integer; week: array[1..7] of string;

begin week[1] := 'Воскресенье'; week[2] := 'Понедельник'; week[3] := 'Вторник'; week[4] := 'Среда'; week[5] := 'Четверг'; week[6] := 'Пятница'; week[7] := 'Суббота';

day:=DayOfWeek(Date); DayOfWeekEdit.Text:=week[day]; end;

Здесь я объявил массив week из семи элементов. После этого, я последовательно всем элементам массива присваиваю названия дней недель.

После этого, я узнаю, какой сегодня день недели. Для этого существует функция DayOfWeek. Ей нужно передать только один параметр – дату день недели которой нужно узнать. Я передаю результат работы функции Date, которая возвращает текущую дату. Получается, что DayOfWeek вернёт мне день недели текущей даты.

Вроде всё нормально, DayOfWeek возвращает не строку, в которой написано словами какой сегодня день, а число. Если функция возвращает 0, то это воскресенье, если 1 – понедельник, 2-вторник, 3 – среда и так далее. Как видишь, отсчёт идёт с воскресенья (по европейски). Точно так же я заполнял и массив: 1 – это воскресенье, 2 – понедельник и так далее.

После этого, нам надо превратить число в строку. Это делается очень просто. Нам надо получить только соответствующий элемент массива и всё. Если функция вернула нам 2, то это должен быть понедельник. В массиве под вторым номером тоже идёт «Вторник», поэтому нам просто нужно получить строку находящуюся под вторым номером в массиве. Вот именно это и происходит в последней строке week[day].

На компакт диске, в директорииПримерыГлава 10Arraysты можешь увидеть пример этой программы.

Но это мы только закрепили на практике уже пройденный материал. Давай пойдём дальше и познакомимся с динамическими массивами.

Когда ты хочешь создать динамический массив, то не надо указывать его длину. Ты просто указываешь переменную, и её тип:

r: array of integer;

В этом примере я объявил переменную r типа массив целых чисел без указания размера (как мы указывали это в квадратных скобках [0..10]).

Чтобы указать размер массива можно воспользоваться функцией SetLength. У неё два параметра:

1. 1. Переменная типа динамического массива.

2. 2. Длина массива.

 

Давай посмотрим всё это на практике. Создай новый проект в Delphi, брось на форму две кнопки и один компонент TListBox:

Для первой кнопки мы напишем следующий текст:

 

var r:array of integer; i:Integer;

begin ListBox1.Items.Clear;

SetLength(r,10);

For i:=0 to High(r)-1 do begin

ListBox1.Items.Add(IntToStr(i)+' в квадрате ='+IntToStr(r[i])); end; В области объявлений VAR я объявил две переменные. Первая это r которая является массивом чисел типа Integer. Вторая i…

R[i]:=i*i .//Здесь i-му элементу массива присваивается i*i.

ListBox1.Items.Add(IntToStr(i)+' в квадрате ='+IntToStr(r[i])); Эта строка добавляет новый элемент в ListBox1. Функция IntToStr переводит число в строку.

С первой процедурой мы разобрались, теперь перейдём ко второй:

type TDynArr=array of integer;

var r:TDynArr; i:Integer;

begin ListBox1.Items.Clear; SetLength(r,10);

For i:=0 to High(r)-1 do

SetLength(r,20); for i:=10 to High(r)-1 do r[i]:=i*i; for i:=0 to High(r) do ListBox1.Items.Add(IntToStr(i)+' в квадрате… Эта процедура выполняет похожие действия, но с небольшими особенностями. В начале я объявляю новый тип: TDynArr=array…

Var

f: TFileStream;

Вот так я объявил переменную f типа объекта TFileStream. Теперь можно проинициализировать переменную.

Инициализация – выделение памяти и установка значений по умолчанию.

За инициализацию в любом объекте отвечает метод Create. Нужно просто вызвать его и результат выполнения присвоить переменной. Например, в нашем случае нужно вызвать TFileStream.Create(какие-то параметры) и результат записать в переменную f.

f := TFileStream.Create(параметры);

Давай разберёмся, какие параметры могут быть при инициализации объекта TFileStream. У этого метода Create может быть три параметра, причём последний можно не указывать:

1. 1. Имя файла (или полный путь к файлу) который надо открыть. Этот параметр – простая строка.

�.2. Режим открытия. Здесь ты можешь указать один из следующих флагов:

�.a. fmCreate – создать файл с указанным в первом параметре именем. Если файл уже существует, то он откроется в режиме для записи.

�.b. fmOpenRead – открыть файл только для чтения. Если файл не существует, то произойдёт ошибка. Запись в файл в этом случае не возможна.

�.c. fmOpenWrite – открыть файл для запись. При этом, во время записи текущее содержимое уничтожается.

�.d. fmOpenReadWrite – открыть файл для редактирования (чтения и записи).

 

3. Права, с которыми будет открыт файл. Тут опять ты можешь указать одно из следующих значений (а можешь вообще ничего не указывать):

�.a. fmShareCompat – при этих правах, другие приложения тоже имеют права работать с открытым файлом.

�.b. fmShareExclusive – при этом режиме другие приложения вообще не смогут открыть файл.

�.c. fmShareDenyWrite – при данном режиме другие приложения не смогут открывать этот файл для записи. Файл может быть открыт только для чтения.

�.d. fmShareDenyRead – при данном режиме другие приложения не смогут открывать этот файл для чтения. Файл может быть открыт только для записи.

�.e. fmShareDenyNone -вообще не мешать другим приложениям работать с файлом.

 

С первыми двумя параметрами всё ясно. Но зачем же нужны права доступа к файлам. Допустим, что ты открыл файл для записи. Потом его открыло другое приложение и тоже для записи. Вы оба записали какие-то данные. После этого твоё приложение закрыло файл и сохранило все изменения. Тут же другое приложение перезаписывает твои изменения, даже не подозревая о том, что они прошли. Вот так твоя инфа пропадает из файла.

Если ты пишешь однопользовательскую прогу и к файлу будет иметь доступ только одно приложение, то про права можно забыть и даже не указывать.

После того, как ты поработал с файлом, достаточно вызвать метод Free, чтобы закрыть файл.

f.Free;

Теперь давай познакомимся с методами чтения, записи и путешествия внутри файла. Начнём с путешествия. Когда ты открыл файл, позиция курсора устанавливается в самое начало и любая попытка чтения или записи будет происходить в эту позицию курсора. Если тебе надо прочитать или записать в любую другую позицию, то надо передвинуть курсор. Для этого есть метод Seek. У него есть два параметра:

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

2. Откуда надо двигаться. Тут возможны три варианта:

. • soFromBeginning – двигаться на указанные количество байт от начала файла.

. • soFromCurrent -двигаться на указанные количество байт от текущей позиции в файле к концу файла.

. • soFromEnd – двигаться от конца файла к началу на указанное количество байт.

 

Не забывай, что один байт – это один символ. Единственное исключение – файлы в формате Unicode. В них один символ занимает 2 байта. Так что надо учитывать в каком виде хранится информация в файле.

Итак, если тебе надо передвинутся на 10 символов от начала файла, то ты можешь написать следующий код:

f.Seek(10, soFromBeginning);

Метод Seek всегда возвращает смещение курсора от начала файла. Этим можно воспользоваться чтобы узнать где мы сейчас находимся, а можно и узнать общий размер файла. Если переместится в конец файла, то функция вернёт нам количество байт от начала до конца, т.е. полный размер файла.

В следующем примере я устанавливаю позицию в файле на 0 байт от конца файла, т.е. в самый конец. Тем самым я получаю полный размер файла:

Размер файла := f.Seek(0, soFromEnd);

Для чтения из файла нужно использовать метод Read. . И снова у этого метода два параметра:

1. 1. Переменная, в которую будет записан результат чтения.

2. 2. Количество байт, которые надо прочитать.
Давай взглянём на код чтения из файла, начиная с 15 позиции в файле.

 

 

Var

F:TFileStream; //Переменная типа объект TFileStream.

Buf: array[0..10] of char; // Буфер, для хранения прочитанных данных begin // В следующей строчке я открываю файл filename.txt для чтения и записи.

f:= TFileStream.Create(‘c:filename.txt’, fmOpenReadWrite);

F.Seek(15, soFromCurrent); // Перемещаюсь на 15 символов вперёд. f.Read(buf, 10); // Читаю 10 символов из установленной позиции. f.Free; // Уничтожаю объект и соответственно закрываю файл.

end;

Заметь, что в методе Seek я двигаюсь на 15 символов не от начала, а от текущей позиции, хотя мне нужно от начала. Это потому что после открытия файла текущая позиция и есть начало.

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

1. 1. При чтении был достигнут конец файла и дальнейшее чтение стало не возможным.

2. 2. Ошибка на диске или любая другая физическая проблема.

 

Осталось только разобраться с методом для записи. Для записи мы будем использовать Write. У него так же два параметра.

1. 1. Переменная, содержимое которой нужно записать.

2. 2. Число байт для записи.
Пользоваться этим методом можно точно также как и методом для чтения.
Напоследок одно замечание: после чтения или записи текущая позиция в файле

 

 

смещается на количество прочитанных байт. То есть текущая позиция становится в конец прочитанного блока данных.

Примера пока не будет, потому что в принципе и так всё ясно. А если есть вопросы, то на практике мы закрепим этот материал буквально через один или два раздела, когда будем работать с структурами.

 

10.4 Работа с текстовыми файлами

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

бы удобно воспринимать такие файлы в виде наборов строк.

Если мы попытаемся прочитать текстовый файл методами, описанными в прошлой части, то работать с текстом будет неудобно. Допустим, что у нас есть файл из двух строчек:

Привет!!!

Как жизнь?

Если прочитать его с помощью объекта TFileStream, то мы увидим весь текст в одну строку:

Привет!!!<CR><LF>Как жизнь?

Здесь <CR> -конец строки и <LF> -перевод каретки на новую строку. Так что, чтобы найти конец первой строки мы должны просканировать весь текст на наличие признака конца строки и перевода каретки (CR и LF). Это очень неудобно, каждый раз сканировать конец строки. А допустим, что у тебя файл из 100 строк и тебе нужно получить доступ к 75-й строке. Как ты думаешь, долго мы будем искать нужную строку? Нет, точнее сказать, что не долго, а неудобно.

Тут на помощь нам приходит объект TStrings, который является простым контейнером (хранилищем) для строк. Можно ещё пользоваться более продвинутым вариантом этого объекта TStringList. Если посмотреть на иерархию объекта TStringList (рис 1), то мы увидим, что TStringList происходит от TStrings. Это значит, что TStringList наследует себе все возможности объекта TStrings и добавляет в него новые.

Рис 1Иерархия объекта TStringList

Как всегда для работы с объектом надо объявлять переменную типа объект:

Var f:TStringList; //Переменная типа объект TStringList.

Инициализируется эта переменная как всегда методом Create. Никаких параметров не надо. Чтобы освободить память объекта и уничтожить его, как всегда применяется метод Free. Вот пример простейшего использования объекта:

Var f:TStringList; //Переменная типа объект TStringList.

end; В этом примере я только создал новый объект и сразу уничтожил, не используя… Давай снова вспомним, что TStringList происходит от TStrings. Использовать TStrings напрямую нельзя, потому что это…

Var f:TStrings; //Переменная типа объект TStringList.

end; В этом примере я объявил переменную типа TStrings, но при создании… Такие трюки можно проводить только с родственными объектами, но я постараюсь не использовать их в своей книге, хотя…

Var f:TStrings; //Переменная типа объект TStringList.

Begin f:= TStringList.Create(); f.LoadFromFile(‘c:filename.txt’);// Загружаю текстовый файл f.Strings[0]; // Здесь находиться первая строчка файла f.Strings[1]; // Здесь находиться вторая строчка файла

f.Free; end;

Давай напишем пример, который будет искать в файле строку «Привет Вася»:

 

Var f:TStrings; //Переменная типа объект TStringList.

I: Integer; // Счётчик

Begin f:= TStringList.Create(); f.LoadFromFile(‘c:filename.txt’); // Загружаю текстовый файл

For i:=0 to f.Count-1 do // Запускаю цикл begin // Начало для цикла

If f.Strings[I] = ‘Привет Вася’ then //Если i-я строка равна нужной то

Application.MessageBox(‘Строка найдена’,
'Поиск закончен', MB_OKCANCEL)


 

End; // Конец для цикла

f.Free; end;

Точно так же очень просто изменять данные в файле. Например, тебе надо изменить 5-ю строку на «Прощай станция Мир». Это можно сделать следующим образом:

Var f:TStrings; //Переменная типа объект TStringList.

I: Integer; // Счётчик

Begin f:= TStringList.Create(); f.LoadFromFile(‘c:filename.txt’); // Загружаю текстовый файл

if f.Count>=5 then // Если в файле есть 5 строк то изменить f.Strings[5] = ‘Прощай станция Мир’;


 

F.Add(‘Прощай’);// Добавляю новую строку

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

Преобразование целых чисел в строку и обратно

Для преобразования строки в число используется функция StrToInt. У неё только один параметр – строка, а на выходе она возвращает число. var ch:Integer; begin ch:=StrToInt(Edit1.Text); // Преобразовываю Edit1.Text в… В этом примере я присвоил в переменную ch значение, содержащееся в Edit1.Text преобразованное в число. Теперь мы…

Begin ch:=StrToInt(Edit1.Text); // Преобразовываю Edit1.Text в число ch:=ch+1; Edit1.Text:=IntToStr(ch); // Преобразовываю сh в строку

Когда ты преобразовываешь строку в число, ты должен быть уверен в том, что строка содержит число. Если в строке будет хоть один символ не… 1. 1. Строка, которую надо преобразовать 2. 2. Значение по умолчанию, которое будет возвращено, если произошла ошибка. Итак, наш пример можно…

Преобразование даты в строку и обратно

1. 1. DateToStr – преобразовывает дату в строку. Единственный параметр, который надо указать – переменную типа TDateTime и на выходе получим… 2. 2. StrToDate – преобразование строки в дату. Указываешь строку (например… 3. 3. FormatDateTime – форматирование даты и времени. Это очень интересная функция, поэтому на ней я остановлюсь…

Преобразование вещественных чисел

var i:Integer; begin i:=10/2; end; Если ты попытаешься откомпилировать такой код, то увидишь следующую ошибку:… Тут появляется два выхода:

Преобразование строк

Вот такое преобразование строк мы будем делать очень часто при вызове WinAPI функций, потому что там большинство строк имеет именно PChar тип. Сейчас я не могу придумать какой-нибудь ещё пример преобразования, но уже в…  

Var p:Pointer

p:=@Str – получить адрес строки. p – указатель на строку. p^ -данные, содержащиеся по адресу указанному в p.

Begin p:=@Str; // Присваиваю указателю ссылку на строку Str:='Привет мой друг'; // Изменяю значение строки Edit1.Text:=String(p^); // Вывожу текст

В этом примере, в первой строке я присваиваю указателю p ссылку на строку Str. После этого я меняю содержимое строки. И в последней строчке я вывожу… Заметь, что я изменяю строку после присваивания адреса строки в переменную… На компакт диске, в директорииПримерыГлава 10Pointersты можешь увидеть пример этой программы.

Имя структуры = record Свойство1: Тип свойства1; Свойство2: Тип свойства2; ….

end;

Давай опишем структуру, в которой будут храниться параметры окна:

 

WindowsSize = record Left:Integer; Top:Integer; Width:Integer; Height:Integer;

end;

Я назвал новую структуру как WindowSize и объявил внутри четыре свойства: Left, Top, Width, Height.

Свойства я объявлял каждое в отдельности, хотя в данном случае все они имеют один тип и их можно просто перечислить через запятую и указать, что все они имеют целый тип:

WindowsSize = record

Left, Top, Width, Height:Integer; end;

Точно так же можно объявлять и переменные в разделе var, когда несколько переменных имеют один и тот же тип.

Теперь давай разберёмся, как можно использовать нашу структуру. Для этого надо определить переменную типа структура:

var ws: WindowSize;

Структуры – это простые сгруппированные наборы свойств, которые по умолчанию не требуют выделения памяти. Они создаются локально в стеке. Напоминаю, что стек – область памяти для хранения локальных/временный переменных. Так же следует напомнить чем отличаются локальные переменные от глобальных:

Локальные переменные – объявляются и создаются при входе в процедуру и уничтожаются при выходе. Глобальные переменные – создаются при запуске программы и уничтожаются при выходе из неё. Это значит, что глобальные переменные существуют на протяжении всего времени выполнения программы. Локальные переменные существуют, только когда выполняется код процедуры. После первого выполнения процедуры локальные переменные уничтожаются и при следующем вызове создаются снова с нулевым значением. Поэтому, если надо сохранить значение переменной после выхода из процедуры, её следует объявить как глобальную.

Итак, переменная объявлена. Инициализация и уничтожение не требуется, поэтому можно сразу же её использовать. Для доступа к переменным структуры нужно написать имя структуры и через точку указать тот параметр, который тебя интересует. Например, для доступа к параметру Left необходимо написать: ws.Left.

Давай напишем пример, который будет после закрытия программы сохранять текущие значения позиции окна в структуре, а потом эту структуру будем записывать в файл. Для записи будет использоваться простой бинарный файл, значит, воспользуемся объектом TFileStream.

Итак, создай новое приложение. В разделе Typeопиши нашу структуру:

type WindowsSize = record Left, Top, Width, Height:Integer; end;

TForm1 = class(TForm)
private
public
end;

Теперь создай обработчик события OnClose для формы. Здесь мы заполним структуру значениями позиции окна и сохраним в бинарный файл:

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

var ws:WindowsSize; f:TFileStream; Str:String;

Begin ws.Left:=Left; // Заполняем левую позицию ws.Top:=Top; // Заполняем правую позицию ws.Width:=Width; // Заполняем ширину окна ws.Height:=Height; // Заполняем высоту окна

f:=TFileStream.Create('size.dat', fmCreate); // Создаю файл Size.dat
f.Write(ws, sizeof(ws)); // Записываю структуру
f.Free; // Закрываю файл

end;

Обрати внимание, что при записи в файл, я должен указывать в качестве параметра буфер памяти для записи. Я указываю свою структуру. В качестве второго параметра нужно указывать размер записываемых данных. Для определения размера структуры я использую функцию SizeOf, которая вернёт мне необходимый размер.

Ну а теперь разберёмся с чтением из файла, которое происходит подобным образом:

procedure TForm1.FormShow(Sender: TObject);

var ws:WindowsSize; fs:TFileStream;

Begin if FileExists('size.dat') then // Если файл Size.dat существует, то

// Дальше я устанавливаю сохранённые размеры и позицию окна на родину… end; end;

Type PWindowsSize = ^ WindowsSize; WindowsSize = record

Left, Top, Width, Height:Integer;
end;

В этом примере PWindowsSize -ссылка на структуру. Теперь, чтобы разместить нашу структуру не в стеке, а в динамической памяти мы должны использовать именно PwindowsSize:

var ws:PWindowSize;

Begin ws:=New(PWindowSize); // Выделяем память ws.Left:=10; // Изменяем одно свойство Dispose(ws); // Уничтожаем память

В этом примере я объявил переменную ws типа PWindowsSize. Это значит, что ws – это всего лишь указатель и в самом начале он нулевой. Теперь нам надо… Доступ к свойствам остаётся такой же, поэтому нет смысла задерживаться на… Помни, что если ты объявил переменную типа указатель на структуру (в нашем примере это PWindowsSize), то для такого…

Запускаю поиск hFindFile := FindFirst(Маска поиска, Аттрибуты , Информация); //Проверяю корректность найденного файла if hFindFile <> INVALID_HANDLE_VALUE then //Если корректно, то запускаеться цикл repeat - until.

Repeat

//Здесь вписаны операторы, которые нужно выполнять. until (FindNext(Информация) <> 0); FindClose(Информация);

FindFirst -открывает поиск. В качестве первого параметра выступает маска поиска. Если ты укажешь конкретный файл, то система найдёт его. Но это не серьёзно, лучше искать более серьёзные вещи. Например, ты можешь запустить поиск всех файлов в корне диска С. Для этого первый параметр должен быть 'C:*.*'. Для поиска только файлов ЕХЕ, в папке Fold ты должен указать 'C:Fold*.exe'.

Второй параметр -атрибуты включаемых в поиск файлов. Я использую faAnyFile, чтобы искать любые файлы. Тебе доступны

faReadOnly -искать файлы с атрибутом ReadOnly (только для чтения).

faHidden -искать скрытые файлы.

faSysFile -искать системные файлы.

faArchive -искать архивные файлы.

faDirectory -искать директории.

Последний параметр -это структура, в которой нам вернётся информация о поиске, а именно имя найденного файла, размер, время создания и т.д. После вызова этой процедуры, я проверяю на корректность найденного файла. Если всё в норме, то запускается цикл Repeat -Until.

Мы уже рассматривали с тобой циклы, но я всё же решил повториться и напомнить тебе работу используемого мной цикла. Он выполняет операторы, расположенные между repeatи until, пока условие расположенное после слова untilявляется верным. Как только условие нарушается, цикл прерывается.

Хочу предупредить, что функция поиска, может возвращать в качестве найденного имени в структуре SearchRec (параметр Name) точку или две точки. Если ты посмотришь на директорию, то таких файлов не будет. Откуда берутся эти имена? Имя файла в виде точки указывает на текущую директорию, а имя файла из двух точек указывает на директорию верхнего уровня. Если я встречаю такие имена, то я их просто отбрасываю.

Структура

Type

TSearchRec = record Time: Integer; // Время создания найденного файла Size: Integer; // Размер найденного файла Attr: Integer; // Атрибуты найденного файла Name: TFileName; // Имя найденного файла ExcludeAttr: Integer; // Исключаемые атрибуты найденного файла FindHandle: THandle; // Указатель необходимый для поиска FindData: TWin32FindData; // Структура поиска файла Winndows

end;

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

Функция FindClose закрывает поиск. В качестве единственного параметра нужно указать всё ту же структуру SearchRec.

Давай теперь напишем какой-нибудь реальный пример, который наглядно покажет работу с функциями поиска файлов. Какой бы пример тебе написать?

Давай посмотрим на структуру TSearchRec. Как видишь, она умеет возвращать размер найденного файла. Вот и тема для примера – мы напишем код, который будет определять размер указанного файла.

Создай новый проект и брось на форму два компонента TEdit и одну кнопку. Можешь ещё украсить всё это текстом. У тебя должно получиться нечто похожее на этот рисунок:

По нажатию кнопки напиши следующий текст:

 

Var

SearchRec:TSearchRec; begin

Ищем файл

If FindFirst(Edit1.Text,faAnyFile,SearchRec)=0 then

// Забираем размер Edit2.Text:=IntToStr(SearchRec.Size)+ 'байт';


 

Закрываем поиск

На компакт диске, в директорииПримерыГлава 10FindFileты можешь увидеть пример этой программы.    

Begin FIniFile := TRegIniFile.Create('Software'); // Инициализирую реестр

FIniFile.OpenKey('VR',true); // Открываю раздел FIniFile.OpenKey('VR-Online',true); // Открываю ещё один раздел

If WindowState=wsNormal then

end; FIniFile.WriteInteger('Option', 'WinState', Integer(WindowState));

Procedure TForm1.LoadProgParam; var

FIniFile.OpenKey('VR',true); FIniFile.OpenKey('VR-Online',true); Width:=FIniFile.ReadInteger('Option', 'Width', 600); Height:=FIniFile.ReadInteger('Option', 'Heigth', 400);…

Свойства

Position – указывает на текущую позицию курсора в потоке. Начиная с этой позиции будет происходить чтение данных.

Size – размер данных в потоке.


 

Методы

CopyFrom – метод предназначен для копирования из другого потока. У него два параметра – указатель на поток, из которого надо копировать и число показывающее размер данных подлежащих копированию.

Read – прочитать данные из потока, начиная с текущей позиции курсора. У этого метода два параметра – буфер, в который будет происходить чтение и число показывающее размер данных для копирования.

Seek – переместиться в новую позицию в потоке. У этого метода два параметра:

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

2. Откуда надо двигаться. Тут возможны три варианта:

. • soFromBeginning – двигаться на указанные количество байт от начала файла.

. • soFromCurrent -двигаться на указанные количество байт от текущей позиции в файле к концу файла.

. • soFromEnd – двигаться от конца файла к началу на указанное количество байт.

 

SetSize – установить размер потока. Здесь только один параметр – число, указывающее новый размер потока. Допустим, что тебе надо уменьшить размер файла. В этом случае, с помощью метода SetSize потока TFileStream ты можешь уменьшить или даже увеличить размер файла.

Write – записать данные в текущую позицию потока. У этого метода два параметра:

1. 1. Переменная, содержимое которой нужно записать.

2. 2. Число байт для записи.

 

Это основные методы, которые тебе могут понадобиться при работе с потоками. На практике мы ещё встретимся с подобными объектами, и ты ещё раз увидишь, как с ними работать.


 

 

– Конец работы –

Используемые теги: работа, массивами, Динамические, Массивы0.075

Если Вам нужно дополнительный материал на эту тему, или Вы не нашли то, что искали, рекомендуем воспользоваться поиском по нашей базе работ: Работа с массивами динамические массивы

Что будем делать с полученным материалом:

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

Еще рефераты, курсовые, дипломные работы на эту тему:

Контрольная работа МЕТОДИЧЕСКИЕ УКАЗАНИЯ Для самостоятельной работы и к выполнению контрольной работы для студентов заочного обучения всех специальностей
Информатика... Контрольная работа... Для направлений бакалавриата Землеустройство и кадастры...

Задания для выполнения контрольной работы и лабораторной работы для самостоятельной работы студентов Менеджмент и маркетинг
На сайте allrefs.net читайте: "Задания для выполнения контрольной работы и лабораторной работы для самостоятельной работы студентов Менеджмент и маркетинг"

Организационный этап выполнения курсовой работы 2.1 Примерная тематика курсовой работы . 3 Основной этап выполнения курсовой работы 3.1.1 Назначение и место ученого предмета дисциплины
стр Введение... Введение Реформирование национальной системы высшего образования связанное с введением нового перечня специальностей общегосударственного классификатора...

ТЕОРЕТИЧЕСКИЕ ОСНОВЫ ТЕХНОЛОГИИ СОЦИАЛЬНОЙ РАБОТЫ. ОБЩИЕ ТЕХНОЛОГИИ СОЦИАЛЬНОЙ РАБОТЫ. МЕЖДИСЦИПЛИНАРНЫЕ ТЕХНОЛОГИИ И МЕТОДИКИ СОЦИАЛЬНОЙ РАБОТЫ
Учебник подготовлен коллективом авторов... гл канд искусствовед наук проф Т В Шеляг гл д р... наук проф П Д Павленок...

Понятие воспитательной работы. Роль и место воспитательной работы в системе работы с кадрами
Это, в свою очередь, требует повышения уровня воспитательной работы с личным составом, выделения приоритетов в системе воспитания личного состава,… Вместе с тем в современных условиях принимаемые меры воспитательного… Коллегия МВД России на заседании 23 декабря 1998 г рассмотрев состояние работы с кадрами в системе кадровой политики…

Приобрести студентам основные навыки практической работы с клавиатурой ПК при выполнении практических работ в Microsoft Office
Современные сервисные пакеты прикладных программ ППП Microsoft Office... Такое положение привело к мысли разработать и составить практическое руководство в котором процесс освоения...

требования к оформлению текстовой части курсовых работ, рефератов, контрольных работ, отчетов по практикам, лабораторным работам
На сайте allrefs.net читайте: "требования к оформлению текстовой части курсовых работ, рефератов, контрольных работ, отчетов по практикам, лабораторным работам"

ЛБОРАТОРНАЯ РАБОТА №3 - Исследование работы электродного водонагревателя
ЛАБОРАТОРНАЯ РАБОТА Исследование электрокалориферной установки... ЛАБОРАТОРНАЯ РАБОТА Исследование работы элементных водонагревателей...

Конспект лекций по учебной дисциплине ПМ 04. Выполнение работ по одной или нескольким профессиям рабочих, должностям служащих МДК 04.01. Технология работ по эксплуатации и ремонту газового оборудования
Государственное бюджетное образовательное учреждение... Саратовской области... cреднего профессионального образования...

Лабораторная работа Работа с макросами в СУБД MsAccess
На сайте allrefs.net читайте: "Лабораторная работа Работа с макросами в СУБД MsAccess"

0.043
Хотите получать на электронную почту самые свежие новости?
Education Insider Sample
Подпишитесь на Нашу рассылку
Наша политика приватности обеспечивает 100% безопасность и анонимность Ваших E-Mail
Реклама
Соответствующий теме материал
  • Похожее
  • По категориям
  • По работам