Тема 5. Компоненты ввода и отображения текстовой информации

1.    Введение

2.    Компоненты Label, StaticText, Panel

3.    Окна редактирования Edit, LabeledEdit и MaskEdit

4.    Многострочные окна редактирования Memo и RichEdit

5.    Компоненты выбора из списков - ListBox, , ValueListEditor, ComboBox

6.    Таблица строк - компонент StringGrid

1. Введение

На страницах Палитры компонентов VCL скомпонованы пиктограммы всех компонентов, предопределенных в C++Builder.

В ходе изучения курса будет рассмотрено большинство компонентов библиотеки C++Builder.

Компоненты работы с базами данных, отображения и редактирования текстов в базах данных, отчетами, мультимедиа  и Интернет будут рассмотрены подробно в соответствующих темах.

Рассмотрим компоненты общего назначения, которые применяются в большинстве приложений.

В VCL C++Builder существует множество компонентов, позволяющих отображать, вводить и редактировать текстовую информацию. В табл. 1 приведен их перечень для C++Builder 6 с краткими характеристиками и указанием основных параметров, содержащих отображаемый или вводимый текст.

Таблица 1. Компоненты ввода и отображения текстовой информации

Компонент

Страница

Описание

Label (метка)

Standard

Отображение текста, который не изменяется пользователем. Основное свойство - Caption.

