
- •10.1. Компиляция и компоновка проекта.
- •10.3. Выполнение приложения по шагам.
- •11.1. Требования к интерфейсу пользователя приложений для Windows
- •11.1.2. Многооконные приложения.
- •11.1.3. Стиль окон приложения.
- •11.1.4. Цветовое решение приложения.
- •11.1.5. Шрифты текстов.
- •11.1.6. Меню.
- •11.1.7. Компоновка форм.
- •11.1.8. Последовательность фокусировки элементов.
- •11.1.9. Подсказки и контекстно-зависимые справки.
11.1.7. Компоновка форм.
Управляющие элементы и функционально связанные сними компоненты экрана должны быть зрительно объединены в группы, заголовки которых коротко и четко поясняют их назначение.
Примеры удачной организации окон можно посмотреть в C++Builder, выполнив команду Tools ==> Environment Options и полистав страницы окна опций.
При проектировании окон надо придерживаться стилистического единства всех окон в приложении, которому способствует возможность в C++Builder создания иерархии форм.
Появившийся в C++Builder5 компонент Frame - фрейм позволяет один раз разработать некий повторяющийся фрагмент окна, поместить его в Депозитарий, а затем использовать его в разных формах и приложениях.
11.1.8. Последовательность фокусировки элементов.
При проектировании приложения важно правильно определить последовательность табуляции оконных компонентов.
Способы задания фокусировки элементов: - через свойства формы: ActiveControl и TabOrder; - программное переключение фокуса - это метод SetFocus, например, Edit2 > SetFocus().
ActiveControl- устанавливает компонент, который будет в фокусе в первый момент.
TabOrder- задание последовательности табуляции между компонентами формы; в C++Builder имеется специальная команда Edit Tab Order, позволяющая в режиме диалога задать последовательность табуляции всех элементов. Значение свойства TabOrder играет роль только, если другое свойство компонента - TabStop установлено в true и если компонент имеет родителя. Например, для формы свойство TabOrder имеет смысл только в случае, если для формы задан родитель в виде другой формы. Установка TabStop в false приводит к тому, что компонент выпадает из последовательности табуляции и ему невозможно передать фокус клавишей Tab (однако, передать фокус мышью, конечно можно).
11.1.9. Подсказки и контекстно-зависимые справки.
Приложение должно предельно облегчать работу пользователя, снабжая его системой подсказок, помогающих сориентироваться в приложении. Эта система включает в себя:
Ярлычки, которые всплывают, когда пользователь задержит курсор мыши над каким-то элементом окна приложения. В частности, такими ярлычками обязательно должны снабжаться быстрые кнопки инструментальных панелей, поскольку нанесенные на них пиктограммы часто не настолько выразительны, чтобы пользователь без дополнительной подсказки мог понять их назначение.
Кнопка справки в полосе заголовка окна, позволяющая пользователю посмотреть во всплывающих окнах назначение различных элементов окна.
Более развернутые подсказки в панели состояния или в другом отведенном под это месте экрана, которые появляются при перемещении курсора мыши в ту или иную область окна приложения.
Встроенную систему контекстно-зависимой оперативной справки, вызываемую по клавише F1.
Раздел меню Справка, позволяющий пользователю открыть стандартный файл справки Windows .hlp, содержащий в виде гипертекста развернутую информацию по интересующим пользователя вопросам.
Тексты ярлычков и подсказок панели состояния устанавливаются для любых визуальных компонентов в свойстве Hintв виде строки текста, состоящей из двух частей, разделенных символом вертикальной черты '|'. Первая часть, обычно очень краткая, предназначена для отображения в ярлычке; вторая более развернутая подсказка предназначена для отображения в панели состояния или ином заданном месте экрана. Например, в кнопке, соответствующей команде открытия файла, в свойствеHintможет быть задан текст: Открыть|Открытие текстового файла
Как частный случай, в свойстве Hintможет быть задана только первая часть подсказки без символа '|'.
Для того чтобы первая часть подсказки появлялась во всплывающем ярлычке, когда пользователь задержит курсор мыши над данным компонентом, надо сделать следующее: 1. Указать тексты свойства Hintдля всех компонентов, для которых вы хотите обеспечить ярлычок подсказки. 2. Установить свойстваShowHint(показать подсказку) этих компонентов в true или установить в true свойствоParentShowHint(отобразить свойствоShowHintродителя) и установить в true свойствоShowHintконтейнера, содержащего данные компоненты.
Конечно, вы можете устанавливать свойства в true или false программно, включая и отключая подсказки в различных режимах работы приложения.
При ShowHint, установленном в true, окно подсказки будет всплывать, даже если компонент в данный момент недоступен (свойство Enabled = false).
Если вы не задали значение свойства компонента Hint, но установили в true свойствоShowHintили установили в true свойствоParentShowHint, a в родительском компонентеShowHint= true, то в окне подсказки будет отображаться текст Hint из родительского компонента.
Правда, все описанное выше справедливо при значении свойства ShowHintприложенияApplicationравном true (это значение задано по умолчанию). Если установитьApplication->ShowHintв false, то окна подсказки не будут появляться независимо от значенийShowHintв любых компонентах.
Свойства Hintкомпонентов можно также использовать для отображения текстов заключенных в них сообщений в какой-то метке или панели с помощью функцийGetShortHintиGetLongHint, первая из которых возвращает первую часть сообщения, а вторая - вторую (если второй части нет, то возвращается первая часть). Например, эти функции можно использовать в обработчиках событий OnMouseMove, соответствующих прохождению курсора мыши над данным компонентом. Так обработчик: void fastcall TForml::ButtonlMouseMove(TObject *Sender, TShiftState Shift, int X, int У) { TControl *Send = (TControl *)Sender; Panel1->Caption = GetShortHint(Send->Hint); Panel2->Caption = GetLongHint(Send->Hint); } отобразит в панели Panel1 первую, а в панели Panel2 - вторую часть свойстваHintвсех компонентов, над которыми будет перемещаться курсор, если в этих компонентах в событии OnMouseMove указан этот обработчик ButtonlMouseMove. Причем это не зависит от значения их свойстваShowHint.
Еще один пример. Пусть вы хотите, чтобы при нажатии некоторой кнопки Buttonl вашего приложения в панели Panel1 высвечивалась подсказка пользователю, например, "Укажите имя файла", а сама кнопка имела всплывающий ярлычок подсказки с текстом "Ввод". Тогда вы можете задать свойству Hintэтой кнопки значение "Ввод|Укажите имя файла", задать значение true свойствуShowHint, а в обработчик события нажатия этой кнопки вставить оператор Panell->Caption = GetLongHint(Buttonl->Hint);
Если же вы не хотите отображать ярлычок подсказки для кнопки, то можете ограничиться значением Hint, равным "Укажите имя файла", а приведенный выше оператор оставить неизменным или заменить на эквивалентный ему в данном случае оператор Panel1->Caption = GetShortHint(Button1->Hint); или даже просто на оператор>br? Panell->Caption = Buttonl->Hint;
Перед тем моментом, когда должен отобразиться ярлычок какого-нибудь компонента, возникает событие приложения OnShowHint. В обработчике этого события можно организовать какие-то дополнительные действия, например, изменить отображаемый текст. Особенно легко работать с событиями приложения, начиная в C++Builder 5, в котором появился компонентApplicationEvents, перехватывающий все эти события (см. подроб-нее в разд. 4.6). В обработчик его событияOnShowHintможно поместить те операторы, которые надо выполнить перед отображением ярлычка. Заголовок этого обработчика имеет вид: void __fastcall TForml::ApplicationEventslShowHint( AnsiString SHintStr, bool SCanShow, THintInfo &HintInfo)
Здесь передаваемый по ссылке параметр HintStr- отображаемый в ярлычке текст. В обработчике этот текст можно изменить. Так же по ссылке передается параметрCanShow. Если в обработчике установить его равным false, то ярлычок отображаться не будет. Третий параметр, передаваемый по ссылке -HintInfo. Это струк-тура, поля которой содержат информацию о ярлычке: его координаты, цвет, задержки появления и т.п. В частности, имеется полеHintControl- компонент, сообщение которого должно отображаться в ярлычке, и поле HintStr - отображаемое сообщение. По умолчаниюHintInfo.HintStr- первая часть свойстваHin компонента. Но в обработчике это значение можно изменить.
Имеется еще один способ отображения второй части сообщения, записанного в Hint, в строке состояния или какой-то области экрана в моменты, когда курсор мыши проходит над компонентом - это использование обработки события приложенияOnHint. Это событие не того компонента, над которым проходит курсор мыши, а именно приложения - объектаApplication. Начиная с C++Builder 5 это событие также перехватывается компонентом ApplicationEvents. Если обработчик этого события определен, то в момент прохождения курсора над компонентом, в котором задано свойство Hint, вторая часть сообщения компонента заносится в свойство Hint объекта Application. Если свойствоHintкомпонента содержит только одну часть, то в свойствоHintобъектаApplicationзаносится эта первая часть.
Если ваше приложение содержит инструментальную панель с быстрыми кнопками, то, как правило, эти кнопки должны снабжаться не только всплывающими ярлычками, но и развернутыми подсказками в панели состояния. Если у вас есть подобный пример, вы можете опробовать на нем методику отображения подсказок в панели состояния. А можете взять какой-нибудь более простой пример. Для реализации подсказок в панели состояния надо перенести на форму панель состояния - компонент StatusBar со страницы Win32. Если вам нужна односекционная панель, установите свойства SimplePanel и AutoHintпанели StatusBar в true. Больше ничего делать не требуется - свойствоAutoHintобеспечит автоматическое отображение подсказок. Запустите приложение на выполнение. Вы увидите, что тексты подсказок отображаются в панели состояния, когда курсор мыши перемещается над тем или иным окном редактирования. Причем это не мешает появляться ярлычкам, отображающим тексты окон.
Если вы используете многосекционную панель состояния, то свойство AutoHint обеспечит отображение подсказок только в первой секции. Для отображения подсказок в другой секции надо перенести на форму компонент ApplicationEvents и в обработчик его события OnHintкомпонента вставить оператор StatusBarl->Panels->Items[I]->Text = Application->Hint; где I - индекс секции.
Более подробные пояснения пользователю может дать контекстно-зависимая справка, встроенная в приложение. Она позволяет пользователю нажать в любой момент клавишу F1 и получить развернутую информацию о том компоненте в окне, который в данный момент находится в фокусе. Для того чтобы это осуществить, надо разработать для своего приложения файл справки .help. Как это сделать, подробно описано в [1]. Затем надо в каждом компоненте, для которого вы хотите обеспечить контекстно-зависимую справку, задать свойства, обеспечивающие ссылку на соответствующую тему.
В версиях, младше C++Builder 6, такое свойство одно - HelpContext. Это номер темы, который задается в проекте справки специальной таблицей [MAP], содержащей эти условные номера и соответствующие им идентификаторы тем. В C++Builder 6 появилось еще два свойства: HelpKeyword и HelpType. Первое из них является идентификатором темы, содержащимся в сноске К. А второе определяет, каким свойством - HelpContext или HelpKeyword задается ссылка на тему. Если HelpType = htContext - используется свойство HelpContext; если HelpType = htKeyword - используется свойство HelpKeyword.
Если HelpContext компонента равен нулю, то данный компонент наследует это свойство от своего родительского компонента. Например, для всех компонентов, размещенных на некоторой панели можно задать Help-Context = 0, а для самой панели задать отличное от нуля значение HelpContext, соответствующее теме, описывающей назначение всех компонентов панели.
Для того чтобы все это работало, надо выполнить команду Pro|ect | Options и в окне Project Options (опции проекта) на странице Application (приложение) установить значение опции Help file, равное имени подготовленного файла .hlp. Это приведет к тому, что в головном файле проекта появится оператор вида: Application->HelpFile = "<имя файла>.hlp";
В этом операторе используется метод HelpFiIe, определяющий файл справки, к которому обращается проект. Этот метод и подобный оператор можно использовать в приложении в любом обработчике события, если в какие-то моменты требуется сменить используемый файл справки.
Если предполагается, что файл справки будет расположен в том же каталоге, где находится само приложение, то имя файла и в окне Опции проекта, и в приведенном выше операторе надо задавать без указания пути. Иначе приложение, работающее на вашем компьютере, перестанет работать на компьютере пользователя, у которого каталоги не совпадают с вашими.
Для того чтобы приложение в свойствах HelpContext могло ссылаться на какой-то номер контекстной справки, в файле проекта справки .hpj в разделе [MAP] надо поместить таблицу соответствия использованных значений HelpContext и тем файла .hlp.
В заключение поговорим о традиционном разделе меню Справка, позволяющем пользователю открыть файл справки .hlp и получить развернутую информацию по всем вопросам, связанным с данным приложением. В обработчик события при выборе данного раздела меню или при нажатии соответствующих кнопок помощи вставляются операторы вида Application->HelpContext(<номеp темы>);
Задаваемые в этих операторах номера тем аналогичны используемым при задании свойств HelpContext. Это номер той темы, которая первой отобразится при открытии окна справки. А в дальнейшем пользователь, как обычно, может перейти, работая с программой справки, к любой интересующей его теме.
Имеется еще несколько методов объекта Application, обеспечивающих работу со справочными файлами.
Еще один механизм подсказок, связанный с файлом справок .hlp - кнопка справки, присутствующая в заголовках многих современных окон Windows. Нажав ее, пользователь может подвести курсор мыши, изменивший свою форму на вопросительный знак, к какому-то компоненту, щелкнуть и во всплывшем окне появится развернутая подсказка, поясняющая назначение данного компонента. Для того чтобы ввести такую возможность в свое приложение, надо установить в true подсвойство byHelp свойства BorderIcons вашей формы. Однако не для всех форм это вызовет появление в заголовке окна кнопки справки. Кнопка появится только в случае, если свойство BorderStyle формы установлено в bsDialog. Никакого программирования работа с кнопкой справки не требует. Все будет выполняться автоматически. Достаточно предусмотреть в файле .hlp соответствующие темы и сделать на них ссылки в свойствах HelpContext компонентов. Эти темы будут появляться при соответствующих действиях пользователя во всплывающих окнах.
Палитра компонентов (рис. ) - это витрина библиотеки визуальных компонентов (Visual Component Library - VCL). Она позволяет сгруппировать компоненты в соответствии с их смыслом и назначением. Эти группы или страницы снабжены закладками. Вы можете изменять комплектацию страниц, вводить новые страницы, переставлять их, вносить на страницы разработанные вами шаблоны и компоненты и т.д.
-
Standard
Стандартная, содержащая наиболее часто используемые компоненты
Additional
Дополнительная, являющаяся дополнением стандартной
Win32
32-битные компоненты в стиле Windows 95/98 и NT
System
Системная, содержащая такие компоненты, как таймеры, плееры и ряд других
Data Access
Доступ к данным, в C++Builder 6 большинство компонентов, размещавшихся ранее на этой странице, перенесено на страницу BDE
Data Controls
Компоненты отображения и редактирования данных
dbExpress
Связь с данными с помощью dbExpress (начиная с C++Builder 6)
DataSnap
Компоненты для связи с сервером приложений при построении многопоточных приложений, работающих с данными (начиная с C++Builder 6 и не во всех вариантах C++Builder)
BDE
Доступ к данным через Borland Database Engine - BDE (начиная с C++Builder 6, ранее эти компоненты размещались на странице Data Access)
ADO
Связь с базами данных через Active Data Objects (ADO) - множество компонентов ActiveX, использующих для доступа к информации баз данных Microsoft OLE DB (начиная с C++Builder 5)
InterBase
Прямая связь с Interbase, минуя Borland Database Engine (BDE) и Active Data Objects (ADO) (начиная с C++Builder 5)
WebServices
Компоненты клиентский приложений Web, использующие доступ к службам Web с помощью SOAP (начиная с C++Builder 6)
InternetExpress
Построение приложений InternetExpress - одновременно приложений сервера Web и клиента баз данных с параллельными потоками (начиная с C++Builder 5)
Internet
Компоненты для создания серверов Web
WebSnap
Компоненты для создания серверов Web, содержащих сложные страницы, управляемые данными (начиная с C++Builder 6 и не во всех вариантах C++Builder)
FastNet
Различные протоколы доступа к Интернет (начиная с C++Builder 5)
Decision Cube
Компоненты для многомерного анализа данных (не во всех вариантах C++Builder)
QReport
Компоненты для подготовки отчетов
Dialogs
Диалоги, системные диалоги типа "Открыть файл" и др.
Win 3.1
Windows 3.x, компоненты в стиле Windows 3.x
Samples
Образцы, различные интересные, но не до конца документированные компоненты
ActiveX
Примеры компонентов ActiveX
COM+
Компонент, дающий доступ к каталогу СОМ+, содержащему данные по конфигурации СОМ+
Servers
Компоненты связи с серверами СОМ (начиная с C++Builder 6, в C++Builder 5 на этой странице размещались компоненты, перенесенные теперь на страницу Office2k)
IndyClients
Компоненты клиентских приложений Internet Direct (Indy), дающих доступ к различным протоколам Интернет из приложений Delphi, C++Builder, Kylix (начиная с C++Builder 6)
IndyServers
Компоненты серверных приложений Internet Direct (Indy) (начиная с C++Builder 6)
IndyMisk
Различные вспомогательные компоненты приложений Internet Direct (Indy) (начиная с C++Builder 6)
InterBase Admin
Компоненты доступа к службам InterBase
Office2k или Office97
Оболочки VCL для распространенных серверов СОМ офисных приложений Microsoft (начиная с C++Builder 5, но там эти компонента размещались на странице Servers)
Поскольку число страниц в C++Builder 6 велико и не все закладки видны на экране одновременно, в правой части палитры компонентов имеются две кнопки со стрелками, направленными влево и вправо. Эти кнопки позволяют перемещать отображаемую на экране часть палитры. Кроме того, в C++Builder 6 в контекстном меню палитры компонентов, всплывающем при щелчке на палитре правой кнопкой мыши, имеется раздел Tabs. При выборе этого раздела вы увидите алфавитный перечень страниц библиотеки и сможете переключиться на указанную вами страницу.
Чтобы перенести компонент на форму, надо открыть соответствующую страницу библиотеки и указать курсором мыши необходимый компонент. При этом кнопка-указатель , размещенная в левой части палитры компонентов, приобретет вид не нажатой кнопки. Это значит, что вы находитесь в состоянии, когда собираетесь поместить компонент на форму. Если вы нажмете эту кнопку, это будет означать, что вы отказались от размещения выбранного компонента.
Поместить выбранный в палитре компонент на форму очень просто - надо сделать щелчок мышью в нужном месте формы. Есть и другой способ поместить компонент на форму - достаточно сделать двойной щелчок на пиктограмме компонента в палитре, и он автоматически разместится в центре вашей формы. Если вы выбрали компонент, а затем изменили ваше намерение размещать его, вам достаточно нажать кнопку указателя. Это прервет процесс размещения компонента, и программа вернется в нормальный режим, в котором вы можете выбирать другой компонент или выполнять какую-то команду.
Имена компонентов, соответствующих той или иной пиктограмме, вы можете узнать из ярлычка, появляющегося, если вы задержите над этой пиктограммой курсор мыши. Если вы выберете в палитре компонент и нажмете клавишу F1, то вам будет показана справка по типу данного компонента. Тут надо сразу сделать одно замечание. Имена на ярлычках выглядят, например, так: MainMenu, Button и т.д. Однако в C++Builder все имена классов в действительности начинаются с символа "Т", например, TMainMenu, TButton. Под такими именами вы можете найти описания соответствующих компонентов во встроенной в C++Builder справочной системе.