- Работа со списками
- Работа с объектом типа Memo
- Классический список ListBox в системе Visual Basic
- Классический список ListBox в системах BCB и Delphi
- Компактный список ComboBox в системе Visual Basic
- Компактный список ComboBox в системах BCB и Delphi
- Списки DriveListBox, DirListBox и FileListBox в среде VB
- Списки DriveComboBox, DirectoryListBox и FileListBox в системах BCB/Delphi
- Присоединение объектов к строкам списка ListBox
- Сортировка грибов
- Просмотр системных шрифтов
Списки DriveComboBox, DirectoryListBox и FileListBox в системах BCB/Delphi
Опубликовано admin в Пт, 01/15/2010 - 20:29
Специализированные списки, используемые в визуальных системах фирмы Borland для установки текущих значений диска, каталога и файла, очень немногим отличаются от аналогичных объектов VB. Если на форме расположены три списка DriveComboList1, DirectoryListBox1 и FileListBox1, то для их объединения в синхронно действующий механизм достаточно подключить следующий обработчик события OnChange для объекта DriveComboList1:
void __fastcall TForm1::DriveComboBox1Change(TObject *Sender)
{
DirectoryListBox1->Drive=FileListBox1->Drive=DriveComboBox1->Drive;
FileListBox1->Directory=DirectoryListBox1->Directory;
}
Более того, взаимосвязь между указанными объектами можно установить на стадии проектирования приложения, связав их свойства следующим образом:
DriveComboBox1->DirList=DirectoryListBox1
DirectoryListBox1->FileList=FileListBox1
Файлы, отображаемые в списке FileListBox, могут быть подвергнуты предварительной фильтрации, чтобы не загромождать окно не нужной информацией. Для этой цели используется свойство Mask (например, для просмотра файлов с пиктограммами нужно задать Mask=*.ico). Дополнительная фильтрация состоит в отборе файлов, атрибуты которых удовлетворяют шкале свойства FileType. Эта шкала представлена логическими битами ftReadOnly (только для чтения), ftHidden (скрытый файл), ftSystem (системный файл), ftVolumeID (идентификатор метки тома), ftDirectory (каталог), ftArchive (файл, подлежащий архивации — не путать со сжатием), ftNormal (файл с любыми атрибутами). Значения этих битов устанавливаются в Инспекторе Объектов путем выбора одного из возможных значений True или False.
Приложение 4_10 (BCB).
На приведенных выше примерах объектов типа DriveListBox и DirectoryListBox фигурировали списки, в которых элементы с текстовым пояснением были снабжены пиктограммами фиксированного или переменного размера. Продемонстрируем технику прорисовки такого рода списков на примере программы просмотра икон — файлов с расширением ico. Разместим на форме четыре объекта — ListBox1 (для отображения пиктограмм и имен ico-файлов), DriveComboBox1 (для выбора текущего дисковода), DirectoryListBox1 (для выбора текущего каталога), FileListBox (для отбора файлов с расширением ico) и Button1 (для инициализации процедуры отображения рисунков и строк).
Так как изображения пиктограмм обычно имеют размеры 32´32, то установим следующие значения свойств в объекте ListBox1:
ItemHeight = 40
Style = lbOwnerDrawFixed
Это означает, что мы собираемся прорисовывать список своей программой, реагирующей на событие OnDrawItem, и что установлена фиксированная ширина строки, равная 40 пикселам. Свяжем окна выбора диска, каталога и файлов описанным выше способом на стадии проектирования и установим Mask=*.ico в объекте FileListBox1. Разместим на поле редактора кода два следующих обработчика событий:
void __fastcall TForm1::ListBox1DrawItem(TWinControl *Control,
int Index, TRect &Rect, TOwnerDrawState State)
{ Graphics::TIcon *ico=new Graphics::TIcon();;
ico->LoadFromFile(FileListBox1->Items->Strings[Index]);
ListBox1->Canvas->Draw(Rect.Left+1,Rect.Top+4,ico);
ListBox1->Canvas->TextOut(Rect.Left+40,Rect.Top+8,
FileListBox1->Items->Strings[Index]);
delete ico;
}
//-------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{ int j;
ListBox1->Items->Clear();
ListBox1->Items->AddStrings(FileListBox1->Items);
}
Работа с этим приложением строится по следующей схеме. Сначала мы путешествуем по дискам и каталогам до тех пор, пока не встретим папку, содержащую файлы с расширением ico. В этот момент в поле объекта FileListBox1 появится список имен таких файлов. Нажимаем кнопку <Копировать> и попадаем на обработчик события Button1Click. Здесь производится очистка списка ListBox1 и его содержимое пополняется списком фалов из FileListBox1.
Указатель ico на объект типа TIcon предназначается для того, чтобы динамически формировать объект нужного формата, в который разрешено загружать файлы пиктограмм. С помощью процедуры new резервируется память для образа иконы и в нее загружается содержимое очередного файла. Для воспроизведения иконы, загруженной в объект ico, используется метод Draw, который переносит изображение в прямоугольник Rect, представляющий очередную строку списка. Небольшие смещения на 1 пиксел влево и на 4 пиксела вниз имеют целью не дать иконам прилипнуть к левой границе списка и расположиться симметрично относительно середины строки (4 = (40 – 32)/2). После переноса изображения в список с помощью метода TextOut наименование файла размещается правее иконы. Затем возвращается память, занятая объектом ico. Результат работы приложения представлен на рис. 4.11.

Рис. 4.11. Просмотр икон из папки /Moreicon
Приложение 4_11 (Delphi).
Аналогичное Delphi-приложение приведено ниже:
procedure TForm1.Button1Click(Sender: TObject);
begin
ListBox1.Items.Clear;
ListBox1.Items.AddStrings(FileListBox1.Items);
end;
procedure TForm1.ListBox1DrawItem(Control: TWinControl;
Index: Integer; Rect: TRect; State: TOwnerDrawState);
var
ico:TIcon;
begin
ico:=TIcon.Create;
ico.LoadFromFile(FileListBox1.Items.Strings[Index]);
ListBox1.Canvas.Draw(Rect.Left+1,Rect.Top+4,ico);
ListBox1.Canvas.TextOut(Rect.Left+40,Rect.Top+8,
FileListBox1.Items.Strings[Index]);
ico.Free;
end;
Объекты, описанные в разделах 4.6 и 4.7, активно использовались в средах Windows 3.x. Однако в современных версиях операционных систем появились более удобные окна, предназначенные для выбора или сохранения файла. В системе Visual Basic такое окно представлено объектом CommonDialog (Общий Диалог), в системах BCB/Delphi — OpenDialog и SaveDialog. По сути дела, каждый из них сформирован как комбинация трех описанных выше объектов, увязанных между собой и размещенных на общем диалоговом окне.
