Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Private



{ Private declarations }

function AddFile(FileMask: string; FFileAttr:DWORD): Boolean;

Объяви эту процедуру так же и потом нажми клавиши Ctrl+Shift+C и Delphi создаст заготовку для будущей процедуры:

function TForm1.AddFile(FileMask: string; FFileAttr:DWORD): Boolean;
begin
end;

В эту заготовку напиши следующее:

function TForm1.AddFile(FileMask: string; FFileAttr:DWORD): Boolean;

var ShInfo: TSHFileInfo; attributes: string; FileName: string; hFindFile: THandle; SearchRec: TSearchRec;

function AttrStr(Attr: integer): string;

begin Result:= ''; if (FILE_ATTRIBUTE_DIRECTORY and Attr) > 0 then Result:= Result + ''; if (FILE_ATTRIBUTE_ARCHIVE and Attr) > 0 then Result:= Result + 'A'; if (FILE_ATTRIBUTE_READONLY and Attr) > 0 then Result:= Result + 'R'; if (FILE_ATTRIBUTE_HIDDEN and Attr) > 0 then Result:= Result + 'H'; if (FILE_ATTRIBUTE_SYSTEM and Attr) > 0 then Result:= Result + 'S';

end;

begin
ListView1.Items.BeginUpdate;
ListView1.Items.Clear;

Result:= False;
hFindFile:= FindFirst(FileMask, FFileAttr, SearchRec);
if hFindFile <> INVALID_HANDLE_VALUE then

try
repeat
with SearchRec.FindData do
begin

if (SearchRec.Name = '.') or (SearchRec.Name = '..') or
(SearchRec.Name = '') then continue;

FileName:= SlashSep(Edit1.Text, SearchRec.Name); SHGetFileInfo(PChar(FileName), 0, ShInfo, SizeOf(ShInfo),

SHGFI_TYPENAME or SHGFI_SYSICONINDEX); Attributes:= AttrStr(dwFileAttributes); // Добавляю новый элемент with ListView1.Items.Add do

begin // Присваиваю его имя Caption:= SearchRec.Name; // Присваиваю индекс из системного списка изображений ImageIndex:= ShInfo.iIcon; // Присваиваю размер SubItems.Add(IntToStr(SearchRec.Size)); SubItems.Add((ShInfo.szTypeName)); SubItems.Add(FileTimeToDateTimeStr(ftLastWriteTime)); SubItems.Add(attributes); SubItems.Add(Edit1.Text + cFileName); if (FILE_ATTRIBUTE_DIRECTORY and dwFileAttributes) > 0 then

SubItems.Add('dir')
else
SubItems.Add('file');
end;
Result:= True;
end;
until (FindNext(SearchRec) <> 0);
finally
FindClose(SearchRec);
end;
ListView1.Items.EndUpdate;
end;

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

function TForm1.AddFile(FileMask: string; FFileAttr:DWORD): Boolean;

var … …

function AttrStr(Attr: integer): string;

begin
Result:= '';
if (FILE_ATTRIBUTE_DIRECTORY and Attr) > 0 then Result:= Result + '';

if (FILE_ATTRIBUTE_ARCHIVE and Attr) > 0 then Result:= Result + 'A'; if (FILE_ATTRIBUTE_READONLY and Attr) > 0 then Result:= Result + 'R'; if (FILE_ATTRIBUTE_HIDDEN and Attr) > 0 then Result:= Result + 'H'; if (FILE_ATTRIBUTE_SYSTEM and Attr) > 0 then Result:= Result + 'S';

end;

После имени процедуры идёт объявление локальных переменных. Это всё понятно и мы не раз уже такое делали. Но после объявления переменных, вместо начала процедуры (begin) у меня стоит объявление другой локальной процедуры - function AttrStr(Attr: integer): string;. Да, и такое в Delphi тоже возможно. Конечно же эту процедуру можно написать как полноценную, но я решил показать тебе, что такое локальная процедура.

Если одна процедура/функция (внутренняя) объявлена внутри другой (внешней), то внутренняя процедура может быть вызвана только из внешней. Весь остальной код программы не будет знать о существовании где-то внутренней процедуры.

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

После объявления и описания внутренней процедуры идёт начало (begin) внешней процедуры. Вот тут уже начинается самое интересное. В самом начале я вызываю два метода компонента ListView1:

ListView1.Items.BeginUpdate; ListView1.Items.Clear;

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

Когда ты хочешь произвести незначительное изменение, то не надо вызывать эти методы, но когда ты чувствуешь, что здесь элементы списка будут изменяться очень сильно, то лучше все изменения заключить между вызовами BeginUpdate и EndUpdate. Это связано с тем, что когда ты вносишь хоть какое-то изменение, оно сразу отображается на экране. Логично? Я тоже так думаю. А что если тебе нужно удалить все элементы и потом в цикле добавить в список 1000 новых элементов. В этом случае после удаления и каждого добавления нового элемента будет происходить прорисовка компонента. Вот тут и возникает вопрос: «Зачем после каждого добавления рисовать?». В этом случае намного эффективнее будет добавить все элементы, а только потом их прорисовать все сразу. Вот именно для этого и существуют своеобразные скобки BeginUpdate и EndUpdate:





Дата публикования: 2014-11-04; Прочитано: 404 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.007 с)...