Add ListBox1ItemsAdd("Roman") Примердля ListBox'а. Для вставки строки в определенное место служит метод Insert
Скачать 0.59 Mb.
|
C++ Builder. Урок 18. Класс TStrings Класс TStrings предназначен для хранения набора строк. Экземпляры этого класса нельзя создавать непосредственно - он служит в качестве базового класса для других классов. У многих компонентов есть стойсто типа TStrings. Например, у ListBox'а есть свойство Items типа TStrings (см. урок 12). Основное свойство для класса TStrings - это Strings, в котором и хранятся все строки. Доступ к определенной строке можно получить через ее индекс (нумерация, как всегда, идет с нуля): ListBox1->Items->Strings[0]; //Примердля ListBox'а. Для добавления строки служит метод Add: ListBox1->Items->Add("Roman"); //Примердля ListBox'а. Для вставки строки в определенное место служит метод Insert: ListBox1->Items->Insert(1,"Ira"); В этом примере (он, как и все примеры в этом уроке, написан для ListBox'а) мы добавляем во второе место строку "Ira" (помните, что нумерация идет с нуля). Свойство Count. Возвращает количество строк. Пример использования: k=ListBox1->Items->Count; Метод Clear предназначен для удаления всех строк из компонента. Вот пример его использования: ListBox1->Items->Clear(); Для удаления же отдельного элемента с номером i служит метод Delete: ListBox1->Items->Delete(1); Для поиска определенной строки служит метод IndexOf: k=ListBox1->Items->IndexOf("Ira"); Этот метод берет в качестве параметра искомую строку и возвращает ее номер. Если строка не найдена, то возвращается -1. Наверх C++ Builder. Урок 19. Класс TStringList Класс TStringList предназначен для хранения набора строк. Он является непосредственным потомком класса TStrings. Как потомок, он наследует все методы и свойства своего родителя. В отличие от своего родителя класс TStringList позволяет создавать свои экземпляры. Кроме того, этот класс имеет собственные свойства и методы, самые важные из которых перечислены ниже: Свойство Sorted логического типа. Если установлено в true, то список автоматически сортируется, если false, то не сортируется. Пример использования: TStringList *s=new TStringList; s->Sorted=true; s->Add("Roman"); s->Add("Igor"); s->Add("Olga"); //Показываемсписокв ListBox'е. ListBox1->Items->AddStrings(s); В ListBox выведется отсортированный список ("Igor", "Olga", "Roman"). Свойство Duplicates. Свойство перечисляемого типа, если установлено в dupIgnore, то добавить повторяющуюся стороку нельзя (но при этом старые повторяющиеся строки сохраняются), dupAccept - можно добавлять повторяющиеся строки, dupError - при попытке добавить повторяющуюся строку генерируется ошибка EStringListError. Это свойство игнорируется, если список не отсортирован. Свойство CaseSensitive. Свойство логического типа, определяющее, учитывается ли при сортировке регистр (true - учитывается, false - не учитывается). Метод Sort. Сортирует список. Пример использования: TStringList *s=new TStringList; s->Add("Roman"); s->Add("Igor"); s->Add("Olga"); s->Sort(); //Показываем список в ListBox'е. ListBox1->Items->AddStrings(s); В ListBox выведется отсортированный список ("Igor", "Olga", "Roman"). C++ Builder. Урок 22. Компонент ImageListКомпонент ImageList предназначен для хранения набора однотипных изображений. Конечно, изображения можно хранить и по отдельности - но в наборе удобнее. ImageList можно рассматривать как массив изображений - в частности, к элементам такого набора вы можете обращаться по индексу. Компонент ImageList расположен на вкладке Win32 Палитры компонентов. Перенесите его на форму. Сейчас в нашем ImageList изображений нет. Давайте добавим несколько изображений. Для этого сделайте двойной щелчок на расположенном на форме компоненте ImageList1. Появится диалоговое окно для работы с изображениями. Естественно, что для добавления изображения используется кнопка Add. При нажатии на нее появляется стандартное окно для выбора файла. Выберите какой-нибудь bmp-файл с изображением размера 32 на 16. Естественно, что такой файл надо предварительно создать. В файле должно быть 2 изображения 16 на 16. Нажмите на кнопку Open. Так как у нас 2 изображения, то должно появится окно с вопросом, предлагающим разделить нашу картинку на две (на две, так как картинки должны быть квадратные). Отвечаем, естественно, да. Теперь в нашем диалоговом окне появилось 2 изображения. Назначение остальных кнопок понятно. Отметим все же, что удалять можно и отдельные изображения из загруженного файла - т. е. фактически из графического файла можно взять только нужные картинки. Также отметьте себе, что изображения в диалоговом окне можно менять местами (перетаскиванием мышью). Закройте диалоговое окно. Давайте теперь используем наш ImageList. Добавьте на форму компонент Image с вкладки Additional Палитры компонентов и обычную кнопку. В обработчик для щелчка по кнопке внесите следующий код: void __fastcall TForm1::Button2Click(TObject *Sender) { static int index=0; //Выводим очередное изображение в Image1. ImageList1->GetBitmap(index, Image1->Picture->Bitmap); index++; //Берем индекс следующей картинки. Invalidate(); //Перерисовываем. } Теперь если вы запустите программу и будете щелкать на кнопке, то в Image1 будут последовательно появляться изображения из ImageList1 - сначала с индексом 0, потом с индексом 1 и т. д. В приведенном фрагменте используется метод GetBitmap класса TImageList. Первым параметром он берет номер картинки из ImageList (нумерация идет с нуля), вторым - куда эта картинка пишется. У нас она пишется в Image1. Вообще говоря довольно-таки много компонентов имеют свойство Images. Это свойство как раз и имеет тип ImageList. Например, если вы разместите на форме компонент MainMenu, то для этого свойства вы сможете выбрать все ImageList'ы. Для отдельных же пунктов меню вы можете выбирать изображения из ImageList по индексу. Это более подробно мы рассмотрим на следующих уроках. C++ Builder. Урок 7. Работаем с меню (класс TMainMenu) Два ближайших занятия будут посвящены работе с меню. На этом занятии мы посмотрим, как можно применять компонент MainMenu, на следующем - PopupMen. Первый из них представляет главное меню формы, второй - контекстное меню. Компонент MainMenu расположен на вкладке Standard Палитры компонентов. Сделайте на нем двойной щелчок для переноса его на форму. Где он будет на форме располагаться - неважно, при запуске программы наше меню все равно будет там, где ему и положено быть - наверху нашей формы. Посмотрим сейчас, как мы можем добавлять в наше меню пункты разных видов. Для этого сделайте двойной щелчок на расположенном на форме компоненте MainMenu1. Откроется форма, в которой вы сможете создать пункты нашего меню визуальным образом. Для этого надо просто напечатать заголовок в пустом прямоугольнике. Заголовок - это свойство Caption для нашего пункта меню (это видно в окне Инспектора объектов). Если щелкнуть мышкой на прямоугольнике с пунктом меню, то появятся два новых пустых прямоугольника - снизу и справа. В эти прямоугольники можно напечатать очередные пункты нашего меню. Часто у подпунктов меню есть свои подпункты. Для создания такого подпункта щелкните правой кнопкой мыши на нужном пункте меню и в контектном меню выберите Create Submenu. При необходимости у созданных подменю можно создавать собственные подменю и т. д. Но особенно этим увлекаться не следует - слишком большая вложенность обычно не нужна. Для создания заготовки обработчика для пункта меню достаточно на нем сделать двойной щелчок мышкой. У меню может быть картинка (за это отвечает свойство Bitmap), оно может быть активным и неактивным (свойство Enabled). Правильнее картинки задавать не отдельно для каждого пункта меню, а с помощью компонента ImageList, представляющего из себя набор картинок. В этом случае в свойство Images для всего меню записываем имя компонента ImageList (по умолчанию это будет ImageList1), и затем для каждого пункта меню задаем свойство ImageIndex, которое и будет задавать номер картинки из ImageList. А еще правильнее делать все это через компонент ActionList (см. урок 6). Кроме того несколько пунктов меню могут объединяться в группу. Для такого объединения вы должны, во-первых, задать для всех этих пунктов меню одинаковое значение свойства GroupIndex. Во-вторых, необходимо установить у каждого из них свойство RadioItem в true. И в-третьих, надо написать код, который будет устанавливать отметку рядом с выбранным пунктом меню. За это отвечает свойство Checked. Код, например, может быть таким: void __fastcall TForm1::Subitem1Click(TObject *Sender) { Subitem1->Checked=true; //Действия при выборе первого пункта меню ... } ... void __fastcall TForm1::Subitem2Click(TObject *Sender) { Subitem2->Checked=true; //Действия при выборе первого пункта меню ... } Обратите внимание, что если некоторому пункту меню установиь свойство Checked в true, то у остальных пунктов из этой же группы оно автоматически установится в false. Теперь при выборе пункта меню из группы рядом с ним появится жирная точка. Наверх C++ Builder. Урок 8. Работаем с контекстным меню (класс TPopupMenu) Компонент PopupMenu расположен на вкладке Standard Палитры компонентов. Перенесите его двойным щелчком на форму. Добавление пунктов для него происходит точно так же, как и для главного меню, рассмотренного на прошлом уроке. Добавление обработчиков тоже делается точно так же. Для того, чтобы приписать контекстное меню к какому-нибудь компоненту на форме, мы молжны задать у последнего свойство PopupMenu. После чего при щелчке правой кнопкой мыши на компоненте контекстное меню и появится. При необходимости контекстное меню можно вызывать и другим способом. Например, нам надо, чтобы оно появлялось не всегда, а только при выполнении некоторого условия (скажем, если мы щелкнули на определенном месте формы). В этом случае нам надо для показа меню вызвать его метод Popup. У этого метода два параметра - X и Y того места, где контекстное меню должно появится. Вот пример использования этого метода: void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { if (X<30) { //Преобразовываем кооринаты TPoint point = ClientToScreen(Point(X, Y)); //Показываем меню PopupMenu1->Popup(point.x, point.y); } } В приведенном примере контекстное меню появится только если мы щелкнули на форме на расстоянии не больше чем 30 пикселов от левого края. Еще раз обратите внимание, что параметры X и Y у метода Popup контекстного меню - это координаты относительно всего экрана. В метод же FormMouseDown передаются координаты щелчка мыши относительно формы. Для преобразования одних координат в другие используем метод ClientToScreen. C++ Builder. Урок 9. Компонент Edit Компонент Edit предназначен для ввода текста. Расположен он на вкладке Standard Палитры компонентов. Основное его свойство - это Text. Оно позволяет читать и записывать некоторый текст в Edit. Обратите внимание, что это свойство имеет строковый тип (вернее тип AnsiString, но сейчас это уточнение не столь важно). Это означает, что если пользователь вводит в edit некоторое число, то необходимо дополнительное преобразование. Делается это приблизитетльно так: int z= StrToInt(Edit1->Text); Кроме функции StrToInt есть обратная к ней IntToStr. Они переводят строку в целое число и целое число в строку соответственно. Кроме этой пары функций имеется пара StrToFloat и FloatToStr, котрые работают с вещественными числами. Основное событие для edit'а - это Change. Возникает при изменении свойства Text. Кроме того, часто используются такие события как KeyPress (возникает при вводе каждого символа), KeyDown и KeyUp (возникают при нажатии и отпускании клавиши). Вот так, например, можно ограничить пользовательский ввод только символами из некоторого набора: void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key) { if (Key!='a' && Key!='b' && Key!='c') { Key=0x0; //Обнуляем символ MessageBeep(-1); //Звуковой сигнал } } В этом примере пользователь сможет ввести только символы a, b и c. При любом другом символе раздастся звуковой сигнал. Параметр Key тут передается по ссылке, что и позволяет нам изменить его. Событие KeyPress возникает принажатии алфавитно-цифровых клавиш. Если же вам надо отследить нажатие других клавиш (например, F1 или клавиш со стрелочками), то используйте события KeyDown и KeyUp. Они, крроме того, позволяют определить нажатие клавиш-модификаторов (Atl, Ctrl и Shift). Из полезных свойств отметим еще некоторые. Свойство CharCase. Возможные значения для него - ecNormal (вводимый текст автоматически не преобразуется), ecLowerCase (текст преобразуется к нижнему регистру) и ecUpperCase (текст преобразуется к верхнему регистру). Свойство MaxLenght. Задает максимально возможное число символов в edit'е. По умолчанию равно нулю, что означает, что количество вводимых символов не ограничено. Свойство ParentFont. Может принимать значение true (в edit'е будет использоваться шрифт формы) и false (edit будет использоваться собственный шрифт). Свойство PasswordChar. Позволяет задать символ-заменитель для ввода пароля. Чаще всего для этих целей используют звездочку. Свойство text при этом все равно будет содержать вводимый пользователем пароль. Наверх C++ Builder. Урок 10. Работаем с двумя формами Приложение редко состоит только из одной формы. Почти в любой программе есть дополнительные формы с разными настройками и параметрами. Для добаления в программу еще одной формы нажмите на кнопочку New Form на одной из панелей инструментов. Появится еще одна форма. Разместите на ней Edit и две обычные кнопки. Для первой кнопки задайте свойство Caption как "OK", для второй - "Cancel". Пользователь будет задавать в edit'е некоторый параметр, который мы будем передавать в главное окно нашего приложения. Появляться же наша вторая форма будет по некоторому действию пользователя (выбору пункта меню, щелчку мыши и т. п.). Напишем теперь код, по которому наше второе окно будет появляться. Для этого, во-первых, добавьте строку ... #include "Unit1.h" #include "Unit2.h" ... в файл Unit1.cpp реализации первой формы. И, во-вторых, добавьте код для показа второй формы в модальном виде: ... Form2->ShowModal(); ... Добавить его можно, например, в обработчике меню (или там, где вы хотите, чтобы ваше второе окно появилось). Запускаем программу и проверяем. Второе окно появляется при выборе пункта меню. Правда, кнопки OK и Cancel не работают. Напишем для них соответствующий код. Добавьте для обработчиков нажатия на кнопки OK и Cancel такой код: void __fastcall TForm2::Button1Click(TObject *Sender) { Close(); //Закрываем форму ModalResult=mrOk; //Результат закрытия - mrOk } ... void __fastcall TForm2::Button2Click(TObject *Sender) { Close(); //Закрываем форму ModalResult=mrCancel; //Результат закрытия - mrCancel } Код достаточно понятен - метод Close() закрывает окно, и в свойство ModalResult второй формы мы раписываем значение, соответствующее нажатой пользователем кнопки. Осталось переделать код для показа второй формы. Измените его следующим образом: ... if (Form2->ShowModal()==mrOk) //Если нажата кнопка OK Form1->Caption=Form2->Edit1->Text; //то меняем заголовок у формы ... Как вы видите, мы тут анализируем, что за кнопку пользователь нажал. Если эта была OK, то меняем заголовок у формы на заданное пользователем значение, если Cancel, то ничего не делаем. Наверх C++ Builder. Уроки с сайта http://progs.biz Рассылка №6 C++ Builder. Урок 11. Текст (компоненты TLabel и TStaticText). Полные версии уроков (с картинками) можно найти по адресам Урок 11. Текст (компоненты TLabel и TStaticText). C++ Builder. Урок 11. Текст (компоненты TLabel и TStaticText) Компонент Label (метка) расположен на вкладке Standard Палитры Компонентов. Перечислем его основные свойства. Самое важное из них - это, несомненно, свойство Caption. Именно оно определяет, что за надпись будет иметь наша метка. Следующее свойство - это AutoSize логического типа. По умолчанию оно равно true, и наша метка будет автоматически увеличивать свои размеры, если текст, задаваемый свойством Caption, будет достаточно длинным. Свойство WordWrap определяет, происходит ли перенос длинных строк. Если это свойство установить в true, то длинная строка разобьется на несколько. При этом свойство AutoSize должно быть установлено в false. Для цветов служат свойства color (цвет фона) и подсвойство color свойства font (задает цвет шрифта). Первому из них (для цвета фона) рекомендуется задавать значение clBtnFace. В этом случае цвет фона для надписи будет сливаться с цветом формы. Для задания шрифта используется составное свойство Font. У него есть ряд подсвойств (Size (задет размер), Style (задает такие характеристики как курсивность или подчеркнутость шрифта)). Подсвойства свойства Font можно задавать как на этапе разработки программы в Инспекторе свойств, так и на этапе работы программы. Например, вот так: //Задаем новый размер Label1->Font->Size=16; //Задаем полужирность и подчекнутость шрифта Label1->Font-> fsBold << fsUnderline; Компонент StaticText расположен на вкладке Additional Палитры Компонентов. Его свойства совпадают в основном со свойствами label'а. Самое существенное различие между этими двумя компонентами в том, что label - это безоконный элемент, а StaticText - оконный (т. е. имеет свой hwnd). Если компоненты Label или StaticText должны отображать значения числовых переменных, то следует воспользоваться функциями IntToStr и FloatToStr, которые переводят соответственно целые и вещественные числа в строки. Оба компонента - и Label, и StaticText - могут использоваться для доступа с помощью комбинации клавиш Alt+что-то к элементам, не имеющим такой самостоятельной возможности. Например, если вам надо получить доступ по комбинации клавиш Alt+D к edit'у, то действовать надо следующим образом: размешаем на форме edit и label (или вместо label можно StaticText, для него действия будут те же самые). Label'у у свойства Caption перед буквой D пишем знак амперсанда (&). Например, свойство Caption может быть таким - &Date. Далее нам надо привязать label к edit'у. Для этого мы устанавливаем у label'а свойство FocusControl в edit1 (если мы оставили свойство name для edit'а по умолчанию). Это значение мы просто выбираем из списка. И, наконец, свойство ShowAccelChar для метки должно быть установлено в true (если его установить в false, то ничего работать не будет). Запускайте программу. Если нажать Alt+D, то edit получит фокус. C++ Builder. Уроки с сайта http://progs.biz Рассылка №7 C++ Builder. Урок 12. Компонент ListBox. C++ Builder. Урок 13. Компонент ComboBox. Полные версии уроков (с картинками) можно найти по адресам Урок 12. Компонент ListBox. Урок 13. Компонент ComboBox. C++ Builder. Урок 12. Компонент ListBox Компонент ListBox (список) расположен на вкладке Standard Палитры Компонентов. Сейчас мы с вами рассмотрим стандартные операции, которые можно делать с ListBox'ом - добавление новых пунктов, их удаление, поиск нужного пункта, очистка всего ListBox'а и др. Пункты для нашего ListBox'а хранятся в его свойстве Items. Для задания этого свойства на этапе разработки щелкните на многоточии рядом с ним в Инспекторе объектов. Появится диалоговое окно String List Editor, в котором вы и перчатаете нужные вам элементы списка. Если же вам надо добавить новый пункт на этапе работы программы, то надо воспользоваться методом Add упомянутого свойства Items: ListBox1->Items->Add("New String"); Этот метод добавит новый элемент в конец списока. Если же нам надо добавить новый элемент куда-нибудь в середину, то используем метод Insert: ListBox1->Items->Insert(1,"Roma"); Для очистки всего списка вызываем метод Clear: ListBox1->Items->Clear(); Если нам надо удалить i-й элемент ListBox'а, то мы используем метод delete: ListBox1->Items->Delete(1); Нумерация элементов списка идет с нуля, так что указанный пример удалит второй сверху элемент (номер у которого будет равен одному). Определить выделенный элемент списка позволяет свойство ItemIndex. Оно представляет из себя номер выделенного элемента (нумерация идет с нуля). Если ни один элеимент не выделен, то это свойство равно -1. Вот так, например, будет выглядеть код, который при шелчке на ListBox'е покажет в MessageBox'е номер элемента, на ктором был произведен щелчок: void __fastcall TForm1::ListBox1Click(TObject *Sender) { ShowMessage(IntToStr(ListBox1->ItemIndex)); } Если вам надо, чтобы в ListBox'е пользователь имел возможность выделить сразу несколько элментов, то установите свойство MultiSelect в true (по умолчанию оно равно false). Наверх C++ Builder. Урок 13. Компонент ComboBox Компонент ComboBox (комбинированный список) расположен на вкладке Standard Палитры Компонентов. Этот компонент по своим свойствам очень похож на компонент ListBox. Методы и свойства он имеет почти те же самые. Самое важное из них - это, пожалуй, свойство Items. Именно в нем и хранятся все строки ComboBox'а. Из отличных от ListBox'а свойств выделим свойство Text. Оно дает нам текст в нашем ComboBox'е (т.е. то, что пользователь непосредственно видит). Вот так, например, можно добавить напечатанный пользователем текст в ComboBox: ComboBox1->Items->Add(ComboBox1->Text); Из полезных свойств отметим еще свойство style. Возможные значения для него - csDropDown (ComboBox с возможностью редактирования), csDropDownList (ComboBox без возможности редактирования, т. е. пользователь может выбирать только из существующих элементов), csSimple и другие. При значении style равным csSimple ComboBox будет выглядеть приблизительно как ListBox с полем редактирования над ним. Наверх C++ Builder. Уроки с сайта http://progs.biz Рассылка №8 C++ Builder. Урок 14. Используем API-функции. Полные версии уроков (с картинками) можно найти по адресам Урок 14. Используем API-функции. C++ Builder. Урок 14. Используем API-функции В программах для Windows на C++ Builder, как правило, все API-функции можно использовать без особых проблем и без дополнительных объявлений и include'ов. Вот пример, как можно с помощью API-функций сдвинуть кнопку Пуск на Панели задач: void __fastcall TForm1::Button1Click(TObject *Sender) { HWND hWnd = FindWindow("Shell_TrayWnd", NULL); HWND hWndBt = FindWindowEx(hWnd, NULL, "Button", NULL); MoveWindow(hWndBt, 30, 2, 98, 32, TRUE); } Разумеется, этот код надо разместить в обработчике нажатия на кнопку на форме. После щелчка на кнопке нашей программы кнопка "Пуск" сдвинется вправо. Если же вы разместите этот код в консольном приложении, то вам необходимо добавить include'ом файл windows.h: #include int main(int argc, char* argv[]) { HWND hWnd = FindWindow("Shell_TrayWnd", NULL); HWND hWndBt = FindWindowEx(hWnd, NULL, "Button", NULL); MoveWindow(hWndBt, 30, 2, 98, 32, TRUE); return 0; } Как правило, этого include'а достаточно для использования любой API-функции в консольном приложении. Некоторые API-функции требуют в Windows-приложениях дополнительных include'ов. Например, функция PlaySound. Она без проблем будет работать в консольном приложении (если файл windows.h подключен, разумеется), в Windows же приложении нужно добавить строчку ... #include ... после чего в вашей программе вы сможете проигрывать с помощью этой функции звуки: ... PlaySound("LOGOFF.WAV", NULL, SND_FILENAME); ... Приведенный фрагмент проиграет файл LOGOFF.WAV, который вы должы разместить в папке вашего проекта. То, что надо подсоединить именно файл Mmsystem.h, выясняем по встроенной справке по функции PlaySound. |