StaticText (

Additional

Подобен компоненту Label, но обеспечивает возможность задания стиля бордюра. Основное свойство - Caption.

Panel (панель)

Standard

Контейнер для группирования органов управления. Основное свойство - Caption.

Edit (окно редактирования)

Standard

Отображение, ввод и редактирование однострочных текстов. Основное свойство - Text.

MaskEdit

 

Additional

Форматирование данных или ввод символов в соответствии с шаблоном. Основные свойства - Text и EditText.

LabeledEdit

Additional

Комбинация Edit и Label. Основные свойства - Text и EditLabel, Caption.

Memo

 

Standard

Отображение, ввод и редактирование многострочных текстов. Основное свойство - Lines.

RichEdit

 

Win32

Окно редактирования в формате RTF. Позволяет производить выбор атрибутов шрифта, поиск текста и т.д. Основное свойство - Lines.

ListBox

(окно списка)

Standard

Отображение стандартного окна списка, позволяющего пользователю выбирать из него пункты. Основное свойство - Items.

CheckListBox

Additional

Компонент является комбинацией списка ListBox и индикаторов CheckBox.

ValueListEditor

 

Additional

Окно редактирования списков строк вида «имя = значение». Основные свойства: Keys - имена, Values - значения.

ComboBox

(редактир. список)

Standard

Объединяет функции ListBox и Edit. Пользователь может либо ввести текст, либо выбрать его из списка. Основное свойство - Items.

StringGrid

(таблица строк)

Additional

Отображение текстовой информации в таблице из строк и столбцов с возможностью перемещаться по строкам и столбцам и осуществлять выбор. Основное свойство - Cells.

Во всех компонентах шрифт текста, его размер, стиль (жирный, курсив и т.п.), цвет определяются свойством Font, которое имеет множество подсвойств, устанавливаемых в процессе проектирования или программно во время выполнения приложения.

Рассмотрим коротко возможности и методику применения отдельных компонентов.

2. Компоненты Label, StaticText, Panel

Для отображения различных надписей на форме используются в основном компоненты Label, StaticText и Panel. Компоненты Label и StaticText - метки, специально предназначенные для отображения текстов. Основное назначение панели Panel - компоновка компонентов в окне формы. Однако панель можно использовать и для вывода текстов.

Тексты, отображаемые в перечисленных компонентах, определяются значением свойства Caption типа AnsiString. Его можно устанавливать в процессе проектирования или задавать и изменять программно во время выполнения приложения. Например:

Label1->Caption = "Новый текст";

При присваивании ему числовой информации происходит ее автоматическое преобразование в строку. Например, оператор

Label1->Caption = 5.1;

приведет к появлению в метке надписи «5,1». Для формирования текста, состоящего из нескольких фрагментов, можно использовать операцию "+", которая для строк означает их склеивание (конкатенацию). Label1->Caption = "Число  сотрудников: "+IntToStr(I);

Во всех компонентах цвет фона определяется свойством Color, а цвет надписи - подсвойством Color свойства Font.

Для метки Label цвет и шрифт - единственно доступные элементы оформления надписи. Компоненты StaticText и Panel имеют кроме того свойство BorderStyle, определяющее рамку текста - бордюр. При стиле sbsNone метка StaticText по виду не отличается от метки Label. Вероятно, если уж использовать бордюр, то наиболее приятный стиль sbsSunken.

Компонент Panel имеет еще свойства BevelInner, BevelOuter, BevelWidth, BorderWidth, которые предоставляют богатые возможности оформления надписи.

Размещение рассматриваемых компонентов на форме определяется свойствами Top, Left, Height, Width, Aline, общими для всех оконных компонентов. Эти свойства определяют координаты компонента, его размеры и их изменение при изменении пользователем размеров родительского компонента.

Размер меток Label и StaticText определяется также свойством AutoSize. Если это свойство установлено в true, то вертикальный и горизонтальный размеры компонента определяются размером надписи. Если же AutoSize равно false, то выравнивание текста внутри компонента определяется свойством Alignment, которое позволяет выравнивать текст по левому краю, правому краю или центру клиентской области метки. В панели Panel также имеется свойство AutoSize, но оно не относится к размерам надписи Caption. Однако свойство выравнивания Alignment работает и для панели.

В метке Label имеется свойство Wordwrap - допустимость переноса слов длинной надписи, превышающей длину компонента, на новую строчку. Чтобы такой перенос мог осуществляться, надо установить свойство Wordwrap в true, свойство AutoSize в false и сделать высоту компонента такой, чтобы в нем могло поместиться несколько строк. Если Wordwrap не установлено в true при AutoSize равном false, то длинный текст, не помещающийся в рамке метки, просто обрезается.

В метке StaticText перенос длинного текста осуществляется автоматически, если значение AutoSize установлено в false и размер компонента достаточен для размещения нескольких строк.

В панели размещение надписи в нескольких строках невозможно.

Для отображения текстовой информации, и даже с дополнительной возможностью прокрутки длинных текстов, можно использовать также окна редактирования Edit и MaskEdit в режиме Readonly.

3. Окна редактирования Edit, LabeledEdit

Внешнее оформление окон редактирования определяется свойством BorderStyle.

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

Окна редактирования снабжены многими функциями, свойственными большинству редакторов. Например, в них предусмотрены типичные комбинации «горячих» клавиш:

Ctrl-C - копирование выделенного текста в буфер обмена Clipboard (команда Copy),

Ctrl-X - вырезание выделенного текста в буфер Clipboard (команда Cut),

Ctrl-V - вставка текста из буфера Clipboord в позицию курсора (команда Paste),

Ctrl-Z - отмена последней команды редактирования.

Свойство AutoSelect определяет, будет ли автоматически выделяться весь текст при передаче фокуса в окно редактирования. Его имеет смысл задавать равным true в случаях, когда при переключении в данное окно пользователь вероятнее всего будет заменять текущий текст, а не исправлять его.

Свойства SelLength, SelStart, SelText используются только во время выполнения приложения и определяют соответственно длину выделенного текста, позицию перед первым символом выделенного текста и сам выделенный текст. Например, если в окне имеется текст «выделение текста» и в нем пользователь выделил слово «текста», то SelLength = 6, SelStart = 10 и SelText - "текста". Если выделенного текста нет, то свойство SelStart просто определяет текущее положение курсора.

Если установить значение свойств Readonly в true и AutoSelect в false, то окна редактирования можно использовать как компоненты отображения текста. В этом случае пользователь не сможет изменять отображаемый текст. Но имеются и определенные отличия. Во-первых, окна редактирования оформлены несколько иначе. А главное - окна редактирования могут вмещать текст, превышающий их длину. Такими особенностями не обладает ни одна метка.

окон редактирования имеет тип строки AnsiString. При присваивании свойству Text числовой информации происходит ее автоматическое преобразование в строку. Поэтому можете непосредственно осуществлять подобные присваивания. Например, оператор

Edit1->Text =5./2;

будет воспринят компилятором нормально и в окне появится текст «2,5». Для чтения из окна числовой информации надо использовать функции StrToFloat - преобразование строки в значение с плавающей запятой, и StrToInt - преобразование строки в целое значение. Если вводимый текст не соответствует числу, то генерируется исключение EConvertError.

Свойство MaxLength определяет максимальную длину вводимого текста. Если MaxLength = 0, то длина текста не ограничена. В противном случае значение MaxLength указывает максимальное число символов, которое может ввести пользователь.

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

Свойство PasswordChar позволяет превращать окно редактирования в окно ввода пароля. По умолчанию значение PasswordChar равно «#0» - нулевому символу. В этом случае это обычное окно редактирования. Но если в свойстве указать иной символ (например, символ звездочки "*"), то при вводе пользователем текста в окне будут появляться именно эти символы, а не те, которые вводит пользователь. Тем самым обеспечивается секретность ввода пароля.

Все сказанное относится ко всем рассматриваемым окнам редактирования. В компоненте Edit все ограничивается приведенными специфическими свойствами. А в компоненте LabeledEdit, помимо самого окна редактирования, неотличимого по виду от Edit, имеется метка. Она задается свойством EditLabel - объектом класса TBoundLabel. Этот класс имеет все основные свойства, присущие метке Label: Caption, Color, Font, Layout, ShowAccelChar, WordWrap, Canvas.

Свойство LabelPosition компонента LabeledEdit указывает, с какой стороны от окна размещается метка:

lpAbove - сверху, выровненная по левому краю,

lpBelow - снизу, выровненная по левому краю,

lpLeft - слева,

lpRight - справа.

4. Многострочные окна редактирования Memo и RichEdit

Компоненты Memo и RichEdit являются окнами редактирования многострочного текста. Они снабжены многими функциями, свойственными большинству редакторов. В них предусмотрены типичные комбинации «горячих» клавиш:

Ctrl-C - копирование выделенного текста в буфер обмена Clipboard (команда Copy),

Ctrl-X - вырезание выделенного текста в буфер Clipboard (команда Cut),

Ctrl-V - вставка текста из буфера Clipboard в позицию курсора (команда Paste),

Ctrl-Z - отмена последней команды редактирования.

В компоненте Memo формат текста одинаков для всего текста и определяется свойством Font.

Компонент RichEdit работает с текстом в формате RTF. Для изменения атрибутов вновь вводимого фрагмента текста нужно задать свойство SelAttributes типа TTextAttributes, которое в свою очередь имеет подсвойства: Color (цвет), Name (имя шрифта), Size (размер), Style (стиль) и ряд других. Например, введите на форму компонент RichEdit, диалог выбора шрифта FontDialog со страницы Dialogs и кнопку Button, которая позволит пользователю менять атрибуты текста. В обработчик щелчка кнопки введите текст:

if(FontDialogl->Execute())

RichEdit1->SelAttributes->Assign (FontDialogl->Font) ;

RichEdit1->SetFocus();

Свойство DefAttributes содержит атрибуты по умолчанию. Эти атрибуты действуют до того момента, когда изменяются атрибуты в свойстве SelAttributes. Но значения атрибутов в DefAttributes сохраняются и в любой момент эти значения могут быть методом Assign присвоены атрибутам свойства SelAttributes, чтобы вернуться к прежнему стилю.

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

За выравнивание, отступы и т.д. в пределах текущего абзаца отвечает свойство Paragraph типа ТРаrаAttributes. Этот тип в свою очередь имеет ряд свойств:

Alignment

Определяет выравнивание текста. Может принимать значения taLeftJustify (влево), taCenter (по центру) или taRightJustify (вправо).

Firstlndent

Число пикселов отступа красной строки.

Numbering

Управляет вставкой маркеров, как в списках. Может принимать значения nsNone - отсутствие маркеров, nsBullet - маркеры ставятся.

Leftlndent

Отступ в пикселях от левого поля.

Rightlndent

Отступ в пикселях от правого поля.

TabCount

Количество позиций табуляции.

Tab

Значения позиций табуляции в пикселях.

Значения подсвойств свойства Paragraph можно задавать только в процессе выполнения приложения, например, в событии создания формы или при нажатии какой-нибудь кнопки. Значения подсвойств свойства Paragraph относятся к тому абзацу, в котором находится курсор. Например, каждый из следующих операторов осуществит соответственное выравнивание текущего абзаца:

RichEdit1->Paragraph->Alignment = taLeftJustifу;     // Влево

RichEdit1->Paragraph->Alignment = taCenter;                     // По центру

RichEdit1->Paragraph->Alignment = taRightJustify; // Вправо

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

RichEdit1->Paragraph->Numbering =  nsBullet;

Уничтожение списка в текущем абзаце осуществляется оператором

RichEdit1->Paragraph->Numbering  = nsNone;

Свойства TabCount и Tab имеют смысл при вводе текста только при значении свойства компонента WantTabs = true. Это свойство разрешает пользователю вводить в текст символ табуляции. Если WantTabs = false, то нажатие пользователем клавиши табуляции просто переключит фокус на очередной компонент и символ табуляции в текст не введется.

Рассмотрели основные отличия Memo и RichEdit. Теперь остановимся на общих свойствах этих окон редактирования.

Свойства Alignment и Wordwrap имеют тот же смысл, что, например, в метках, и определяют выравнивание текста и допустимость переноса длинных строк.

Установка свойства Readonly в true задает текст только для чтения.

Свойство MaxLength определяет максимальную длину вводимого текста. Если MaxLength = 0, то длина текста не ограничена. Свойства WantReturns и WantTab определяют допустимость ввода пользователем в текст символов перевода строки и табуляции.

Свойство ScrollBars определяет наличие полос прокрутки текста в окне. По умолчанию ScrollBars = ssNone, что означает их отсутствие. Пользователь может в этом случае перемещаться по тексту только с помощью курсора. Можно задать свойству ScrollBars значения ssHorizontal, ssVertical или ssBoth, что будет соответственно означать наличие горизонтальной, вертикальной или обеих полос прокрутки. Окна Memo и RichEdit по-разному реагируют на задание полос прокрутки. В Memo задание этих полос означает, что они появляются независимо от размера текста в окне. А в RichEdit полосы появляются автоматически только в тех случаях, когда текст не помещается в окне.

Основное свойство окон Memo и RichEdit - Lines, содержащее текст окна в виде списка строк и имеющее тип TStrings. Начальное значение текста можно установить в процессе проектирования, выбрав свойства Lines в окне Инспектора Объектов. Откроется окно редактирования списков строк, где можно редактировать или вводить текст непосредственно.

Во время выполнения приложения заносить текст в окно редактирования можно с помощью методов свойства Lines типа TStrings. Коротко укажем основные свойства и методы, используемые в свойстве Lines.

Весь текст, представленный одной строкой типа String, внутри которой используются разделители типа символов возврата каретки и перевода строки, содержится в свойстве Text.

Доступ к отдельной строке текста можно получить с помощью свойства AnsiString Strings[int Index]. Индексы начинаются с 0. Так что Memo1->Lines->Strings[0] - это текст первой строки. Если окно редактирования изменяется в размерах при работе с приложением и свойство Wordwrap = true, то индексы строк будут изменяться при переносах строк.

Свойство только для чтения Count указывает число строк в тексте.

Для очистки текста в окне надо выполнить метод Clear(). Этот метод относится к самому окну, а не к его свойству Lines.

Для занесения новой строки в конец текста окна редактирования можно воспользоваться методами Add или Append свойства Lines. Для загрузки текста из файла применяется метод LoadFromFile. Сохранение текста в файле осуществляется методом SaveToFile.

Пусть, на форме размещены окно редактирования Edit1, в котором пользователь вводит имя сотрудника, кнопка Button1, при щелчке на которой в окно Memo1 должна занестись шапка характеристики этого сотрудника, после чего пользователь может заполнить текст характеристики.

Обработчик щелчка на кнопке может иметь вид: (3)

Memo1->С1еаr ();

Memo1->Lines->Add("Xарактеристика");

Memo1->Lines->Add("Сотрудник "+Editl->Text);

Memo1->SetFocus();

В компоненте RichEdit тот же фрагмент может выглядеть иначе. Можно, например, строки «Характеристика» и «Сотрудник ...» выделить жирным шрифтом и выровнять по центру, после чего вернуться к стилю по умолчанию. Код, выполняющий подобные операции, может иметь вид:

RichEdit1->Clear () ; //  установка  выравнивания по  центру

RichEdit1->Paragraph->Alignment  =  taCenter; // установка жирного шрифта

RichEdit1->SelAttributes->Style  = RichEdit1->SelAttributes->Style  << fsBold;

RichEdit1->Lines->Add("Xарактеристика");

RichEdit1->Lines->Add("Coтрудник  "+Edit1->Text); //  восстановление  атрибутов  по  умолчанию/

RichEdit1->SelAttributes -> Assign(RichEdit1->DefAttributes); //  выравнивание по левому краю

RichEdit1->Paragraph->Alignment  =  taLeftJustify;

RichEdit1->SetFocus();

Загрузить в окно RichEdit1 текста из файла может осуществлять командой

RichEdit1->Lines->LoadFromFile("text.rtf") ;

Сохранение текста в файле может осуществляться командой

RichEdit1->Lines->SaveToFile("text.rtf");

Свойство SelStart компонентов Memo и RichEdit указывает позицию курсора в тексте или начало выделенного пользователем текста.

Для окон RichEdit имеется множество сообщений Windows, позволяющих управлять отображением текста в окне, выделением отдельных фрагментов текста (слов, строк), прокруткой текста и т.п.

5. Компоненты выбора из списков - ListBox,  ComboBox, ValueListEditor.

Компонент ListBox отображает список строк и позволяет пользователю выбрать в них нужную строку. Основное свойство компонента, содержащее список строк, - Items типа TStrings. Заполнить его во время проектирования можно, нажав кнопку с многоточием около этого свойства в окне Инспектора Объектов. Во время выполнения работать с этим свойством можно, пользуясь свойствами и методами класса TStrings: Add, Clear, и другими. Этот же класс позволяет поставить в соответствие каждой строке некоторый объект. Тогда выбор пользователем строки в списке можно программно соотносить с этим объектом.

Свойство MultiSelect  разрешает пользователю множественный выбор в списке. Если MultiSelect = false, то пользователь может выбрать только один элемент списка. В этом случае можно узнать индекс выбранной строки из свойства ItemIndex, доступного только во время выполнения. Если ни одна строка не выбрана, то ItemIndex = -1.

Рассмотрим пример, в котором программно проверяется выбор пользователя. Если выбор не сделан, появляется сообщение «Вы не сделали свой выбор». Если один из элементов списка выбран, то появляется сообщение вида «Ваш выбор отображается номер выбранной строки и текст выбранной строки: (5)

if (ListBox1->ItemIndex  <  0)

   ShowMessage("Вы не сделали  свой  выбор");

else

ShowMessage("Ваш  выбор  " +IntToStr(ListBox1->ItemIndex  + 1) + ": " + ListBox1->Items->Strings[ListBox1->ItemIndex]);

Начальное значение ItemIndex невозможно задать во время проектирования. По умолчанию ItemIndex = -1. Это означает, что ни один элемент списка не выбран. Если нужно задать выбор по умолчанию, который будет показан в момент начала работы приложения, то сделать это можно, в обработчике события OnCreate формы, введя в него оператор вида:  ListBox1->ItemIndex = 0;

Если допускается множественный выбор (MultiSelect = true), то значение ItemIndex соответствует тому элементу списка, который находится в фокусе. При множественном выборе можно проверить, выбран ли данный элемент, по свойству Selected[int Index] типа bool. Например, следующий код отображает сообщения вида "Выбрана строка ...: ..." обо всех выбранных строках: (6)

for (int i=0; i < ListBox1->Items->Count; i++)

if (ListBox1->Selected[i] )

ShowMessage("Выбрана строка " + IntToStr(i+1) + ": " + ListBox1->Items->Strings [i];

Свойство Columns определяет число столбцов, в которых будет отображаться список, если он не помещается целиком в окне компонента ListBox.

Свойство Sorted позволяет упорядочить список по алфавиту. При Sorted = true новые строки в список добавляются не в конец, а по алфавиту.

Свойство AutoComplete, если установить его в true, позволяет пользователю быстро находить строку списка, нажимая клавишу, соответствующую ее первому символу.

Свойство Style, установленное в lbStandard (значение по умолчанию) соответствует списку строк. Другие значения Style позволяют отображать в списке не только текст, но и изображения. В C++Builder введена возможность создавать виртуальные списки.

Значения lbOwnerDrawFixed и lbOwnerDrawVariable используются для занесения в список изображений. При этом lbOwnerDrawFixed означает, что высота всех элементов списка одинакова, а значение lbOwnerDrawVariable означает, что высота элементов может быть различной. Значения lbVirtual и lbVirtualOwnerDraw соответствуют виртуальным спискам соответственно со строками текстов и изображений.

Основные свойства компонента CheckListBox аналогичны ListBox, за исключением свойств, определяющих множественный выбор.

Компонент ValueListEditor - окно редактирования списка строк вида «имя = значение». Окно имеет две колонки с заголовками «Key» для имен и «Value» для значений. Заголовки можно изменить во время проектирования или программно, используя свойство TitleCaptions типа TStrings. Первая строка этого свойства соответствует первой колонке (именам), вторая - второй колонке.

Свойство Strings типа TStrings содержит список всех строк. Во время проектирования он может быть заполнен редактором строк, вызываемым из Инспектора Объектов. Во время выполнения пользователь может заполнять его, если в компоненте разрешено редактирование. Можно также программно присвоить свойству Strings содержание некоторого другого списка типа TStrings. Все строки присваиваемого списка должны иметь вид «имя = значение». Тогда содержимое списка отобразится в колонках компонента. Методы класса TStrings позволяют манипулировать списком, добавлять строки, удалять и т.п. Свойство Keys - индексированный список имен. Индексы начинаются с 1.

Свойство AnsiString Values[const AnsiString Key] позволяет задать или прочитать значение из строки с именем Key. Если свойство используется для задания значения, а имени Key в списке нет, то в список добавляется новая строка с указанным именем и значением. Если свойство используется для чтения, а имени Key в списке нет, то возвращается пустая строка.

Доступ к именам и значениям дают также свойства Strings->Names и Strings->Values.

Еще один способ доступа к элементам строк дает свойство AnsiString Cells[int ACol][int ARow]. В этом свойстве ACol = 0 соответствует колонке имен, a ACol =1 - колонке значений. ARow = 0 соответствует строке заголовков, a ARow > 0 - строкам списка.

Свойство только для чтения BowCount показывает число строк, включая строку заголовка.

Свойство KeyOptions позволяет определить операции, доступные пользователю при редактировании колонки имен. Это свойство является множеством, пустым или содержащим элементы keyEdit, keyAdd, keyDelete, keyUnique. Элемент keyEdit позволяет пользователю редактировать имена в первой колонке. Элемент keyAdd позволяет пользователю добавлять в список новые строки, используя клавишу Insert или перемещая курсор клавишей со стрелкой ниже позиции последней строки. Элемент keyAdd можно включать только вместе с keyEdit. Элемент keyDelete позволяет пользователю удалять выделенную строку клавишей Delete. Элемент keyUnique не позволяет пользователю добавить новую строку с именем, уже имеющимся в списке.

Компоненты выпадающих списков: ComboBox.

Стиль изображения компонента ComboBox определяется его свойством Style

csDropDown

Выпадающий список со строками одинаковой высоты и с окном редактирования, позволяющим вводить или редактировать текст

csSimple

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

csDropDownList

Выпадающий список со строками одинаковой высоты, не содержащий окна редактирования.

csOwnerDrawFixed

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

csOwnerDrawVariable

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

Выбор пользователя или введенный им текст можно определить по значению свойства Text. Если же надо определить индекс выбранного пользователем элемента списка, то можно воспользоваться свойством ItemIndex. Все сказанное выше об ItemIndex и о задании его значения по умолчанию справедливо и для компонента ComboBox. Причем для ComboBox задание начального значения ItemIndex еще актуальнее, чем для ListBox. Если начальное значение не задано, то в момент запуска приложения пользователь не увидит в окне компонента одно из возможных значений списка и, вероятнее всего, не очень поймет, что с этим окном надо делать.

Это свойство доступно как во время проектирования, так и во время выполнения.

Если в окне проводилось редактирование данных, то ItemIndex = -1. По этому признаку можно определить, что редактирование проводилось.

Свойство MaxLength определяет максимальное число символов, которые пользователь может ввести в окно редактирования. Если MaxLength = 0, то число вводимых символов не ограничено.

Свойство DropDownCount указывает число строк, появляющихся в выпадающем списке без возникновения полосы прокрутки.

Свойство Sorted позволяет упорядочить список по алфавиту. При Sorted = true новые строки в список добавляются не в конец, а по алфавиту.

6. Таблица строк - компонент StringGrid

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

Компонент StringGrid предназначен для отображения таблиц текстовой информации. Однако этот компонент может отображать и графическую информацию.

Основные свойства компонента, определяющие отображаемый текст:

Cells [int ACol][int ARow]

Строка, содержащаяся в ячейке с индексами столбца и строки ACol и ARow

Cols[int Index]

Список строк и связанных с ними объектов, содержащихся в столбце с индексом Index

Rows [int Index]

Список строк и связанных с ними объектов, содержащихся в строке с индексом Index

Objects [int ACol][int ARow]

Объект, связанный со строкой, содержащейся в ячейке с индексами столбца и строки ACol и ARow

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

Например, код (9)

int i,j

for (i=1; i <  StringGrid1->ColCount; i++)

ScringGridl->Cells[i][0] - "столбец " + IntToStr(i);

for (i=1; i <  StringGrid1->RowCount; i++)

{

 StringGrid1->Cells[0][i] - "строка " + IntToStr(i);

for (j  =  1; j  <  StringGrid1->RowCount; j++)

StringGrid1->Cells[j][i] = IntToStr(i) + ‘:’+ IntToStr(j);

}

Обеспечит заполнение ячеек таблицы текстамие ячеек таблицы

Свойства ColCount и RowCount определяют соответственно число столбцов и строк.

Свойства FixedCols и FixedRows - число фиксированных, не прокручиваемых столбцов и строк. Цвет фона фиксированных ячеек определяется свойством FixedColor. Свойства LeftCol и TopRow определяют соответственно индексы первого видимого на экране в данный момент прокручиваемого столбца и первой видимой прокручиваемой строки.

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

Свойство Options является множеством, определяющим многие свойства таблицы: наличие разделительных вертикальных и горизонтальных линий в фиксированных (goFixedVerttine и goFixedHorzLine) и не фиксированных (goVertLine и goHorzLine) ячейках, возможность для пользователя изменять с помощью мыши размеры столбцов и строк (goColSizing и goRowSizing), перемещать столбцы и строки (goCoIMoving и goRowMoving) и многое другое. Важным элементом в свойстве Options является goEditing - возможность редактировать содержимое таблицы.

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

Свойства Col и Row показывают индексы столбца и строки выделенной ячейки. Возможно также выделение пользователем множества ячеек, строк и столбцов.

Среди множества событий компонента StringGrid следует отметить событие OnSelectCell, возникающее в момент выбора пользователем ячейки. В обработчик этого события передаются целые параметры ACol и ARow - столбец и строка выделенной ячейки, и булев параметр CanSelect - допустимость выбора. Параметр CanSelect можно использовать для запрета выделения ячейки, задав его значение false. А параметры ACol и ARow могут использоваться для какой-то реакции программы на выделение пользователя. Например, оператор

Label1->Caption  =  "Выбрана  ячейка " + IntToStr(ARow) + ':' +

IntToStr(ACol) + " Текст: " +  StringGrid1->Cells[ACol][ARow];

выведет в метку Label1 сообщение о строке, столбце и тексте выбранной ячейки.