О документе

Справочник советов и примеров по C++Builder

Версия 7 от 11.10.2003

В справочнике собраны советы и примеры для программистов программирующих на С++Builder. Советы и примеры лудше компилировать на C++Builder 5 и выше. Справочник оформлен в виде CHM-файла.

Для того что бы не искать какие советы или примеры новые я ввёл некоорые обозначения:
[+] - новый совет или пример
[!] - ошибка в совете или примере (надеюсь их будет мало)
[*] - дополненный совет или пример
Эти скобки будут стоять перед название примера или совета

Источниками советов и примеров, вошедших в эту подборку, являются различные сайты, "офф-лайновых" публикаций. Хочу надеятся что так же что мне будут присылать письма с советами и примерами читатели справочника, так что присылайте свои советы и примеры и я обязательно опубликую их в справочнике и укажу вас в качестве автора.
Хочу отметить сайты с которых взята большая часть советов и примеров:
http://www.bcbdev.ru - C++Builder на русском
http://www.vcl.ru - Сайт по VCL
http://borland.xportal.ru - Сайт по программированию на C++Builder, Delphi, JBuilder

Если в примере или совете вы встретили незнакомую функцию или объявление переменой то смотрите справку поставляемую с C++Builder.

Официальная страница "Справочник советов и примеров по C++Builder" расположена на сайте http://newcb.narod.ru Там можно скачать rar-архив или zip-архив последней версии подборки.

Подборка советов и примеров ведётся с марта 2003 г.

Подборку советов и примеров ведёт Кононевич Станислав
Компиляция в CHM и сопровождение сайта Кононевич Станислава


Структура справочника

Цветами обозначается следующее:
синим - ссылки
зелёным - коментарии к примерам и советам
красным - автор примера или совета
  • Справочная информация - различная справочная информация
  • Компоненты - примеры и советы по работе с компонентами
  • Система - примеры и советы по работе с системными функциями и параметрами
  • Экран и рабочий стол - различные примеры работы с экраном и рабочим столом
  • Графика и мультимедиа - работа с графикой и мультимедией
  • Программа - примеры что можно сделать с вашеё программой
  • Диски и файлы - здесь вы найдёте примеры и советы как работать с файлами и дисками при помощи С++Builder
  • Время и даты - все что связано с временем и датами
  • Форма - различные примеры и советы по формам программ
  • Строки - работа со строками
  • Устройства - здесь показано как программно работать с устроствами компьютера
  • Редактор - настройки оболочки С++Builder
  • Клавиши - имитация нажатия клавиш и много другое
  • Разное - различные примеры и советы не относящиеся ни к одному из разделов

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

По вашим просьбам я могу изменить структуру справочника, т.е дополнить или удалить раздел, объединить или разделить отдельные разделы. Так что всё зависит от вас.


Практическая работа с компилятором С++Builder

Содержание

  1. Ключевые положения объектно-ориентированного программирования.
  2. Расширения файлов, принятые в среде разработки C++Builder 6.
  3. Алгоритм создания программного кода на C++.
  4. Создание и сохранение нового проекта.
  5. Открытие и использование менеджера проектов.
  6. Планирование работ - список to-do list.
  7. Задание информации о версии программы.
  8. Работа с формами.
    1. Включение в проект новой формы.
    2. Просмотр форм и модулей без включения их в проект.
    3. Размещение компонентов на форме.
    4. Repository - Депозитарий - Хранилище форм и проектов.
  9. Инструментальные средства поддержки разработки кода.
    1. Применение Code Insight - знатока кода.
    2. Исследователь классов ClassExplorer.
    3. Поддержка разработки, встроенная в окно редактора кода.
    4. Справочная система C++Builder и программа ее конфигурирования OpenHelp.
  10. Отладка приложений.
    1. Компиляция и компоновка проекта.
    2. Сообщения компилятора и компоновщика.
    3. Выполнение приложения по шагам.
    4. Точки прерывания.
    5. Использование окна инспектора отладки bug Inspector.
  11. Разработка графического интерфейса пользователя.
    1. Требования к интерфейсу пользователя приложений для Windows.

Приложение № 1 "Быстрые кнопки"
Приложение № 2 "Палитра компонентов"

1. Ключевые положения объектно-ориентированного программирования

В идеальном случае подход к разработке программы делится на три части: вначале получить ясное понимание задачи, потом выделить ключевые идеи, входящие в ее решение, и наконец выразить решение в виде программы.

Объект - это совокупность данных и способов работы с ними. Инкапсуляция - это механизм объединения и защиты данных и кода. Объект - это то, что поддерживает инкапсуляцию. Объединение кода и данных представляет собой "черный" ящик. Объект характеризуется свойствами. Свойства объекта - это данные, методы обра-щения с данными объекта, события, на которые объект может реагировать. Данные объекта представляются полями или записями. Внутри объекта коды и данные могут быть закрытыми (private) для этого объекта или от-крытыми (public). Источниками событий могут быть действия пользователя или результат работы самих объ-ектов. К числу действий пользователя можно отнести: перемещение курсора мыши, нажатие кнопок мыши или клавиш клавиатуры. Обработчик событий отлавливает прерывания осуществляемых действий пользователя или работы других объектов и согласно свойств и методов, определенных у объекта, выполняет запрограммированное событие. Если событие произошло, то выводится соответствующее сообщение.

В C++Builder все объекты компонентов размещаются в объектах - формах. Для каждой формы, которую вы проектируете в своем приложении, C++Builder создает отдельный модуль. Именно в модулях и осуществляется программирование задачи. В обработчиках событий объектов - форм и компонентов, вы помещаете все свои алгоритмы. В основном они сводятся к обработке информации, содержащейся в свойствах одних объектов, и задании по результатам обработки свойств других объектов. При этом вы постоянно обращаетесь к методам различных объектов.

1. Структура программы является динамическим образованием, меняющемся в процессе работы программы.
1.1. С целью организации динамического распределения памяти во все объекты заложены методы их создания - Конструкторы и уничтожения - Деструкторы.
1.2. Включать объекты в свою программу можно двумя способами:
- вручную включать в нее соответствующие операторы (это приходится делать не очень часто) или
- путем визуального программирования, используя заготовки - компоненты.
1.2.1. Типы объектов и, в частности, компонентов библиотек C++Builder оформляются в виде классов. Классы - это типы, определяемые пользователем. В классах описываются свойства объекта, его методы и события, на которые он может реагировать.
1.3. Существует возможность создавать модули, не привязанные к конкретным формам. Чтобы создать в Вашем проекте новый модуль, не связанный с какой-либо формой, надо выполнить команду File => New => Other и в открывшемся окне New Items на странице New щелкнуть на пиктограмму Unit.
1.3.1. Полезно создавать в приложении модуль, не связанный с формой, в который помещать описание типов данных, констант, переменных, функций, используемых другими модулями.
2. В С++Builder можно разрабатывать прикладные программы двух видов - автономные выполняемые файлы *.exe и программы с поддержкой пакетов (packages) времени выполнения.
2.1. Во время отладки надо включать поддержку пакетов времени выполнения:
Project => Options => страница Packages => (1), (2):
(1) включить индикатор Build with runtime packages,
(2) включение индикатора Default обеспечит статус установки по умолчанию для всех ваших будущих проектов.
2.2. При заключительной компиляции надо выключить опцию поддержки пакетов, если Вы намерены передавать пользователям автономный выполняемый модуль.
3. С целью создания уникальных программ старайся придерживаться правила повторного использования кода.

2. Расширения файлов, принятые в среде разработки С++Builder 6

Таблица № 1.
Расширения файлов С++Builder 6.
П/п | Расширение | Краткое описание файла с расширением
1 | *.cpp | Файл головной функции WinMain
2 | *.bpr | Файл установок опций проекта
3 | *.res | Файл, содержащий ресурсы проекта
4 | *.cpp | Файл реализации модуля
5 | *.h | Заголовочный файл модуля
6 | *.dfm | Файл формы, которой соотвествует файл модуля *.cpp
7 | *.hpp | Заголовочный файл компонента
8 | *.bpg | Файл группы проектов
9 | *.bpl | Файл самого проекта (файл пакета)
10 | *.bpk | Файл, определяющий компиляцию и компоновку пакета (файл пакета)
11 | *.dsk | Файл рабочего стола проекта (файл создается, если включена опция оболочки Autosave Options / Project desktop
12 | *.~bp | Файл резервной копии
13 | *.~df | Файл резервной копии
14 | *.~cp | Файл резервной копии
15 | *.~h | Файл резервной копии
16 | *.exe | Исполняемый файл приложения
17 | *.obj | Объектный файл модуля
18 | *.dll | Динамически присоединяемая DLL
19 | *.tds | Файл таблицы символов (для отладки)
20 | *.il? | Файлы выборочной компоновки
21 | *.hlp | Файлы справки
22 | *.wmf | Файл изображения или графический файл
23 | *.bmp | Файл изображения или графический файл
24 | *.ico | Файл изображения или графический файл
25 | *.todo | Файл со списком задач для конкретного проекта

Важные добавления к таблице:
1. Расширения важнейших файлов: *.cpp, *.h, *.dfm, *.bpr, *.res.

3. Алгоритм создания программного кода на С++.

Конструирование многих программ логически можно разделить на три этапа:
(1) Этап инициализации, на котором происходит инициализация переменных программы.
(2) Этап обработки, на котором происходит ввод данных и соответствующая настройка переменных программы.
(3) Этап завершения программы, на котором происходит вычисление и вывод окончательных результатов.
В составе программного модуля выделяются:
(1) Главная функция.
(2) Заголовочные файлы. Стандартное расширение заголовочных файлов - .h.
(3) Файлы реализации. Стандартное расширение файлов реализации - .cpp.

  1. В окне главного модуля *.cpp написать в комментарии написать имя файла с программой.
  2. Написать комментарий, выражающий назначение программы /* назначение программы */ или //:
    2.1. Комментарий в программном коде предназначен для облегчения восприятия программного кода. Комментарий можно разбить он не вызывает каких-либо действий. Синтаксис комментария в языках программирования выражается: (1), (2)
    (1) в языке программирования Си : /* текст комментария */
    (2) в языке программирования Си++: // текст комментария
    (2.1) в языка программирования С++ допустима запись комментария в виде: /* текст комментария */
    (3) ANSI-стандартом запрещено вкладывать комментарии друг в друга.
  3. Включить в программный код с помощью директивы препроцессора #include (1) и / или (2) и/или (3):
    (1) <:> - : стандартный заголовочный файл, т.е. файл стандартной библиотеки функций С++,
    (2) ":" - : имя подключаемого файла из библиотеки функций пользователя, так называемые функции, определяемые программистом, т.е. заголовочный файл,
    (3) IM - : идентификатор макроса
  4. Объявить глобальные переменные с их типами, область действия которых будет область действия файла.
    4.1. Написать комментарий, раскрывающий описание и назначение глобальных переменных.
  5. Написать оператор (-ы) , определяющий прототип (-ы) для функции (-й) пользователя, располагающихся в файле головной функции main ( ), эти прототипы должны содержать: (1), (2), (3), (4)
    (1) тип возвращаемого значения функции пользователя
    (2) заголовок функции, который должен быть уникальным
    (3) в круглых скобках список параметров с указанием типа возвращаемого параметра
    (4) такой оператор, должен заканчиваться операцией "точка с запятой"
    (5) после операции "точка с запятой" надо вставить комментарий с описанием назначения функции
    5.1. Такой оператор включается после написания функции пользователя, имеющей также обязательный оператор return в своем теле, в файле головной программы. Старайтесь применять метод повторного использования кода.
  6. Сформировать шаблон головной функции main ( ).
    • 	Справочно: В написании тела программы могут возникнуть следующие типы ошибок: синтаксические, логические и/или фатальные. Определение функции имеет следующий формат:
тип_возвращаемого_значения имя_функции (список_параметров, включающий тип_каждого_параметра)
{ 	объявления;
операторы;
}
    • Справочно: Имя главной функции программного модуля определено как: (1) или (2)
      (1) main - для консольных приложений (работающих с Win32);
      (2) WinMain - для приложений Windows.
    • Справочно: Тело программы строится из управляющих структур. Тело структуры представляет оператор, который может быть простым или составным. Приняты следующие способы соединения управляющих структур: вложение одной управляющей структуры в другую и следование управляющих структур одна за другой. Структур выбора:
      • Условной операции: ' ?:' ;
      • Структура единичного выбора: if (с одним входом и одним выходом);
      • Структура с двойным выбором: if / else ;
      • Структура со множественным выбором: switch.
      Структур повторения:
      • Цикл: while
      • Цикл: do / while
      • Цикл: for
      Выделяют следующие типы повторения:
      • Определенное повторение - это повторение, управляемое счетчиком.
      • Неопределенное повторение - это повторение, управляемое контрольным значением.
      Последовательных структур

    6.1. Определить спецификацию главной функции main ( ): (1) или (2)
    (1) (void) - это значит, что функция не возвращает никакого значения - пример, void F1(void);
    (2) или ( ) - это значит, что если тип возвращаемого значения не указан, то он по умолчанию считается равным int - пример, void F1( ).
    (3) Первая из приведенных записей предпочтительнее, так как делает программу более переносимой.
    6.1.1. При необходимости указать тип возвращаемых значений переменных в функции main (тип1, тип2, :).
    6.2. Поставить скобки "{", "}", означающие начало и конец тела головной функции main ( ).
    6.2.1. В теле главной функции (и не только главной функции) допустимы следующие типы комментариев:

    • Описывающие назначение переменных,
    • Комментарии типа подсказки,
    • Исключение из комментариев: сообщения об ошибках ввода данных.
    6.3. В теле функции main ( ) {тело головной функции} объявить переменные области действия функции, а именно: (1), (2), (3), (4)
    (1) перед типом переменной в случае необходимости указывается спецификатор класса памяти идентификатора
    (1.1) Справочно: Каждая переменная характеризуется некоторым классом памяти, который определяет ее время жизни - период, в течение которого эта переменная существует в памяти. Спецификация класса памяти идентификатора определяет его класс памяти, область действия и пространство имен. Класс памяти, в частности, определяется местом объявления переменной. В C++Builder имеется четыре спецификации класса памяти:
    • auto, registr - автоматический класс памяти с локальным временем жизни,
    • extern, static - статический класс памяти с глобальным временем жизни.
    (2) в случае необходимости после спецификатора класса памяти указывается модификатор const или volatile, которые сообщают компилятору об изменчивости или постоянстве определяемого объекта.
    (2.1) Если переменная описана как const, то она недоступна в других модулях программы, ее нельзя изменять в других во время выполнения программы. Единственная возможность присвоить ей значение - это инициализация при определении. Объекту с модификатором const не только нельзя присваивать значения, но и для него запрещены операции инкремента (++) и декремента ( -- ). Указатель, определенный с модификатором const, нельзя изменять, однако может быть изменен объект, который им адресуется.
    (2.2) Модификатор volatile отмечает, что в процессе выполнения программы значение объекта может изменяться в промежутке между явными обращениями к нему. Например, на объект может повлиять внешнее событие. Поэтому компилятор не должен помещать его в регистровую память и не должен делать никаких предположений о постоянстве объекта в те моменты, когда в про-грамме нет явных операций, изменяющих значение объекта.
    (2.3) Диалекты языка С++ также включают следующие модификаторы:
    • cdecl - для функций и переменных;
    • pascal - для функций и переменных;
    • interrupt - для функций обработки прерываний;
    • near - для указателей, функций, переменных;
    • far - для указателей, функций, переменных;
    • huge - для указателей и функций.
    Эти модификаторы предназначены для влияния на распределение памяти при размещении объектов и учета особенностей сегментной организации и адресации памяти в процессорах семейства 80х86.
    (3) тип переменной (данных)
    (3.1) Помните, что переменная может быть простая и вычисляемая. Поэтому для вычисляемых переменных используйте операцию приведения типов, чтобы программа корректно выполняла вычисления.
    (3.2) Если программиста по каким -либо причинам не устраивает тот тип, который компилятор приписывает константе, то он может явным образом повлиять на его выбор. Для этого служат суффиксы, например, L, l (long), U, u (unsigned), которые ставятся перед типом переменной.
    (4) идентификатор (имя) переменной
    (4.1) Требования к идентификатору:
    • Длина идентификатора должна быть больше или равна 31 символа;
    • Особенности написания идентификаторов:
      - Идентификатор не должен начинаться с цифры;
      - Ключевые или зарезервированные слова Языка прогр. не применимы как идентификаторы;
      - Идентификаторы нельзя разбивать.
    • Виды идентификаторов в зависимости от регистра написания:
      - в нижнем регистре,
      - в верхнем регистре,
      - начинающийся с заглавной буквы.
    • Виды областей действия идентификатора:
      - область действия функции,
      - область действия файла,
      - область действия блока, - область действия прототипа функции.
    (5) комментарий, раскрывающий описание и / или назначение вводимых переменных 6.3.1. Возможна инициализация переменных при их объявлении. Инициализация переменных при их объявлении уменьшает время выполнения программы. Переменная, представляющая изображение фиксированного числового, строкового или символьного (литерного) значения называется константой (ли-тералом). Константы делятся на пять групп:
    • целые (десятичные, восьмеричные, шестнадцатеричные);
    • вещественные (с плавающей точкой);
    • перечислимые;
    • символьные (литерные);
    • строковые (строки или литерные строки).
    6.3.1.1. Инициализация переменных может быть произведена одним из следующих способов:
    • Значением присваиваемым непосредственно;
    • Значением присваиваемым по адресу.
    6.3.1.2. В теле функции должны быть предусмотрены операторы, выдающие сообщения об ошибках ввода данных. Поэтому целесообразно вводить условие на проверку контрольного значения, которое используется в структурах повторения:
    - Синонимы термина "контрольное значение": сигнальное значение, фиктивное значение или флаговое значение.
    - Нельзя в качестве контрольного значения выбирать значение, которое является допустимым значением данных.

4. Создание и сохранение нового проекта.

 Надо отвести для каждого проекта новый каталог.
Способы начинания нового проекта:
  • File => New => (1) - (6)
    (1) Application
    (2) CLX Application
    (3) Data Module
    (4) Form
    (5) Frame
    (6) Unit
  • File => New => Other => Окно New Items => соответствующие Вкладки Окна New Items: (1) - (11 ) (1) New:
    - Control Panel Module
    - Service
    - Control Panel Application
    - Resource DLL Wizard
    - Service Application
    - Web Server Application
    - Project Group
    - Application
    - DLL Wizard
    - Package
    - Form
    - Frame
    - Data Module
    - Unit
    - Cpp File
    - C File
    - Header File
    - Thread Object
    - Text
    - Component
    - Library
    - Console Wizard
    - Bath File
    - CLX Application
    - CLX Form
    - CLX Frame
    - CLX Data Module
    - CLX Thread Object
    - XML Data Binding
    - Report
     (2) ActiveX:
    (3) Multitier:
    (4) Forms:
    (5) Dialogs:
    (6) Projects:
    (7) Data Modules:
    (8) Business:
    (9) Web Documents:
    (10) WebSnap:
    (11) WebServices:
  • Соответствующая быстрая кнопка

После создания приложения с пустой формой, надо сразу сохранить его в нужном каталоге. И в течение работы надо почаще выполнять сохранение. Проект нужно сохранить под осмысленным именем. В С++Builder недопустимы одинаковые имена файлов модулей и файла проекта.

Способы сохранения проекта:

  • File => Save All
  • Соответствующая быстрая кнопка
Способы открытия проекта:
  • File => Open Project
  • File => Reopen
  • Соответствующая быстрая кнопка
  • Автооткрытие при загрузке последнего рабочего проекта устанавливается: Tools => Environment Options => страница Preferences => группа опций AutoSave Options => включить индикатор Project desktop
  • Открытие головного файла проекта: Project => View Source.

5. Открытие и использование менеджера проектов.

Project Manager (Менеджер проектов) - это инструмент управления группами проектов, например, проектами клиента и сервера; проектом, создающим библиотеку DLL, и проектом, использующим ее.

Открытие менеджера проектов: View => Project Manager: (1), (2), [(3)]
(1) New - добавление в группу нового проекта
(2) Remove - удаление выделенной "строки" (модуля или формы как объекта в менеджере проек-тов)
[(3)] При нажатии правой кнопки мыши => всплывающее меню: (1), (2), (3), (4):(N)

  • Open - открыть
  • Remove From Project - удалить из проекта
  • Save - сохранить
  • Save As - сохранить как
  • (N) :
Задание локальных опций компиляции:
Окно менеджера проектов => Выделить узел файла *.cpp или *.c => щелчок правой кнопкой мыши => Контекстное меню: (1), (2)
(1) раздел Edit Local Options:
Revert All - отказ от выбранных ранее опций
(2) раздел Change Override Color - изменение цвета выделения локальных опций

6. Планирование работ - список To-Do List.

 *.todo - файл со списком задач для конкретного проекта.
" View => To Do list - просмотр списка задач текущего проекта

7. Задание информации о версии программы.

 команда Project => Options => страница Version Info, опции "Include version information in project" которой: (1), (2)
(1) если выделена, то все окна только для чтения,
(2) если не выделена - для редактирования.

8. Работа с формами.

Основным элементом любого приложения является форма - контейнер, в котором размещаются другие визуальные и невизуальные компоненты. С точки зрения пользователя форма - это окно, в котором он работает с приложением. Каждой новой форме, видимой в приложении, соответствует свой модуль (unit), описывающий эту форму как класс и включающий, если необходимо, какие-то дополнительные константы, переменные, функции и процедуры.

Надо задавать уникальное имя формы в свойстве Name. О наступлении случая совпадения имен выдается следующее предупреждение: "The project already contains a form or module named Form 1", которое означает "Проект уже содержит форму или модуль с именем Form1".

8.1. Включение в проект новой формы.

8.1.1. Способы включения в проект новой формы:
  • File => New Form
  • Соответствующая быстрая кнопка
8.1.2. Способы включения в проект ранее разработанных форм:
  • Project => Add to Project
  • Соответствующая быстрая кнопка
  • Копирование соответствующих файлов из одного каталога в другой, т.е. файлов: *.cpp, *.h, *.dfm.
  • Выполнить команду File => Open и затем команду File => Save As, тогда С++Builder автоматически скопирует файлы, описывающие форму.
  • Добавление формы из ДЕПОЗИТАРИЯ: выполнить команду File => New => Other, в открывшемся окне New Items на страницах Form and Dialogs можно заимствовать ряд форм для своего проекта. Форма заимствования определяется тремя радиокнопками: (1), (2), (3)
(1) Copy - копировать
(2) Inherit - наследовать
(3) Use - использовать

В случае совпадения имен добавляемых файлов надо перейти в окно редактора кода добавляемого приложения и сохранить конфликтующий модуль командой File => Save As в каталоге "нового" приложения, дав ему новое имя. В случае включения формы способами 8.1.2. , форма становится общей для обоих приложений, изменение которой отразиться в обоих приложениях.

8.2. Просмотр форм и модулей без включения их в проект.

Потребность в просмотре возникает при работе над своим проектом в связи с желанием ознакомиться с примерами форм и модулей, близкими к задаче решаемой Вами в данный момент.
  • Для просмотра надо выполнить команду: File => Open => Выбрать файл модуля в Окне Редактора Кода => Скопировать через буфер обмена Clipboard какие-то операторы или компоненты в свои модули.
  • Для закрытия надо выполнить команду: На коде открытого модуля щелкнуть правой кнопкой мыши => Выполнить команду Close Page.
  • Аналогичным образом в окне Редактора Кода можно просматривать текстовые файлы и файлы HTML

8.3. Размещение компонентов на форме.

 В Интегрированной Среде Разработки компоненты представлены пиктограммами.

8.3.1. Перенос компонентов со страниц библиотеки на форму.
(1) Открыть соответствующую страницу Палитры компонентов
(2) Найти на Странице компонентов соответствующий компонент
(3) Двойной щелчок на компоненте, чтобы он появился на активной форме
(3.1) Размещение на форме нескольких компонентов одного типа:
- Удерживая клавишу Shift, щелчок на пиктограмме компонента => щелчок на активной форме в месте, где должны появиться компоненты.

  • Удалить ошибочно перенесенный компонент на форму очень просто: выделите его и нажмите клавишу Delete.
  • При переносе компонента на форму надо сразу изменить его имя Name, принятое по умолчанию, на другое осмысленное имя.
  • Способы изменения визуальных параметров компонента:
- буксировка компонента в нужное место на форме,
- изменение размеров компонента на форме

8.3.2. Поиск компонента по его имени и страницы, на которой он расположен.
View => Component List => Откроется диалоговое окно Components, содержащее алфавитный список компонентов => В окне быстрого поиска по имени "Search by name " написать имя искомого компонента => Выделить искомый компонент: (1), (2), (3)
(1) F1 - справка по выделенному компоненту
(2) Для появления компонента на форме нажать кнопку Add to form или
(3) Для появления компонента на форме двойной щелчок мыши на выбранном компоненте.

8.3.3. Родители и владельцы компонентов Parent и Owner

  • Способы размещения компонентов на форме:
    - непосредственно на форме;
    - на панели группы компонентов
  • У каждого компонента есть родитель:
    (1) Форма - тогда родителем и владельцем компонента является сама форма;
    (2) Другой оконный компонент - тогда для компонента родителем становиться эта панель:
    (2.1) А значит, дочерние компоненты будут расположены в Z-последовательности, которая определяет какой из них будет виден.
  • Родитель компонента указывается в Инспекторе Объектов в его (групповом?) свойстве Parent, которое раскрывается в таблице:
Тип компонента | Название свойства компонента в Object Inspector | Принимаемое значение свойством | Что отражает свойство компонента при соответствующем значении?
Виз. К. | ParentFont | true(falce) | Наследование от родительского компонента атрибутов шрифта
Виз. К. | ParentShowHint | true(falce) | Наследование от родительского компонента атрибута показа ярлычков
Виз.О.К. | ParentCtl3D |  | Наследование от родительского компонента атрибута оформления
Виз.К. | Left Top |  | Измерение в системе координат родительского компонента положения левого верхнего угла дочернего компонента
Виз.К. | Anchors |  | Определение привязки дочерних компонентов к границам родительского компонента
Виз.К. | Visible(видимый) | true(falce) | Установка невидимости не только видимости родительского компонента, но и всех его дочерних компонентов
Виз.К. + | Enabled(доступный) | true(falce) | Установка значения свойства в родительском компоненте закрывает / открывает доступ к дочерним компонентам, т.е. пользователь не сможет нажимать кнопки и производить любые другие действия в пределах данного родительского компонента

8.3.3.1. Многослойное размещение компонентов на форме

  • При помещении панелей друг на друга получается многослойное размещение компонентов на форме. Для переноса компонента с панели на панель используется Clipboard.
  • Схема переноса компонента через Clipboard, тогда компонент пренесется из Clipboard на новое место и обретет нового родителя - панель или форму:
    (1) Выделить курсором переносимый компонент;
    (2) Вырезать выделенный компонент в Clipboard следующими способами:
    (2.1) Командой Edit => Cut или
    (2.2) Горячей клавишей Ctrl-X.
    (3) Щелчок на форме или панели, куда переносится компонент, сопровождается следующими действиями:
    (3.1) Командой Edit => Paste или
    (3.2) Горячей клавишей Ctrl-V.
  • Управление видимостью оконных компонентов: панелей, кнопок, окон редактирования, осуществляется щелкнув правой кнопкой мыши и выбором соответствующей команды:
    (1) Edit => Bring To Front - перемещение выделенного оконного компонента на верх Z-последовательности,
    (2) Edit => Send To Back - перемещение выделенного оконного компонента на самый низ Z-последовательности.

8.3.4. Поиск "пропавших" компонентов

Способы поиска "пропавших" компонентов:
(1) Инспектор Объектов => самый верхний выпадающий список => выбор по имени "пропавшего" компонента, тогда пропавший компонент будет отмечен маркером.
(2) Еще один способ найти компонент на форме - выделение его вершины в окне Object Tree-View, смотри раздел 8.3.5.
(3) Дополнительно смотри п. 8.3.3.1. : управление видимостью оконных компонентов.

8.3.5. Окно Object TreeView и страница диаграмм Редактора Кода

  • Object TreeView - дерево объектов для отображения всех визуальных и невизуальных компонентов приложения в аспекте связей этих компонентов.
  • Вызов окна Object TreeView выполняется командой View => Object TreeView, в котором можно перетаскиванием дочернего компонента менять родителя.
  • Связи между компонентами можно документировать в виде диаграммы:
    - Окно Редактора Кода => Страница Diagram => (1), (2), (3):
    (1) выпадающий список активной диаграммы и быстрые кнопки для создания, редактирования, удаления диаграммы;
    (2) окно Name - имя диаграммы;
    (3) окно Description - текстовое описание диаграммы.
  • Для создания диаграммы надо из окна Object TreeView перетащить в поле Диаграммы интересующие компоненты; автоматически появляются стрелки, показывающие заданные связи между компонентами.

8.3.6. Работа с группой компонентов, выравнивание компонентов по размеру и положению

  • Способы выделения группы компонентов:
    - при расположении компонентов непосредственно на форме обвод курсором рамки вокруг компонента;
    - держа нажатой клавишу Shift выделить компоненты, расположенные на разных формах и которые войдут в группу выделенных компонентов.
  • Операции с выделенной группой компонентов: (1) одновременное перемещение, потянув курсором;
    (2) задавать для всей группы в Инспекторе Объектов общие свойства: шрифт, оформление и т.п.;
    (3) задать общий для всех компонентов группы обработчик какого-то события;
    (4) скопировать всю группу в буфер обмена Clipboard:
    (4.1) Командой Edit => Copy или
    (4.2) Горячей клавишей Ctrl-C.
    (5) вставить в другую форму (на панель) скопированную группу компонентов:
    (5.1) Командой Edit => Paste или
    (5.2) Горячей клавишей Ctrl-V.
    (6) выравнивание по размеру и взаимному расположению.
  • Способы выравнивание по размеру и взаимному расположению:
    (1) Из Строки главного меню Edit:
    - Edit => Align - выравнивание размещения;
    - Edit => Size - выравнивание размеров;
    - Edit => Scale - масштабирование.
    (2) Из Строки контекстного меню Position, вызываемого щелчком правой кнопки мыши по выделенному компоненту (-ам):

    - команда Size => окно Size: (1), (2)
    (1) Левая часть окна - Width устанавливает ширину компонентов:

    • No change - не изменять;
    • Shrink to smallest - уменьшить до размеров минимального из компонентов группы;
    • Shrink to smalgest - увеличить до размера максимального из компонентов группы;
    • Width - ширина компонента в пикселях.
    (2) Правая часть окна - Height - высота компонентов аналогично ширине.

    - команда Align => окно Alignment: (1), (2)
    (1) Левая часть окна - Horizontal устанавливает выравнивание компонентов по горизонтали:

    • No change - не изменять;
    • Left sides - выровнять компоненты по их левым сторонам;
    • Center - выровнять компоненты по их центрам;
    • Right sides - выровнять компоненты по их правым сторонам;
    • Space equally - разместить с равными интервалами между компонентами;
    • Center in window - расположить в центре окна.
    (2) Правая часть окна - Vertical устанавливает выравнивание компонентов по вертикали:
    • No change - не изменять;
    • Tops - выровнять компоненты по их верхним сторонам;
    • Center - выровнять компоненты по их центрам;
    • Bottoms - выровнять компоненты по их нижним сторонам;
    • Space equally - разместить с равными интервалами по вертикали между компми;
    • Center in window - расположить в центре окна

    - View => Alignment Palette - палитра выравнивания.
    - Edit => Scale - пропорциональное изменение масштабов всего расположения на форме; в окне диалога опция Scaling factor отображает масштабируемый коэффициент в %.

8.3.7. Фиксация компонентов

  • Фиксация компонентов нужна как защита от случайных сдвигов выровненных компонентов.
  • После размещения и выравнивания компонентов их местоположение полезно зафиксировать.
  • Для установки фиксации / разблокировки фиксации используется команда Edit => Controls: (1), (2)
    (1) первичное выполнение этой команды - зафиксирует местоположение компонентов;
    (2) повторное использование этой команды разблокирует фиксацию.

8.4. Repository - Депозитарий - хранилище форм и проектов.
  • Депозитарий позволяет не просто хранить формы, но и наследовать их, т.е. создавать иерархию форм.
  • В Депозитарий можно включать не только формы и фреймы, но и целые проекты: Project => Add To Repository - этой командой возможно включение проекта в Депозитарий только в режиме Copy, то есть скопировать проект и далее сохранить его под другим именем.
  • Команда вызова Repository : File => New => Other, далее откроется диалоговое окно New Items, в котором можно: (1), (2), (3)
    (1) выбрать включенные в C++Builder готовые формы,
    (2) воспользоваться мастерами,
    (3) использовать Депозитарий для хранения собственных разработок: форм, проектов.
  • Способы использования форм из окна New Items:
    - Copy - копировать, только работа с копией формы,
    - Inherit - наследовать, для изменения формы в модулях проекта;
    - Use - использовать, для изменения базовой формы как в проек-ых модулях, так и в Депозитарии.
  • Набор вспомогательных команд:
    - Project => Remove from Project (или соответствующая быстрая кнопка) - удаление пустой формы из проекта;
    - File => New => Other - включение в проект формы из Депозитария или взять проект из Депози-тария;
    - Tools => Repository - удаление объектов (форм, проектов) из Депозитария;
    - File => Save As - сохранение формы, проекта.
  • Окно Депозитария New Items => Щелчок правой кнопкой мыши вызывает контекстное меню => раздел Properties => Окно Object Repository: (1) - (7)
    (1) Add Page - добавить страницы Депозитария,
    (2) Delete Page - удалить,
    (3) Rename Page - переименовать,
    (4) Edit Object - отредактировать информацию об объекте,
    (5) Delete Object - удалить выделенный объект,
    (6) New Form - Флажок включен, то выделенная форма, а не пустая, будет включаться в проект при выполнении команды File => New => Form,
    (7) Main Form - Флажок главной формы включен, то выделенная форма (не пустая) будет появляться как главная.
  • Перед занесением формы в Депозитарий ее модуль должен быть обязательно сохранен в файле: Щелчок на форме правой кнопки мыши => Контекстное меню: (1), (2)
    (1) Раздел Add To Repository: (1) - (4)
    (1) Title - название вашей формы,
    (2) Description - более развернутое пояснение,
    (3) Autor - сведения об авторе,
    (4) Browse - выбор пиктограммы для формы;
    (2) Раздел View Detals - отображение пояснений к формам.
    (*) После выполнения всех этих процедур щелкните на кнопке ОК и ваша форма окажется включенной в Депозитарий.

9. Инструментальные средства поддержки разработки кода.

9.1. Применение Code Insight - Знатока Кода.
  • Code Insight - инструмент, встроенный в окно Редактора Кода, и может оказать большую помощь при написании кода и его отладке.
  • Code Insight может работать в двух режимах автоматическом и не автоматическом. Если у Code Insight отключен авторежим, то вызвать его можно нажатием Ctrl - Shift - пробел или Ctrl - пробел.
  • Функции, которые может выполнять Code Insight в виде подсказок к объявлениям: (1) - (5)
    (1) завершение кода в виде списка, который может быть отсортирован, например, командой Sort by Name - отсортировать по алфавиту;
    (2) выдача списка параметров и их типов для функций, процедур, методов;
    (3) выбор шаблонов, вызов которых осуществляется нажатием клавиш Ctrl-J;
    (4) оценка выражений, в том числе, возможность увидеть текущее значение оцениваемой величины;
    (5) выдача информации об идентификаторах Code browser (клавиша Ctrl нажата - усиливаются возможности Code browser).

9.2. Исследователь Классов ClassExplorer.
  • Исследователь Классов ClassExplorer показывает структуру проекта в виде дерева всех типов, классов, свойств, методов, глобальных переменных и глобальных функций, содержащихся в модуле, открытом в Редакторе Кода, также с помощью этого инструмента возможно создавать заготовки реа-лизации.
  • Появление Окна Исследователя Классов по умолчанию - автоматическое, которое можно отключить в опции Automatically show Explorer на странице ClassExplorer при выполнении команды Tools => Environment Options.
  • Вызов Исследователя Кода осуществляется командой View => ClassExplorer.
  • При щелчке по объекту в Окне Исследователя Классов происходит перемещение на строку с объявлениями. Это перемещение можно сделать так:
    - Контекстное меню => разделы: (1), (2), (3)
    (1) Go to Declaration - перемещение на строку к объявлениям;
    (2) Go to Implementation - переход курсора на реализацию функции;
    (3) Class Hierarchy - открывает отдельное окно иерархии классов, содержащее практически ту же информацию, что и окно ClassExplorer (за исключением функций), но в более удобном виде.

9.3. Поддержка разработки, встроенная в окно Редактора Кода.
  • Способы получения контекстной справки в окне Редактора Кода:
     (*) Установить курсор на имени какого-то свойства, метода, функции и нажать клавишу F1 - отобразиться справка по интересующему вас вопросу; (*) Щелчок правой кнопкой мыши на имени объекта => Контекстное меню: (1), (2), (3)
    (1) раздел Find Declaration - найти объявление;
    (2) команда Close Page - выгрузить посторонний модуль из окна Редактора Кода;
    (3) раздел Open File at Cursor - подгрузка файла, объявленного директивой #include, в окно Редактора Кода.
  • Контекстная справка построена на двух библиотеках компонентов VCL and CLX, то при запросе о классе, свойстве, методе будет предложено минимум два файла справки. При разработке приложе-ния для Windows надо выбирать файл VCL, а не файл CLX - идущий, как правило, первой строкой.
  • Возможности навигации в коде и использование закладок по шагам: (1) - (8)
    (1) Установить курсор в нужной строке;
    (2) Щелкнуть правой кнопкой мыши;
    (3) Выполнить команду Toggle Bookmarks;
    (4) Выбрать нажатием левой кнопки мыши закладку, привязываемую к строке кода, которая будет помечена пиктограммой;
    (5) Удаление закладки происходит при щелчке по ней левой или правой кнопкой мыши.
    (6) Возврат к введенной закладке осуществляется командой Goto Bookmarks и в аналогичном списке закладок выбрать нужную.
    (7) Сочетание клавиш Ctrl - K - цифра - установка закладки в строке, где цифра - номер закладки;
    (8) Для одновременного просмотра кода с двумя закладками и более надо открыть второе окно редактирования командой контекстного меню New Edit Window - удобен также если интересую-щие фрагменты кода находятся в разных файлах.

9.4. Справочная система C++Builder и программа ее конфигурирования OpenHelp.

 Справка в C++Builder может вызываться из меню Help. Это меню имеет, в частности, разделы:

C++Builder Help | вызов справки по C++Builder и C++
C++Builder Tools | вызов справок по инструментарию C++Builder 6
Windows SDK | вызов справок по Windows
STLport Help | вызов справки по стандартной библиотеке шаблонов (Standard Template Library), реализованной в виде файлов HTML

Способы получения контекстной справки:

  • в разделе Главного меню Help через Интернет;
  • непосредственно в разделе Главного меню;
  • из любого окна C++Builder можно получить контекстно-зависимую справку;
  • выделением на форме компонента, нажать F1, чтобы получить тему справки по выделенному комп.;
  • находясь в окне Редактора Кода, установите курсор на имени какой-то функции, свойства или метода какого-то компонента и нажмете F1, то вам также будет показана справка по интересующему вас вопросу; так же можно получить контекстную справку о свойстве компонента из окна Инспектора Объектов, выделив соответствующее свойство.

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

Если вас интересует справка по C++ или C++Builder, то в подобных случаях можно посоветовать выходить на требуемую тему через страницу справки Содержание. Если вам требуется информация о компоненте, свойстве, методе, событии, то наиболее удобно раскрыть на этой странице книжку "Visual Component Library Reference" (Обзор библиотеки визуальных компонентов), затем раскрыть "Alphabetical Object and Component Listing" (Алфавитный список объектов и компонентов) и в этом списке отыскать по алфавиту требуемый компонент. А из окна справки компонента всегда можно найти все его свойства, методы и события.

Если вам нужно найти справку по функциям, объявленным в библиотеке компонентов, и обычный контекстный поиск не помогает, то удобно на странице справки Содержание открыть книжку "Visual Component Library Reference" (Обзор библиотеки визуальных компонен-тов), затем раскрыть "Alphabetical Routines Listing" (Алфавитный список функций) или "Categorical Routines Listing" (Список функций по категориям), а затем найти нужную функцию в соответствующем разделе.

Если вам нужно найти справку по типам и функциям С или C++, то удобно на странице справки Содержание открыть одну из книжек "С Runtime Library Reference" (Обзор библиотеки С) или "Standard C++ Library". В соответствующих подразделах вы найдет списки всех функций и типов.

Для получения справки по API Windows, по сообщениям Windows и т.п. надо воспользоваться разделом Windows SDK меню Help. Контекстные справки по Windows из окон ИСР C++Builder не вызываются.

Настройка справочной системы.
Вызов программы Borland OpenHelp командой Help | Customize. Окно этой программы показано на рис. OpenHelp предоставляет вам простой путь конфигурирования файлов справки .hlp. При этом можно добавлять и убирать файлы справки, которые будут появляться в таблице содержания и в предметном указателе справки. В частности, можно встроить в систему собственные справочные файлы на русском языке. Рис. Окно OpenHelp с открытой страницей Contents.

OpenHelp хранит информацию о справочной системе в проекте. Файл этого проекта имеет расширение .ohp и хранится в каталоге /Help. Вы можете изменить состав справочной системы: таблицы Содержание (Contents), таблицы Предметный Указатель и контекстной справки, доступ к которой осуществляется из ИСР C++Builder клавишей F1.

OpenHelp позволяет также удалить ссылки системного реестра на устаревшие файлы справки. Дело в том, что нередко системный реестр и файл WINHELP.INI загромождаются ссылками на устаревшие файлы справок. Вы можете быстро очистить от них реестр, выполнив в окне OpenHelp команду File Clean Registry

Ниже изложена методика модификации справочной системы.
Таблица Содержание хранится в файле с расширением .toc, подобном файлам содержания Windows .cnt, только без предложений Include. Чтобы добавить файлы в таблицу Содержание, надо сделать следующее:
1. Перейти в окне OpenHelp на страницу Contents (см. рис.).
2. Выполнить команду Edit | Add Files.
3. Выбрать или написать имена одного или более добавляемых файлов .toc или .cnt.
4. Щелкнуть на ОК.
5. Вы можете переместить файл на желательное вам место среди других файлов. Для этого выделите файл и переместите его, пользуясь кнопками со стрелками на странице Contents.
6. Выполнить команду File | Save Project или File | Save Project As. Для удаления файла из таблицы Содержание надо:
1. Перейти в окне OpenHelp на страницу Contents.
2. Выделить удаляемые файлы.
3. Выполнить команду Edit | Remove.
4. Выполнить команду File | Save Project или File | Save Project As.

Таблица Предметный Указатель хранит ссылки на файлы справок .hlp. Чтобы добавить файлы в таблицу Предметный Указатель или удалить файлы из нее надо произвести те же операции, которые были рассмотрены выше, но только работать на странице Index и добавлять или удалять файлы .hlp. Контекстно-зависимый поиск справки состоит из файлов .hlp, доступных с помощью так называемых макросов ALink. Эти макросы используются в C++Builder при нажатии клавиши F1 в Инспекторе Объектов, Редакторе Кодов, палитре компонентов. Чтобы добавить файлы в контекстно-зависимый поиск, надо произвести те же операции, которые описаны выше, но на странице Link.

10. Отладка приложений.

10.1. Компиляция и компоновка проекта.

 Способы выполнения и задания опций компиляции приложения:

(1) команда Run => Run (производится выполнение приложения после компиляции);
(2) горячая клавиша F9 (производится выполнение приложения после компиляции);
(3) Cancel - прервать процесс компиляции;
(4) команда Run => Parameters - передача параметров перед компиляцией;
(5) команда Project => Compile Unit - компиляция отдельного модуля в obj-файл;
(6) команда Project => Make Project - компиляция модулей, тексты которых изменены с момента предыдущей компоновки проекта, в obj-файл, а затем в exe-файл (не производится выполнение приложения);
(7) команда Project => Build Project - компиляция всех модулей независимо от того, когда они в последний раз изменялись (не производится выполнение приложения, подходит при изменениях в опциях компиляции);
(8) Еще команды компиляции: Project => Make All Project и Project => Build All Project подобны командам Make и Build, но при работе с группой проектов;
(9) команда Tools => Environment Options => страница Preferences => опция Background Compilation включена, то компиляция будет производиться в фоновом режиме.

О фоновом режиме компиляции.

Если фоновый режим компиляции отключен, то после окончания компиляции рассмотрен-ными командами в Окне компиляции и компоновки появляется одно из трех итоговых сооб-щений: (1), (2), (3)
(1) "Done: Make" - "Результат: выполнено";
(2) "Done: There are errors" - "Результат: имеются ошибки";
(3) "Done: There are warnings" - "Результат: имеются предупреждения".

10.2. Сообщения компилятора и компоновщика.

  • Просматривайте все замечания компилятора и старайтесь найти и устранить причины, вызвавшие эти замечания. Игнорируя их, вы рискуете снизить надежность и эффективность своего приложения.
  • Выдача компилятором всех своих замечаний устанавливается: Project => Options => страница Compiler => группа опций Warning => опция All включенная.
  • Двойной щелчок мышью на предупреждении в Окне замечаний приводит к выделению строки в Окне Редактора Кода, в которой может быть скрыта ошибка.
  • Включение Окна замечаний в Окне Редактора Кода:
    (1) щелчок правой кнопки мыши в Окне Редактора Кода,
    (2) выбор в контекстном меню команды Message Viev.
  • Включение опции вывода на экран значений переменных: (1), (2)
    (1) View => Debug Window => Watchers или
    (2) Подвести курсор к переменной и нажать Ctrl-F5.

10.3. Выполнение приложения по шагам.

Чаще для того, чтобы найти причину ошибки, надо выполнить какой-то фрагмент программы, наблюдая изменения переменных при выполнении каждой команды.

Для прохода фрагмента программы по шагам можно использовать команды:

Команда | Горячие" клавиши | Пояснения
Step Over (По шагам без захода в...) | F8 | Пошаговое выполнение строк программы, считая вызов функции за одну строку, т.е. вход в функции не производится.
Trace Into (Трассировка с захо-дом в...) | F7 | Пошаговое выполнение программы с заходом в вызываемые функции.
Trace to Next Source Line (Трас-сировка до следующей строки) | Shift+F7 | Переход к следующей исполняемой строке.
Run to Cursor (Выполнить до курсора) | F4 | Команда выполняет программу до того выполняемого оператора, на котором расположен курсор в окне редактора кода.
Run Until Return (Выполнить до выхода из функции) | Shift+F7 | Выполнение программы до выхода из текущей функции, останов на операторе, следующем за вызовом этой функции.
Show Execution Point (Показать точку выполнения) | -- | Команда помещает курсор на операторе, который будет выполняться следующим.

10.4. Точки прерывания.

Чтобы ввести простую (безусловную) точку прерывания, достаточно в окне Редактора Кода щелкнуть мышью на полоске левее кода требуемой строки. Строка окрасится в красный цвет и на ней появится красная точка. Если вы теперь запустите приложение на выполнение и начнете с ним работать, то произойдет прерывание выполнения, как только управление перейдет к строке, в которой указана точка прерывания.

Такая точка прерывания дает тот же результат, что и описанное ранее выполнение до точки, указанной курсором, при нажатии клавиши F4. Но преимущество точек прерывание заключается в том, что их можно одновременно указать несколько в разных местах кода и в разных модулях. Приложение будет выполняться до тех пор, пока управление не перейдет к первой встретившейся в программе точке прерывания. Кроме того, как мы скоро увидим, в этих точках можно устанавливать условия прерывания.

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

Точки прерывания можно устанавливать только на выполняемых операторах.
Условные точки прерывания - мощный инструмент отладки приложений, содержащих циклы.

10.5. Использование окна Инспектора Отладки Debug Inspector.

В C++Builder 6 и 5 имеется еще одно средство отладки - Инспектор Отладки Debug Inspector. Инспектор Отладки позволяет вам получить исчерпывающую информацию о любой переменной в приложении и дает возможность, как и окно оценки и модификации Evaluate/Modify, изменить значение пе-ременной и продолжить выполнение приложения с этим новым значением.

Вызов этого инструмента осуществляется командой Run | Inspect, которая доступна только во время выполнения приложения при останове средствами отладки или вследствие генерации исключения. При останове вы можете поставить курсор в окне Редактора Кода на имя интересующей вас переменной и выполнить команду Run | Inspect. Другой способ - вызвать ту же команду из всплывающего меню (Debug | Inspect). Ну, а проще всего - нажать "горячие" клавиши Alt+F5. Попробуйте сделать это при генерации исключения в нашем тестовом приложении. Если после прерывания выполнения вы поставите курсор на пустое место в коде и вызовите Инспектор Отладки, перед вами откроется окно, в котором вы можете написать имя интересующей вас переменной, например, А и щелкнуть ОК. Инспектор Отладки позволяет исследовать различные данные: переменные, массивы, классы, функции, указатели. Находясь в окне Инспектора Отладки, можно щелкнуть правой кнопкой мыши и выбрать одну из команд:

Range | Просмотр данных в заданном диапазоне.
Change | Перейти в окно Change для изменения значения элемента.
Show Inherited | Если этот флаг включен, то на страницах окна отображаются все свойства и методы, как объявленные в данном классе, так и наследуемые. Если флаг выключен, то отображается только то, что объявлено в данном классе.
Show Fully Qualified Names | Отображение наследуемых элементов с их полными именами.
Inspect | Открывает новое окно для выделенного вами элемента данных. Это позволяет детальнее исследовать данные типа структур, классов, массивов и т.п. и только для таких данных этот раздел доступен.
Descend | Аналогична команде Inspect, но детализирующие данные появляются не в отдельном, а в том же самом окне. В дальнейшем можно вернуться в исходное окно, воспользовавшись расположенным вверху окна выпадающим списком, в котором накапливаются просмотренные объекты.
New Expression | Эта команда позволяет вам задать новое выражение для анализа.
Type Cast | Позволяет вам указать другой тип для рассматриваемого объекта, например, указать тип нетипизированного указателя.

11. Разработка графического интерфейса пользователя.

CUI - Graphical User Interface - графический интерфейс пользователя

11.1. Требования к интерфейсу пользователя приложений для Windows

11.1.1. Общие рекомендации по разработке графического интерфейса.

Работая с различными программами Windows, графический интерфейс пользователя любой серьезной программы должен включать в себя:

  • Главное меню. Реализуется компонентом MainMenu или с помощью компонентов ActionManager и ActionMainMenuBar
  • Инструментальную панель быстрых кнопок, дублирующих основные разделы меню. Чаще всего это компонент ТооlBаг. Если панель большая, то целесообразно использовать ее совместно с компонентом PageScroller, обеспечивающим ее автоматическую прокрутку. Если у вас несколько инструментальных панелей и желательно дать пользователю возможность их перестроения, то панели ТооlBаг целесообразно разме-щать в компонентах СооlBаг или ControlBar. Панель, настраиваемую пользователем, проще всего делать на основе компонентов ActionManager и ActionToolBar.
  • Контекстные меню (реализуется компонентом PopupMenu), всплывающие при щелчке пользователя правой кнопкой мыши на том или ином компоненте.
  • Продуманную последовательность переключения фокуса управляющих элементов .
  • Клавиши быстрого доступа ко всем разделам меню и всем управляющим элементам, "горячие" клавиши для доступа к основным командам.
  • Ярлычки подсказок, всплывающие при перемещении курсора мыши над быстрыми кнопками и иными компонентами.
  • Полосу состояния (реализуется компонентом StatusBar), используемую для развернутых подсказок и выдачи различной информации пользователю.
  • Файл справки, темы которого отображаются при нажатии клавиши F1 или при выборе пользователем соответствующего раздела меню.
  • Информацию о версии, доступную пользователю при щелчке на пиктограмме приложения правой кнопкой мыши.
  • Возможность настройки приложения и запоминания настроек, чтобы при очередном сеансе работы восстанавливались настройки, установленные в прошлом сеансе .
  • Средства установки приложения, регистрации его в Windows и удаления из Windows (это нужно для приложений, которые содержат не один, а несколько файлов. Для простых программ установка, регистрация и удаление не требует специальных средств.).

11.1.2. Многооконные приложения.

Модели управления окнами приложения: (1) SDI - с интерфейсом одного документа, которая предполагает:

  • Наличие одного окна,
  • Возможность создания вторичных окон.
(2) MDI - с интерфейсом множества документов, которая предполагает:
  • Наличие родительского (первичного) окна,
  • Наличие ряда дочерних окон, т.н. окон документов, являющихся однородными. Чтобы создать на основе проектного шаблона прототип приложения для работы в режиме многодокументного интерфейса (MDI), произведите следующие действия: File => New => Application => Окно New Items => Вкладка Projects => пиктограмма MDI Application
11.1.3. Стиль окон приложения.

Характеристики, задающие стиль окон приложения:

  • Доступность кнопок в полосе системного меню или ином окне.
  • Возможность изменения пользователем размеров окна.
  • Название заголовка окна.

Свойства формы:

  • BorderStyle - свойство определяет общий вид окна и операции с ним, которые разрешается выполнять пользователю. Рекомендуемые значения свойства BorderStyle: (1), (2)
    (1) = bsSingle - для основного окна приложения с неизменяемыми размерами - наиболее подходящий стиль;
    (2) = bsDialog - для вторичных диалоговых окон - наиболее подходящий стиль.
  • BorderIcons - свойство определяет набор кнопок, которые имеются в окне заголовка.
  • WindowState - свойство определяет вид, в котором окно первоначально предъявляется пользователю при выполнении приложения. (Обычно целесообразно для главной формы приложения задавать значение Position равным poScreenCenter или poDefaultPosOnly. И только в сравнительно редких случаях, когда на экране при выполнении приложения должно определенным образом располагаться несколько окон, имеет смысл оставлять значение poDesigned, принимаемое по умолчанию.)
  • AutoScrol - свойство определяет: будут ли на форме в процессе выполнения появляться автоматически полосы прокрутки.
  • Icon - свойство задает пиктограмму формы, которая отображается в левом верхнем углу окна приложения в развернутом состоянии. (*) Изменение пиктограммы формы:
    Команда Project => Options => страница Application: (1), (2)
    (1) Title - заголовок, который увидит пользователь в полосе задач при сворачивании приложения.
    (2) Load Icon - позволяет выбрать пиктограмму, которая будет видна в полосе задач при сворачивании приложения или при просмотре пользователем каталога, в котором расположен выполняемый файл приложения.
  • FormStyle - одно из основных свойств формы, которое может принимать значения: (1) - (4)
    (1) fsNormal - окно обычного приложения, это значение FormStyle принято по умолчанию.
    (2) fsMDIForm - родительская форма приложения MDI, т.е. приложения с дочерними окнами, используемого при работе с несколькими документами одновременно.
    (3) fsMDIChild - дочерняя форма приложения MDI.
    (4) fsStayOnTop - окно, остающееся всегда поверх остальных окон Windows.

11.1.4. Цветовое решение приложения.

Большинство компонентов имеют свойство Color (цвет), который вы можете изменять в Инспекторе Объектов при проектировании или программно во время выполнения (если хотите, чтобы цвета в различных режимах работы приложения были разные). Щелкнув на этом свойстве в Инспекторе Объектов, вы можете увидеть в выпадающем списке большой набор предопределенных констант, обозначающих цвета. Все их можно разбить на две группы: статические цвета типа clBlack - черный, cIGreen - зеленый и т.д., и системные цвета типа clWindow - текущий цвет фона окон, clMenuText - текущий цвет текста меню и т.д.

Не злоупотребляйте в приложении яркими цветами Пестрое приложение - обычно признак дилетантизма разработчика, утомляет пользователя, рассеивает его внимание Как правило, используйте системные цвета, которые пользователь может перестраивать по своему усмотрению Из статических цветов обычно имеет смысл использовать только clBlack - черный, clWhite - белый и cIRed - красный цвет предупреждения об опасности.

Единству цветового решения отдельных частей экрана способствует также использование свойства ParentColor. Если это свойство установлено в true, то цвет компонента соответствует цвету содержащего его контейнера или формы. Это обеспечивает единство цветового решения окна и, кроме того, позволяет программно изменять цвет сразу группы компонентов, если вы, например, хотите, чтобы их цвет зависел от текущего режима работы приложения. Для такого группового изменения достаточно изменить только цвет контейнера.

11.1.5. Шрифты текстов.

Шрифт надписей и текстов компонентов C++Builder задается свойством Font, имеющим множество подсвойств. Кроме того, в компонентах имеется свойство ParentFont. Если это свойство установлено в true, то шрифт данного компонента берется из свойство Font его родительского компонента - панели или формы, на которой расположен компонент. Использование свойств ParentFont и ParentColor помогает обеспечить единообразие отображения компонентов в окне приложения.

По умолчанию для всех компонентов C++Builder задается имя шрифта MS Sans Serif и размер - 8. Константа множества символов Charset задается равной DEFAULT_CHARSET. Последнее означает, что шрифт выбирается только по его имени и размеру. Если описанный шрифт недоступен в системе, то Windows заменит его другим шрифтом.

Вы можете при установке вашего приложения узнать, имеется ли на компьютере пользователя нужный шрифт, например, с помощью следующего кода:
if (Screen ->Fonts ->IndexOf ("Arial") == -1)

Другой выход из положения - ввести в приложение команду выбора шрифта пользователем. Это позволит ему выбрать подходящий шрифт из имеющихся в его системе. Осуществляется подобный выбор с помощью стандартного диалога, оформленного в виде компонента FontDialog. Проведенную пользователем установку можно запоминать в файле .ini, в реестре или в другом файле конфигурации и читать автоматически информацию из этого файла при каждом запуске приложения.

11.1.6. Меню.

  • Типы МЕНЮ:
    (1) главное меню с выпадающими списками разделов;
    (2) каскадное меню, в котором разделу первичного меню соответствует список подразделов;
    (3) всплывающее или контекстное меню, появляющееся, если пользователь щелкает правой кнопкой мыши на каком-то компоненте.
  • Компоненты создания меню со страницы палитры компонентов Standard:
    (1) компонент MainMenu - главное меню;
    (2) компонент PopupMenu - всплывающее меню;
    (3) меню, настраиваемое пользователем во время выполнения:
    - компонент ActionManager,
    - компонент ActionMainMenuBar.
  • Основные требования к меню - их стандартизации в части:
    - размещения общепринятых разделов;
    - снабжения главного меню инструментальной панелью;
    - расположения разделов в выпадающем меню, отделенных разделителями по функционально связанным группам разделов;
    - привычности для пользователя названий разделов меню;
    - заканчивания многоточием названий разделов меню, связанных с вызовом диалоговых окон;
    - разделы, к которым относятся каскадные меню должны заканчиваться стрелкой, указывающей на наличие дочернего меню данного раздела;
    - в каждом названии раздела должен быть выделен подчеркиванием символ, соответствующий клавише быстрого доступа к разделу (клавиша Alt плюс подчеркнутый симилл);
    - многим разделам могут быть поставлены в соответствие "горячие" клавиши, позволяющие обратиться к команде данного раздела, даже не заходя в меню (например, "горячие" клавиши Ctrl-X, Ctrl-C, Ctrl-V);
    - многие разделы меню желательно снабжать общеприянятыми пиктограммами;
    - для контроля за управляемостью разделами отдельные разделы должны делаться времен-но недоступными или невидимыми, это осуществляется заданием значения false свойствами раздела Enabled или Visible соответственно.
  • Команды:
    (1) Save As Template - сохранение шаблона меню,
    (2) Insert Form Template - загрузка шаблона меню.

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 компонентов. Эти темы будут появляться при соответствующих действиях пользователя во всплывающих окнах.

Приложение № 1 "Быстрые кнопки"

Пиктограммы | Команда меню / горячие клавиши | Пояснение команды
 | File | New | Other | Открыть проект или модуль из Депозитария
 | File Open File Reopen | Открыть файл проекта, модуля, пакета. Кнопочка со стрелкой справа от основного изображения соответствует команде Reopen, позволяющей открыть файл из списка недавно использовавшихся
 | File Save As File Save (Ctrl-S) | Сохранить файл модуля, с которым в данный момент идет работа
 | File | Save All | Сохранить все (все файлы модулей и файл проекта)
 | File | Open Project (Ctrl-Fll) | Открыть файл проекта
 | Project | Add to Project (Shift-Fll) | Добавить файл в проект
 | Project | Remove from Project | Удалить файл из проекта
 | Help | C++Builder Help | Вызов страницы встроенной справки
 | View Units (Ctrl-F12) | Переключиться на просмотр текста файла модуля, выбираемого из списка
 | View Forms (Shift-F12) | Переключение на просмотр формы, выбираемой из списка
 | View Toggle Form/Unit (F12) | Переключение между формой и соответствующим ей файлом модуля
 | File | New Form | Включить в проект новую форму
 | Run | Run (F9) | Выполнить приложение. Кнопочка со стрелкой справа от основного изображения позволяет выбрать выполняемый файл, если вы работаете с группой приложений
 | Run | Program Pause | Пауза выполнения приложения и просмотр информации CPU. Кнопка и соответствующий раздел меню доступны только во время выполнения приложения
 | Run Trace Into (F7) | Пошаговое выполнение программы с заходом в функции
 | Run | Step Over (F8) | Пошаговое выполнение программы без захода в функции

Приложение № 2 "Палитра компонентов"

Палитра компонентов (рис. ) - это витрина библиотеки визуальных компонентов (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 справочной системе.

Автор: Орлов Андрей
Верстальщик в HTML: Кононевич Станислав


Коды клавиш

Клавиша | Десятичное число | Шестнадцатеричное число | Символическое имя | Сравнение по символу
F1 | 112 | 0x70 | VK_F1 | -
F2 | 113 | 0x71 | VK_F2 | -
F3 | 114 | 0x72 | VK_F3 | -
F4 | 115 | 0x73 | VK_F4 | -
F5 | 116 | 0x74 | VK_F5 | -
F6 | 117 | 0x75 | VK_F6 | -
F7 | 118 | 0x76 | VK_F7 | -
F8 | 119 | 0x77 | VK_F8 | -
F9 | 120 | 0x78 | VK_F9 | -
F10 | 121 | 0x79 | VK_F10 | -
пробел | 32 | 0x20 | VK_SPACE | -
BackSpace | 8 | 0x8 | VK_BACK | -
Tab | 9 | 0x9 | VK_TAB | -
Enter | 13 | 0x0D | VK_RETURN | -
Shift | 16 | 0x10 | VK_SHIFT | -
Ctrl | 17 | 0x11 | VK_CONTROL | -
Alt | 18 | 0x12 | VK_MENU | -
CapsLock | 20 | 0x14 | VK_CAPITAL | -
Esc | 27 | 0x1B | VK_ESCAPE | -
Insert | 45 | 0x2D | VK_INSERT | -
PageUp | 33 | 0x21 | VK_PRIOR | -
PageDown | 34 | 0x22 | VK_NEXT | -
End | 35 | 0x23 | VK_END | -
Home | 36 | 0x24 | VK_HOME | -
курсор ← | 37 | 0x25 | VK_LEFT | -
курсор ↑ | 38 | 0x26 | VK_UP | -
курсор → | 39 | 0x27 | VK_RIGHT | -
курсор ↓ | 40 | 0x28 | VK_DOWN | -
Delete | 46 | 0x2E | VK_DELETE | -
PrintScreen | 44 | 0x2C | VK_SNAPSHOT | -
ScrollLock | 145 | 0x91 | VK_SCROLL | -
0,) | 48 | 0x30 | - | 0
1 ! | 49 | 0x31 | - | 1
2 @ | 50 | 0x32 | - | 2
3 # | 51 | 0x33 | - | 3
4 $ | 52 | 0x34 | - | 4
5 % | 53 | 0x35 | - | 5
6 ^ | 54 | 0x36 | - | 6
7 & | 55 | 0x37 | - | 7
8 * | 56 | 0x38 | - | 8
9 ( | 57 | 0x39 | - | 9
` ~ | 192 | 0xC0 | - | -
- _ | 189 | 0xBD | - | -
= + | 187 | 0xBB | - | -
[ { | 219 | 0xDB | - | -
] } | 221 | 0xDD | - | -
; : | 186 | 0xBA | - | -
' " | 222 | 0xDE | - | -
\ | | 220 | 0xDC | - | -
, < | 188 | 0xBC | - | -
. > | 190 | 0xBE | - | -
/ ? | 191 | 0xBF | - | -
a A | 65 | 0x41 | - | A
b B | 66 | 0x42 | - | B
c C | 67 | 0x43 | - | C
d D | 68 | 0x44 | - | D
e E | 69 | 0x45 | - | E
f F | 70 | 0x46 | - | F
g G | 71 | 0x47 | - | G
h H | 72 | 0x48 | - | H
i I | 73 | 0x49 | - | I
j J | 74 | 0x4A | - | J
k K | 75 | 0x4B | - | K
l L | 76 | 0x4C | - | L
m M | 77 | 0x4D | - | M
n N | 78 | 0x4E | - | N
o O | 79 | 0x4F | - | O
p P | 80 | 0x50 | - | P
q Q | 81 | 0x51 | - | Q
r R | 82 | 0x52 | - | R
s S | 83 | 0x53 | - | S
t T | 84 | 0x54 | - | T
u U | 85 | 0x55 | - | U
v V | 86 | 0x56 | - | V
w W | 87 | 0x57 | - | W
x X | 88 | 0x58 | - | X
y Y | 89 | 0x59 | - | Y
z Z | 90 | 0x5A | - | Z
Win(Л) | 91 | 0x5B | VK_LWIN | -
Win(Пр) | 92 | 0x5C | VK_RWIN | -
На правой клавиатуре при выключенной клавише NumLock
0 | 96 | 0x60 | VK_NUMPAD0 | -
1 | 97 | 0x61 | VK_NUMPAD1 | -
2 | 98 | 0x62 | VK_NUMPAD2 | -
3 | 99 | 0x63 | VK_NUMPAD3 | -
4 | 100 | 0x64 | VK_NUMPAD4 | -
5 | 101 | 0x65 | VK_NUMPAD5 | -
6 | 102 | 0x66 | VK_NUMPAD6 | -
7 | 103 | 0x67 | VK_NUMPAD7 | -
8 | 104 | 0x68 | VK_NUMPAD8 | -
9 | 105 | 0x69 | VK_NUMPAD9 | -
* | 106 | 0x6A | VK_MULTIPLY | -
+ | 107 | 0x6B | VK_ADD | -
- | 108 | 0x6C | VK_SUBTRACT | -
. | 109 | 0x6D | VK_DECIMAL | -
/ | 110 | 0x6E | VK_DIVIDE | -

На вверх


Цветовые константы

Цветовая константа | Цвет
clAqua |
clBlack |
clBlue |
clCream |
clDkGray |
clGray |
clGreen |
clLime |
clLtGray |
clMaroon |
clMedGray |
clMoneyGreen |
clNavy |
clOlive |
clPurple |
clRed |
clSilver |
clSkyBlue |
clTeal |
clWhite |
clYellow |
ClScrollBar | Цвет полос прокрутки
clBackground | Цвет фона рабочего стола
clActiveCaption | Цвет заголовка активного окна
clInactiveCaption | Цвет заголовка неактивного окна
clMenu | Цвет фона меню
clWindow | цвет фона окон
clWindowFrame | Цвет рамок окон
clMenuText | Цвет текста меню
clWindowText | Цвет текста окон
clCaptionText | цвет текста заголовка неактивного окна
clActiveBorder | Цвет юордюра активного окна
clInactiveBorder | Цвет бордюра неактивного окна
clAppWorkSpace | Цвет рабочей области компонента
clHighlight | Цвет фона выделенного текста
clHightlightText | Цвет выделенного текста
clBtnFace | Цвет поверхности кнопок
clBtnShadow | Цвет теней кнопок
clGrayText | Цвет текста недоступных элементов
clBtnText | Цвет текста кнопок
clInactiveCaptionText | Цвет текста заголовка неактивного окна
clBtnHighlight | Цвет выделенной кнопки
cl3DDkShadow | Для Windows95 и NT. Цвет тёмных теней трёхмерных компонентов
cl3DLight | Для Windows95 и NT. Цвет светлых частей трёхмерного компонента
clInfoText | Для Windows95 и NT. Цвет текста всплывающих подсказок
clInfoBk | Для Windows95 и NT. Цвет фона всплывающих подсказок
clGradientActiveCaption | Для Windows98 и Windows2000. Цвет правой стороны градиентной заливки названия активного окна окна.
clGradientInactiveCaption | Для Windows98 и Windows2000. Цвет правой стороны градиентной заливки названия неактивного окна окна.


Команды Windows

 Cписок недокументированные команд, которые задаются в коммандной строке Windows.

rundll32 user,exitwindows | Завершение работы Windows
rundll32 user,wnetconnectdialog | Вызвать окно "Подключение сетевого диска"
rundll32 user,wnetdisconnectdialog | Вызвать окно "Отключение сетевого диска"
rundll32 user,disableoemlayer | Спровоцировать сбой
rundll32 user,repaintscreen | Обновить (как F5)
rundll32 user,setcursorpos | Курсор мыши переместить в левый верхний угол
rundll32 diskcopy,DiskCopyRunDll | Окно "Copy Disk" вызвать
rundll32 rnaui.dll,RnaWizard /1 | Диалог "Установка Связи" вызвать (/1 = без окна)
rundll32 shell,shellexecute Explorer | Окно открыть в корневом каталоге
rundll32 shell32,OpenAs_RunDLL | Окно "Открыть с помощью..." вызвать***
rundll32 shell32,SHFormatDrive | Окно "Форматирование: Диск3,5(А)" вызвать
rundll32 shell32,ShellAboutA | Info-Box (о Windows) вызвать
rundll32 shell32,SHExitWindowsEx 0 | Windows 98 перезагрузить (без autoexec.bat и др.)
rundll32 shell32,SHExitWindowsEx 1 | Работу с Windows 98 закончить
rundll32 shell32,SHExitWindowsEx 2 | Windows-98-PC boot
rundll32 shell32,SHExitWindowsEx -1 | Windows-98-Explorer перезагрузить
rundll32 shell32,Control_RunDLL | Открыть окно "Панель управления"
rundll32 shell32,Control_RunDLL desk.cpl | Открыть "Свойства Экрана"
rundll32 shell32,Control_RunDLL main.cpl @ | Открыть Modul-Панели управления из MAIN.CPL **
rundll32 krnl386.exe,exitkernel | выход из Windows без любых сообщений/вопросов
rundll32 user,swapmousebutton | "Переставить" клавиши мыши *
rundll32 keyboard,disable | "Отключить" клавиатуру *
rundll32 mouse,disable | "Отключить" мышь *
rundll rnaui.dll,RnaDial "провайдер" | Вызвать окно "Установка связи" с именем "провайдер"
rundll32 user,tilechildwindows | переместить все не свёрнутые окна сверху вниз
rundll32 user,cascadechildwindows | переместить все не свёрнутые окна каскадом
rundll32 sysdm.cpl,InstallDevice_Rundll | установить non-Plug&Play оборудование
rundll32 msprint2.dll,RUNDLL_PrintTestPage | выбрать в появившемся меню принтер и послать на него текст
rundll32 user,setcaretblinktime <n> | установить новую частоту мигания <n> курсора *
rundll32 user, setdoubleclicktime <n> | установить новую скорость <n> двойного нажатия *
rundll32 setupx.dll,InstallHinfSection DefaultInstall 130; C:\file.inf | окно "Перезапуск системы. Произвести её сейчас ? · Да/нет ·" ****

* обратные / повторные ("enable") команды не работают
** : 0=Maus, 1=Keyboard, 2=Printer, 3=Fonts, 4=Energie
*** при желании "завязать" программу для расширения *.XSN,
необходимо подставить в строку имя файла
(rundll32.exe shell32.dll,OpenAs_RunDLL file.XSN)
**** минимальный формат файла "file.inf" : [version]
signature="$CHICAGO$" при замене "130" на "132"
произойдёт исталляция "file.inf"

Замечание: Некоторые команды не работают на NT


Edit
  1. Как получить(узнать) выделенный текст
  1. Как получить(узнать) выделенный текст

    Edit->SelText


ListBox
  1. Над каким элементоми находится курсор мыши
  2. Навигация в ListBox при множественном выборе
  3. Как принаведении на элемент длина которого больше длины самого ListBox появлялся Hint
  4. Как узнать количество строк(записей)
  5. Прокрутка ListBox на одну строку вниз
  1. Над каким элементоми находится курсор мыши

    // поместите на форму Form1 компонент ListBox1 и напишите
    // следующий обработчик события OnMouseMove:
     void __fastcall TForm1::ListBox1MouseMove(TObject *Sender,
    TShiftState Shift, int X, int Y)
    {
    if(ListBox1->ItemAtPos(TPoint(X, Y), true) != -1)
    Form1->Caption = ListBox1->Items->Strings[ListBox1->ItemAtPos(TPoint(X, Y), true)];
    }

  2. Навигация в ListBox при множественном выборе

    // разместите на форме ListBox1, установите у него
    // свойство MultiSelect в true, добавьте в ListBox1
    // несколько элементов, разместите также на форме
    // кнопку Button1, в обработчике события OnClick
    // которой напишите следующий код, который будет
    // выводить сообщение для каждого элемента ListBox,
    // выбранного пользователем:
     void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    for(int i = 0; i < ListBox1->Items->Count; i++)
    if(ListBox1->Selected[i])
    ShowMessage(ListBox1->Items->Strings[i]);
    }

  3. Как принаведении на элемент длина которого больше длины самого ListBox появлялся Hint

    // Где нибудь на показывании формы :
     Application->HintPause = 0;
    Application->HintShortPause = 0;
    Application->HintHidePause = 10000000000;
    Application->OnShowHint = TIn4Form->DoShowHint;

void __fastcall TIn4Form::DoShowHint(System::AnsiString &HintStr, bool
&CanShow, THintInfo &HintInfo)
{
  CanShow = true;
  if (HintInfo.HintControl == ListBox1 )
  {
        if( Mouse->Capture )
        {
            CanShow = false;
            return;
        }
     HintInfo.ReshowTimeout = 100;
     /*HintInfo.HintColor = clAqua;// Changes only for this hint*/
     TPoint pnt;
     SIZE strsize;
     int numstr = ListBox1->ItemAtPos(HintInfo.CursorPos,true);
     if(numstr<0)
     {
      CanShow = false;
      Application->HideHint ();
      return;
     }
     HintStr = ListBox1->Items->Strings[numstr];
     strsize = ListBox1->Canvas->TextExtent(HintStr);
     if(strsize.cx<=ListBox1->ClientWidth)
     {
      CanShow = false;
      Application->HideHint ();
      return;
     }
     pnt.x = -1;
     pnt.y =
int(HintInfo.CursorPos.y/ListBox3->ItemHeight)*ListBox1->ItemHeight - 3;
     pnt = ListBox3->ClientToScreen(pnt);
     HintInfo.HintPos.x = pnt.x;
     HintInfo.HintPos.y = pnt.y;
     HintInfo.HintMaxWidth = Screen->Width-pnt.x;
     /*HintInfo.HideTimeout = 100;*/
  }
}
    // Не забудьте поставить ShowHint у интересующего ListBox-а

  4. Как узнать количество строк(записей)

    int i = ListBox1->Items->Count;

  5. Прокрутка ListBox на одну строку вниз

    // Чтобы прокрутить содержимое списка (TListBox) на одну
    // строку вниз, напишите следующий код:
     SendMessage(ListBox1->Handle, WM_VSCROLL, SB_LINEDOWN, 0);


StringGrid
  1. Закрашивание отдельной ячейки
  2. Очистка ячеек в StringGrid (вариант 1)
  3. Очистка ячеек в StringGrid (вариант 2)
  1. Закрашивание отдельной ячейки

    // для закрашивания отдельной ячейки в StringGrid напишите
    // следующий обработчик события OnDrawCell StringGrid
    // (Form1 - форма, на которой размещен StringGrid1,
    // StringGrid1 - экземпляр TStringGrid, ячейка которого
    // закрашивается):
     void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol,
    int ARow, TRect &Rect, TGridDrawState State)
    {
    if (ACol == 2 && ARow == 2) // определяем конкретную ячейку
     {
    StringGrid1->Canvas->Brush->Color = clRed;
    StringGrid1->Canvas->FillRect(Rect);
    }
    }

  2. Очистка ячеек в StringGrid (вариант 1)

    // Для очистки содержимого ячеек в StringGrid (TStringGrid)
    // напишите следующий обработчик (StringGrid1 - сетка,
    // в которой очищаем ячейки, Button1 - кнопка на форме):
     void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    for(int i = 0; i < StringGrid1->ColCount; i++)
    for(int j = 0; j < StringGrid1->RowCount; j++)
    StringGrid1->Cells[i][j] = "";
    }

  3. Очистка ячеек в StringGrid (вариант 2)

    // Для очистки содержимого ячеек в StringGrid (TStringGrid)
    // напишите следующий обработчик (StringGrid1 - сетка,
    // в которой очищаем ячейки, Button1 - кнопка на форме):
     void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    for(int i = 0; i < StringGrid1->RowCount; i++)
    StringGrid1->Rows[i]->Clear();
    }


RichEdit
  1. Как добавить стpокy, чтобы пpи этом кypсоp остался в конце той же строки
  2. Как получить(узнать) выделенный текст
  3. Что сделать чтобы RichEdit открывал/сохранял RTF файлы
  1. Как добавить стpокy, чтобы пpи этом кypсоp остался в конце той же строки

    RichEdit1->Lines->Add("тестовая строка");
    RichEdit1->SelStart = RichEdit1->SelStart - 1;

  2. Как получить(узнать) выделенный текст

    RichEdit->SelText

  3. Что сделать чтобы RichEdit открывал/сохранял RTF файлы

    Свойство PlainText = true


ListView
  1. Получение индекса выделенного элемента
  2. Всплывающие подсказки при наведении мыши на элемент списка
  3. Как ускорить вывод в ListView
  1. Получение индекса выделенного элемента

    // для получения индекса выделенного элемента в TListView
    // воспользукйтесь следующим кодом:
     int Index = ListView1->Selected->Index;

  2. Всплывающие подсказки при наведении мыши на элемент списка

    // поместите на форму компонент ListView1, установите
    // у него свойство ShowHint в true и напишите обработчик
    // события OnMouseMove следующим образом:
     void __fastcall TForm1::ListView1MouseMove(TObject *Sender,
    TShiftState Shift, int X, int Y)
    {
    TListItem *pListItem = ListView1->GetItemAt(X, Y);
    if(pListItem) ListView1->Hint = pListItem->Caption;
    }

  3. Как ускорить вывод в ListView

    // Напишите следующий код:
     void __fastcall TForm1::ListViewData(TObject *Sender, TListItem *Item)
    {
    Item->Caption = AnsiString(Item->Index);
    Item->SubItems->Add("комментарий");
    }
    // Это пропиши в дизайне:
    ListView->OnData = ListViewData;
    ListView->OwnerData = true;
    // "Заполнение":
    ListView->Items->Count = 20000000;
    // Сброс:
    ListView->Items->Count = 0;


Система
  1. Как узнать папку Windows
  2. Как узнать системную папку Windows
  3. Как спрятать кнопку "Пуск"
  4. Как сдвинуть кнопку "Пуск"
  5. Получение имени компьютера
  6. Изменение имени компьютера
  7. Список всех шрифтов, установленных в системе (VCL вариант)
  8. Как получить доступ к буферу обмена (VCL вариант)
  9. Как пpи стаpте пpогpаммы включить киpиллицу
  10. Как отобразить Диспетчер задач
  11. [+] Как добавить данные в реестр
  1. Как узнать папку Windows

    // Для получения папки Windows напишите следующий код:
     char WindowsDirectory[MAX_PATH];
    GetWindowsDirectory(WindowsDirectory, MAX_PATH);
    // В WindowsDirectory содержится папка Windows

  2. Как узнать системную папку Windows

    // Для получения системной папки Windows напишите
    // следующий код:
     char SystemDirectory[MAX_PATH];
    GetSystemDirectory(SystemDirectory, MAX_PATH);
    // В SystemDirectory содержится системная папка Windows

  3. Как спрятать кнопку "Пуск"

    // для того, чтобы спрятать кнопку "Пуск", воспользуйтесь
    // следующим кодом:
    // Поиск кнопки
     HWND hWnd;
    hWnd = FindWindow("Shell_TrayWnd", NULL);
    hWnd = FindWindowEx(hWnd, NULL, "BUTTON", NULL);
    // Сокрытие кнопки
     ShowWindow(hWnd, SW_HIDE);
    // для того, чтобы вновь отобразить кнопку после сокрытия, напишите:
     ShowWindow(hWnd, SW_SHOW);

  4. Как сдвинуть кнопку "Пуск"

    // Для того что бы сдвинуть кнопку "Пуск" напишите
    // следующий код:
     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);
    }

  5. Получение имени компьютера

    // Для получения имени компьютера напишите следующий код:
     unsigned long Size = MAX_COMPUTERNAME_LENGTH + 1;
    char *Buffer = new char[Size];
    GetComputerName(Buffer, &Size);
    // после выполнения данного кода имя компьютера будет
    // содержаться в Buffer. После того, как Buffer перестанет быть
    // вам нужным, не забудьте вызвать delete [] Buffer.
  6. Изменение имени компьютера

    // для изменения имени компьютера воспользуйтесь функцией
    // SetComputerName
     SetComputerName("НОВОЕ_ИМЯ_КОМПЬЮТЕРА");
    // не забудьте перезагрузить машину

  7. Список всех шрифтов, установленных в системе (VCL вариант)

    // Список всех шрифтов, установленных в системе, содержится в
    // свойстве Fonts глобальной переменной Screen.
    // Нижеприведенный пример показывает заполнение именами
    // шрифтов выпадающего списка:
     void __fastcall TForm1::FormCreate(TObject *Sender)
    {
    for (int i = 0; i < Screen->Fonts->Count; i++)
    ComboBox1->Items->Add(Screen->Fonts->Strings[i]);
    }

  8. Как получить доступ к буферу обмена (VCL вариант)

    // Для получения доступа к буферу обмена вызовите функцию
    // Clipboard() из модуля Clipbrd. Функция возвращает указатель
    // на экземпляр класса TClipboard
    #include <Clipbrd.hpp>
    Clipboard()->Clear(); // очищает буфер обмена

  9. Как пpи стаpте пpогpаммы включить киpиллицу

    // Напишите этот в начале программы:
    ActivateKeyboardLayout(LoadKeyboardLayout(IntToHex(MAKELANGID
    (LANG_RUSSIAN, SUBLANG_DEFAULT) ,8).c_str(), 0), 0);

  10. Как отобразить Диспетчер задач

    // Напишите следующий код:
    SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_TASKLIST, -1)

  11. Как добавить данные в реестр

    // Напишите следующий код:
    #include <Registry.hpp>
    TRegistry *Registry=new TRegistry;
    try
    {
    Registry->RootKey=HKEY_CURRENT_USER; // Ветвь реестра
    Registry->OpenKey("ant47\\Test",true); // Создать новую ветвь в реестре
    Registry->WriteString("DATA","15 мая"); // Создание строкового раздела
    }
    __finally
    {
    delete Registry;
    }
    Автор: ant47


Экран и рабочий стол
  1. Изменение картинки на рабочем столе
  2. Изменение картинки на рабочем столе(вариант 2)
  3. Изменение параметров экрана
  4. Как узнать частоту обновления экрана
  5. Как узнать разрешение экрана (VCL вариант)
  6. Как узнать разрешение экрана (WinAPI вариант)
  7. Как узнать разрешение экрана
  8. Отображение свойств дисплея
  9. Как поместить вид рабочего стола в буфер
  1. Изменение картинки на рабочем столе

    // Для изменения картинки на рабочем столе
    // используйте следующий код:
     SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, "pic.bmp",
    SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);
    // где pic.bmp - имя вашего файла с картинкой

  2. Изменение картинки на рабочем столе(вариант 2)

    //Первый вариант в C++Builder 5 вызывает ругань
    // BoundsChecker'a, хотя и работает.
    // Нижеприведенный вариант никакой ругани не вызывает, но
    // почему-то работает не на всех машинах. Для изменения картинки
    // на рабочем столе используйте следующий код:
     SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, "pic.bmp",
    SPIF_UPDATEINIFILE);
    // где pic.bmp - имя вашего файла с картинкой
  3. Изменение параметров экрана

    // Для изменения параметров экрана используйте следующий
    // код:
     DEVMODE DM;
    DM.dmSize = sizeof(DEVMODE);
    DM.dmBitsPerPel = 16; // глубина цвета, бит на пиксель
     DM.dmPelsWidth = 1024; // разрешение по горизонтали
     DM.dmPelsHeight = 768; // разрешение по вертикали
     DM.dmFields = DM_BITSPERPEL +
    DM_PELSWIDTH +
    DM_PELSHEIGHT +
    DM_DISPLAYFREQUENCY;
    DM.dmDisplayFrequency = 75; // частота обновления экрана
     ChangeDisplaySettings(&DM, 0);
    // ЗАМЕЧАНИЕ: при изменении параметров смотрите чтобы
    монитор поддерживал это режим
  4. Как узнать частоту обновления экрана

    // Для получения частоты обновления экрана напишите следующий код:
     HDC hDCScreen = GetDC(NULL);
    int Refresh = GetDeviceCaps(hDCScreen, VREFRESH);
    ReleaseDC(NULL, hDCScreen);
    // в Refresh содержится частота обновления экрана по горизонтали

  5. Как узнать разрешение экрана (VCL вариант)

    // Разрешение экрана можно узнать, прочитав значения
    // свойств Screen->Width и Screen->Height:
     int HorzRes = Screen->Width;
    int VertRes = Screen->Height;

  6. Как узнать разрешение экрана (WinAPI вариант)

    // Для получения разрешения экрана напишите следующий код:
     HDC hDCScreen = GetDC(NULL);
    int Horres = GetDeviceCaps(hDCScreen, HORZRES);
    int Vertres = GetDeviceCaps(hDCScreen, VERTRES);
    ReleaseDC(NULL, hDCScreen);
    // в Horres содержится разрешение экрана по горизонтали,
    // в Vertres содержится разрешение экрана по вертикали.

  7. Как узнать разрешение экрана

    // Для получения разрешения экрана напишите следующий код:
     int screenW=GetSystemMetrics(SM_CXSCREEN);//Получить ширину экрана
    int screenH=GetSystemMetrics(SM_CYSCREEN);//Получить высоту экрана
    // в screenW содержится разрешение экрана по горизонтали,
    // в screenH содержится разрешение экрана по вертикали.

  8. Отображение свойств дисплея

    // Следующий код отобразит на экране диалоговое
    // окно свойств дисплея:
    ShellExecute(NULL, "", "Desk.cpl", "", "", SW_SHOWNORMAL);

  9. Как поместить вид рабочего стола в буфер

    Напишите следующий код:
    #include <Clipbrd.hpp>
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    unsigned DataHandle;
    HPALETTE APalette;
    Word Format;
    Graphics::TBitmap *Bitmap=new Graphics::TBitmap;
    HDC DC=GetDC(0);
    try{
    Bitmap->Height=Screen->Height;
    Bitmap->Width=Screen->Width;
    BitBlt(Bitmap->Canvas->Handle , 0, 0, Screen->Width,
    Screen->Height,DC, 0, 0, SRCCOPY);
    //Изображение экрана теперь в Bitmap, запишем его в бyфеp обмена
     Bitmap->SaveToClipboardFormat(Format,DataHandle,APalette);
    Clipboard()->SetAsHandle(Format,DataHandle);
    }
    __finally
    {
    delete Bitmap;
    ReleaseDC(0,DC);
    }
    }


Графика и мультимедиа
  1. Преобразование битового изображения из цветного в 256 градаций серого
  2. Как пpоигpать MIDI без MediaPlayer-а
  3. Как воспроизвести звуковой файл без MediaPlayer-а
  1. Преобразование битового изображения из цветного в 256
    градаций серого

// Преобразование осуществляется следующей функцией:
void SetBitmapPaletteToGreyScale(Graphics::TBitmap *pBitmap)
{
LOGPALETTE *pal;
HPALETTE hpal;
int i;
int PaletteSize; //Size of the palette buffer
pBitmap->PixelFormat = pf8bit;
pal = NULL;
PaletteSize = sizeof(TLogPalette) + (sizeof(TPaletteEntry)
    * 255);
pal = (LOGPALETTE *) malloc(PaletteSize);
pal->palVersion = 0x300;
pal->palNumEntries = 256;
for (i = 0 ; i <= 255; i++)
{
pal->palPalEntry[i].peRed = i;
pal->palPalEntry[i].peGreen = i;
pal->palPalEntry[i].peBlue = i;
pal->palPalEntry[i].peFlags = PC_NOCOLLAPSE;
}
hpal = CreatePalette(pal);
if(hpal != 0) pBitmap->Palette = hpal;
free(pal);
}
  2. Как пpоигpать MIDI без MediaPlayer-а

    // Для того чтобы проиграть MIDI:
     #include <mmsystem.h>

    mciSendString("open anny.mid type sequencer alias MUSIC", NULL, 0, 0);
    mciSendString("play MUSIC from 0", NULL, 0, 0);

  3. Как воспроизвести звуковой файл без MediaPlayer-а

// Для того чтобы воспроизвести звуковой файл:
// напишите следующий код
    #include "mmsystem.h"
DWORD fdwSound = SND_ASYNC | SND_FILENAME;
PlaySound("C:\\switch1.wav",NULL, fdwSound);


Программа
  1. Как сделать чтобы программа не запускалась второй раз (Вариант 1)
  2. [+] Как сделать чтобы программа не запускалась второй раз (Вариант 2)
  3. Как узнать каталог, где находится запускаемая программа
  4. Как убрать иконку приложения с TaskBar-а
  5. Как сделать, чтобы программа на C++Builder не требовала .bpl, .dll
  6. Как поменять ICON у моей программы
  1. Как сделать чтобы программа не запускалась второй раз

// Для чтобы программа не запускалась второй раз надо
    модифицировать проектный файл (в данном примере
    это Project1.cpp):
#include <vcl.h>
#pragma hdrstop
USERES("Project1.res");
USEFORM("Unit1.cpp", Form1);
const char *NamedMutex= "OneOnly";
HANDLE CheckInstance(const char *Name)
{
HANDLE Mutex = CreateMutex(NULL, true,Name);
int er = GetLastError();
if (er) return 0;
return Mutex;
}
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
HANDLE Mutex = CheckInstance(NamedMutex);
if (!Mutex)
{
ShowMessage("Уже работает");
ReleaseMutex(Mutex);
return 1;
}
try
{
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
return 0;
}
  2. Как сделать чтобы программа не запускалась второй раз (Вариант 2)

    // Для чтобы программа не запускалась второй раз напишите следующий код:
     BOOL WeAreAlone(LPSTR szName)
    {
    HANDLE hMutex=CreateMutex(NULL,TRUE,szName);
    if (GetLastError()==ERROR_ALREADY_EXISTS)
    {
    CloseHandle(hMutex);
    return false;
    }
    return true;
    }

    //В CreatForm пишишь проверку:
    if (WeAreAlone("Some_Unique_Name_Or_Other"));
    else
    {
    ShowMessage("Такая программа уже работает!");
    exit(0);
    }
    Автор: ant47

  3. Как узнать каталог, где находится запускаемая программа

    // Чтобы узнать каталог напишите следющий код:
     void __fastcall TForm1::Button4Click(TObject *Sender)
    {
    Label1->Caption = Application->ExeName;
    Label2->Caption = ParamStr(0);
    Label3->Caption = GetCurrentDir();// текущая папка (может измениться!)
     char ExeName[MAX_PATH];
    GetModuleFileName(HInstance, ExeName, sizeof(ExeName));
    Label4->Caption=ExeName;
    }

  4. Как убрать иконку приложения с TaskBar-a

    // Напишите следющий код:
     ShowWindow(Application->Handle, SW_HIDE);//Скрыть
    ShowWindow(Application->Handle, SW_SHOW);//Показать

  5. Как сделать, чтобы программа на C++Builder не требовала .bpl, .dll

    Для начала надо зайти Project->Options затем: На вкладке Compiler нажать "Release", на вкладке Packages снять галку с "Build with runtime packages" и на вкладке Linker снять галку с "Use dynamic RTL"

  6. Как поменять ICON у моей программы

    Project->Options->Load Icon


Диски и файлы
  1. Получение метки диска
  2. Определение размера диска (VCL вариант)
  3. Определение свободного пространства на диске (VCL вариант)
  4. Создание ярлыка
  5. Удаление файла в корзину (VCL вариант)
  6. Удаление файла
  7. Работа с файлами GIF и JPEG
  8. Преобразование *.ico файла в *.bmp
  9. Отображение свойств файла
  10. Копирование файлов
  11. Удаление директории
  12. Вpемя создания файла
  13. Поиск файлов в каталоге и его подкаталогах
  14. Как выбрать папку из диалога (Вариант 1)
  15. Как выбрать папку из диалога (Вариант 2)
  16. Как удалить папку и все файлы в ней
  17. [+] Пример регистрации собственного расширения файла
  1. Получение метки диска

    // Для получения метки диска напишите следующий код:
     char DiskLabel[MAX_PATH];
    char *DiskName = "c:\\"; // имя диска
     GetVolumeInformation(DiskName, DiskLabel, MAX_PATH, NULL, NULL, NULL, NULL, 0);
    // в DiskLabel находится метка диска

  2. Определение размера диска (VCL вариант)

    // Для определения размера диска используйте функцию DiskSize, объявленную в Sysutils.hpp. В параметрах функции диску А соответствует 1, диску В - 2, и т. д., 0 - текущий диск. Следующий код определит размер диска С в байтах.
     __int64 Size = DiskSize(3);

  3. Определение свободного пространства на диске (VCL вариант)

    // Для определения свободного пространства на диске используйте функцию DiskFree, объявленную в Sysutils.hpp. В параметрах функции диску А соответствует 1, диску В - 2, и т. д., 0 - текущий диск. Следующий код определит размер свободного пространства на диске С в байтах.
     __int64 FreeSpace = DiskFree(3);

  4. Создание ярлыка

    // для использования функции необходимо подключить файл
    // shlobj.h
    // lpszPathObj - путь к объекту, для которого будет
    // создаваться ярлык
    // lpszPathLink - где будет создаватья ярлык
    // lpszDesc - описание ярлыка
     HRESULT CreateLink(LPCSTR lpszPathObj, LPSTR lpszPathLink, LPSTR lpszDesc)
    {
    HRESULT hres;
    IShellLink *psl;
    CoInitialize(NULL);
    hres = CoCreateInstance(CLSID_ShellLink, NULL,
    CLSCTX_INPROC_SERVER, IID_IShellLink, (void **)&psl);
    if(SUCCEEDED(hres))
    {
    IPersistFile *ppf;
    psl->SetPath(lpszPathObj);
    psl->SetDescription(lpszDesc);
    hres = psl->QueryInterface(IID_IPersistFile, (void**)&ppf);
    if(SUCCEEDED(hres))
    {
    wchar_t wsz[MAX_PATH];
    MultiByteToWideChar(CP_ACP, 0, lpszPathLink, -1, wsz, MAX_PATH);
    hres = ppf->Save(wsz, true);
    ppf->Release();
    }
    psl->Release();
    CoUninitialize();
    }
    return hres;
    }

  5. Удаление файла в корзину (VCL вариант)

// разместите компонент TOpenDialog (OpenDialog1) и TButton
    (Button1) на форме (Form1). Для удаления файла в корзину напишите следующий код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if(OpenDialog1->Execute())
{
AnsiString DialogTitle = "Удаление в корзину";
SHFILEOPSTRUCT FileOpStruct;
ZeroMemory(&FileOpStruct, sizeof(SHFILEOPSTRUCT));
FileOpStruct.pFrom = (OpenDialog1->FileName + '\0').c_str();
FileOpStruct.wFunc = FO_DELETE;
FileOpStruct.fFlags = FOF_ALLOWUNDO;
FileOpStruct.lpszProgressTitle = DialogTitle.c_str();
SHFileOperation(&FileOpStruct);
}
}
  6. Удаление файла

    // Для удаления файла надо подключить к проекту Sysutils.hpp и напишите следующий код:
     void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    AnsiString FileName="c:\\readme.txt";
    if (DeleteFile(FileName)) Label1->Caption="true";
    }

  7. Работа с файлами GIF и JPEG

// Для того, чтобы стандартными средствами C++Builder'a работать
    с файлами GIF и JPEG, добавьте в начало программы следующий код:
TPicture *Picture = new TPicture();
Picture->RegisterFileFormat(__classid(TJPEGImage), "jpg", "jpg",
__classid(TJPEGImage));
delete Picture;

TPicture *Picture = new TPicture();
Picture->RegisterFileFormat(__classid(TGIFImage), "gif", "gif",
__classid(TGIFImage));
delete Picture;
  8. Преобразование *.ico файла в *.bmp

// На форме разместите TImage (Image1), TOpenDialog (OpenDialog1)
    и TButton (Button1). Напишите следующий обработчик события OnClick кнопки:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString as;
TIcon *pi = new TIcon();
OpenDialog1->DefaultExt = ".ICO";
OpenDialog1->Filter = "icons (*.ico)|*.ICO";
OpenDialog1->Options << ofOverwritePrompt << ofFileMustExist << ofHideReadOnly;
if (OpenDialog1->Execute())
{
pi->LoadFromFile(OpenDialog1->FileName);
as = ChangeFileExt(OpenDialog1->FileName,".BMP");
Image1->Width = Icon->Width;
Image1->Height = Icon->Height;
Image1->Canvas->Draw(0, 0, Icon);
Image1->Picture->SaveToFile(as);
}
delete pi;
}
  9. Отображение свойств файла

    // На форме разместите TOpenDialog (OpenDialog1) и TButton
    // (Button1) напишите следующий обработчик события OnClick кнопки:
     void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    if(OpenDialog1->Execute())
    {
    SHELLEXECUTEINFO SEI;
    ZeroMemory(&SEI, sizeof(SHELLEXECUTEINFO));
    SEI.cbSize= sizeof(SHELLEXECUTEINFO);
    SEI.lpVerb = "properties";
    SEI.lpFile= OpenDialog1->FileName.c_str();
    SEI.nShow = SW_SHOW;
    SEI.fMask= SEE_MASK_INVOKEIDLIST;
    ShellExecuteEx(&SEI);
    }
    }

  10. Копирование файлов

    // Для того чтобы скопировать файлы напишите следующий код:
    int MoveFiles( AnsiString slSourceDir, AnsiString slTargetDir, bool toCopy = true )
    {
    SHFILEOPSTRUCT sh;
    sh.fFlags = FOF_NOCONFIRMATION | FOF_SILENT | FOF_FILESONLY;
    sh.wFunc = toCopy ? FO_COPY : FO_MOVE;
    sh.pFrom = slSourceDir.c_str();
    sh.pTo = slTargetDir.c_str();
    sh.hNameMappings = NULL;
    sh.lpszProgressTitle = NULL;
    return SHFileOperation ( &sh );
    }

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    //copy all from program files
    if(!MoveFiles("c:\\program files\\*.*", "c:\\temp"))
    ShowMessage("Ok");
    else ShowMessage("No");
    }
    // В функции MoveFiles первый параметр что копировать,
    // второй куда копировать
    FAQ с сайта Borland X Portal

  11. Удаление директории

    // Для удаления директории напишите следующий код:
     void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    SHFILEOPSTRUCT sh;
    sh.hwnd=Form1->Handle;
    sh.wFunc = FO_DELETE;
    sh.pFrom = "c:\\test\0"; //удаляемая директория
    sh.pTo = NULL;
    sh.fFlags = FOF_NOCONFIRMATION | FOF_SILENT;
    sh.hNameMappings = 0;
    sh.lpszProgressTitle = NULL;
    SHFileOperation(&sh);
    }

  12. Вpемя создания файла

    // На форме должны быть Lаbel1 и Button1, затем напишите следующий код:
     TDateTime FileTimeToDateTime(FILETIME *lpftime)
    {
    FILETIME localfiletime;
    SYSTEMTIME systime;
    FileTimeToLocalFileTime(lpftime,&localfiletime);
    FileTimeToSystemTime(&localfiletime,&systime);
    return(TDateTime(systime.wYear, systime.wMonth, systime.wDay)+
    TDateTime(systime.wHour, systime.wMinute,
    systime.wSecond, systime.wMilliseconds));
    }
    //----------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    FILETIME ftCreationTime,ftLastAccessTime,ftLastWriteTime;
    HANDLE hFile=(HANDLE)FileOpen("c:\\autoexec.bat",fmOpenRead);
    GetFileTime(hFile,&ftCreationTime,&ftLastAccessTime,&ftLastWriteTime);
    AnsiString FileInfo="FileName: c:\\autoexec.bat";
    FileInfo+="\nCreation Time:"+
    FormatDateTime("c",FileTimeToDateTime(&ftCreationTime));
    FileInfo+="\nLast Access Time:"+
    FormatDateTime("c",FileTimeToDateTime(&ftLastAccessTime));
    FileInfo+="\nLast Write Time:"+
    FormatDateTime("c",FileTimeToDateTime(&ftLastWriteTime));
    Label1->Caption=FileInfo;
    FileClose((int) hFile);
    }

  13. Поиск файлов в каталоге и его подкаталогах

    // Для поиска файлов в каталоге и его подкаталогах напишите следующий код:
     void ListFiles(AnsiString path, TStrings* List)
    {
    // Эта процедура выводит список файлов и вызывает
     // саму себя для всех каталогов
     TSearchRec sr;
    if (FindFirst(path+"*.*", faAnyFile, sr) == 0)
    {
    do
    {
    if (sr.Attr & faDirectory)
    {
    if (sr.Name!=".")
    if (sr.Name!="..")
    {
    ListFiles(path+sr.Name+"\\",List);// Рекурсивный вызов
     }
    }
    else
    {
    AnsiString Ext=ExtractFileExt(sr.Name).UpperCase();
    if (Ext==".CPP")
    List->Add(path+sr.Name);
    }
    }
    while (FindNext(sr) == 0);
    FindClose(sr);
    }
    Application->ProcessMessages();
    }

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    ListFiles("c:\\",Memo1->Lines);
    }

  14. Как выбрать папку из диалога (Вариант 1)

    // Для того чтобы выбрать папку из диалога напишите следуюший код:
     #include <FileCtrl.hpp>
    .. .. .. ..
    AnsiString way = "c:\\";
    if(SelectDirectory("Укажите путь к папке","",way))
    Label1->Caption = way;

  15. Как выбрать папку из диалога (Вариант 2)

    // Для того чтобы выбрать папку из диалога напишите следуюший код:
     #include <FileCtrl.hpp>
    .. .. .. ..
    AnsiString way = "c:\\";
    if(SelectDirectory(way,
    TSelectDirOpts() << sdAllowCreate << sdPerformCreate << sdPrompt, 0))
    Label1->Caption = way;

  16. Как удалить папку и все файлы в ней

    // Для того чтобы удалить папку и все файлы в ней напишите следующую функцию:
     bool DeleteDir(AnsiString DirName)
    {
    TSearchRec sr;
    if (DirName.Length())
    {
    if (!FindFirst(DirName+"\\*.*",faAnyFile,sr))
    do
    {
    if (!(sr.Name=="." || sr.Name==".."))// это удалять не надо
     if (((sr.Attr & faDirectory) == faDirectory ) ||
    (sr.Attr == faDirectory))// найдена папка
     {
    FileSetAttr(DirName+"\\"+sr.Name, faDirectory );// сброс всяких read-only
     DeleteDir(DirName+"\\"+sr.Name);//рекурсивно удаляем содержимое
     RemoveDir(DirName + "\\"+sr.Name);// удаляем теперь уже пустую папку
     }
    else// иначе найден файл
     {
    FileSetAttr(DirName+"\\"+sr.Name, 0);// сброс всяких read-only
     DeleteFile(DirName+"\\"+sr.Name);// удаляем файл
     }
    }
    while (!FindNext(sr));// ищем опять, пока не найдем все
     FindClose(sr);
    }
    RemoveDir(DirName);
    return true;
    }

  17. Пример регистрации собственного расширения файла

    // Напишите следующую функцию:
     #include <Registry.hpp>

    TRegistry *Reg;
    Reg=NULL;
    try
    {
    Reg=new TRegistry;
    Reg->RootKey=HKEY_CLASSES_ROOT;
    Reg->OpenKey("\\.ant",true);
    Reg->WriteString("","MyProgram");
    Reg->CloseKey();
    Reg->OpenKey("\\MyProgram", true);
    Reg->WriteString("","My document");
    Reg->CloseKey();
    Reg->OpenKey("\\MyProgram\\Shell\\Open\\Command",true);
    Reg->WriteString("",ParamStr(0)+" \"%1\"");
    Reg->CloseKey();
    Reg->OpenKey("\\MyProgram\\DefaultIcon",true);
    Reg->WriteString("",ParamStr(0)+", 1");
    Reg->CloseKey();
    }
    __finally
    {
    if (Reg!=NULL)delete Reg;
    }
    // Весь текст генерирует расширение *.ant

    // А этот код загружает файл с расширением *.ant в Image1.
    if (ParamCount>0)
    {
    asFileName=ParamStr(1);
    if (FileExists(asFileName)) Image1->Picture->LoadFromFile(asFileName);
    else ShowMessage(asFileName+" ОШИБКА ЗАГРУЗКИ ФАЙЛА!!!");
    }
    Автор:     ant47


Время и даты
  1. Получение текущей даты и времени (VCL вариант)
  2. Получение текущего времени (VCL вариант)
  3. Получение дня недели (VCL вариант)
  4. Часы на форме с точностью до минут
  5. Как подсчитать время выполнения функции
  6. Время в процессорных тактах
  1. Получение текущей даты и времени (VCL вариант)

    // для получения текущей даты и времени воспользуйтесь функцией
    // Now() из модуля Sysutils.hpp . Отобразить полученные дату и
    // время можно следующим образом (Button1 - кнопка на форме):
     void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    Form1->Caption = DateTimeToStr(Now());
    }

  2. Получение текущего времени (VCL вариант)

    // для получения текущего времени воспользуйтесь функцией Time()
    // из модуля Sysutils.hpp . Отобразить полученную дату можно
    // следующим образом (Button1 - кнопка на форме):
     void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    Form1->Caption = DateTimeToStr(Time());
    }

  3. Получение дня недели (VCL вариант)

    // для получения дня недели воспользуйтесь функцией DayOfWeek()
    // из модуля Sysutils.hpp, передав ей текущую дату. DayOfWeek
    // возвращает значение от 1 до 7, где 1 - воскресенье,
    // 2 - понедельник, и т. д.
     int Day = DayOfWeek(Date());

  4. Часы на форме с точностью до минут

    Напишите следующий код:
     void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
    Label1->Caption = FormatDateTime("hh:nn",Time());
    Timer1->Interval=10000;// меньше число, больше точность
    }

  5. Как подсчитать время выполнения функции

    Напишите следующий код:
     DWORD start=GetTickCount();
    // тут ваша функция или как-либо действия
    Edit1->Text=FloatToStr((GetTickCount()-start)/1000.);

  6. Время в процессорных тактах

    // Для того чтобы узнать время в процессорных тактах
    // напишите следующую функцию:
     #pragma warn -8070
    __int64 Ticks()
    {
    asm .586
    asm RDTSC
    }
    #pragma warn +8070

    // вызов функции
    __int64 i = Ticks();


Форма
  1. Запрещение кнопки закрытия [X] формы
  2. Запрещение кнопки максимизации [[]] формы
  3. Запрещение кнопки минимизации [_] формы
  4. Отмена закрытия формы при нажатии Alt+F4
  5. Отмена закрытия формы при нажатии Alt+F4 (Вариант 2)
  6. Перемещение формы мышью не за заголовок
  7. Изменение размеров формы (развернуть и т.д.)
  8. Как сделать кусок окна прозрачным
  9. Создание новой формы во время работы программы
  10. Как сделать прозрачную форму в W2K/XP
  11. Прозрачное окно с реакцией на нажатия кнопок, панелей
  12. Новая форма как отдельное окно
  13. Приложение без формы
  14. [+] Определения класса окна определённого приложения
  1. Запрещение кнопки закрытия [X] формы

    // Чтобы запретить кнопку закрытия формы, напишите следующий
    // код (Form1- ваша форма, Button1 - кнопка на ней):
     void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    HMENU MenuHandle = GetSystemMenu(Handle, false);
    if(MenuHandle)
    DeleteMenu(MenuHandle, SC_CLOSE, MF_BYCOMMAND);
    }

  2. Запрещение кнопки максимизации [[]] формы

    // Чтобы запретить кнопку максимизации формы, напишите
    // следующий код (Form1- ваша форма, Button1 - кнопка на ней):
     void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    HMENU MenuHandle = GetSystemMenu(Handle, false);
    if(MenuHandle)
    DeleteMenu(MenuHandle, SC_MINIMIZE, MF_BYCOMMAND);
    }
    // ПРИМЕЧАНИЕ: максимизация формы двойным щелчком мыши
    // по заголовку также будет невозможна

  3. Запрещение кнопки минимизации [_] формы

    // Чтобы запретить кнопку минимизации формы, напишите
    // следующий код (Form1- ваша форма, Button1 - кнопка на ней):
     void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    HMENU MenuHandle = GetSystemMenu(Handle, false);
    if(MenuHandle)
    DeleteMenu(MenuHandle, SC_MINIMIZE, MF_BYCOMMAND);
    }

  4. Отмена закрытия формы при нажатии Alt+F4

    // Чтобы форма не закрывалась при нажатии комбинации клавиш
    // Alt+F4, разместите на форме компонент TActionList(ActionList1),
    // создайте новый TAction(Action1), и в свойстве ShortCut у Action1
    // пропишите комбинацию клавиш Alt+F4, а обработчик события
    // OnExecute должен выглядеть следующим образом
    // (Form1- ваша форма):
     void __fastcall TForm1::Action1Execute(TObject *Sender)
    {
    // чтобы при сохранении C++Builder не уничтожил обработчик
    }

  5. Отмена закрытия формы при нажатии Alt+F4 (Вариант 2)

    //В обpаботчике FormKeyDown пишешь:
     if (Shift.Contains(ssAlt)&&Key==VK_F4) Tag=1;

    //В обpаботчике FormCloseQuery:
     if(Tag)
    {
    CanClose=false;
    Tag=0;
    }

  6. Перемещение формы мышью не за заголовок

    // Напишите следующий обработчик события OnMouseDown формы
     void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button,
    TShiftState Shift, int X, int Y)
    {
    long SC_DRAGMOVE = 0xF012;
    if(Button == mbLeft)
    {
    ReleaseCapture();
    SendMessage(Handle, WM_SYSCOMMAND, SC_DRAGMOVE, 0);
    }
    }

  7. Изменение размеров формы (развернуть и т.д.)

    // Напишите следующий код:
     Form1->WindowState = wsMaximized; // развернуть
     Form1->WindowState = wsMinimized; // минимизировать
     Form1->WindowState = wsNormal; // первоначальный размер

  8. Как сделать кусок окна прозрачным

    // Для того чтобы сделать кусок формы прозрачным,
    // напишите следующий код:

    //Прямоугольный кусок
    HRGN R1=CreateRectRgn(0, 0, Width, Height);
    HRGN R2=CreateRectRgn(4, 24, Width-4, Height-4);
    CombineRgn(R1, R1,R2, RGN_DIFF);
    SetWindowRgn(Handle, R1, TRUE);

    //Кусок в виде элипса
    HRGN hRgn1 = CreateRectRgn(0, 0, Width, Height);
    HRGN hRgn2 = CreateEllipticRgn(0, 0, Width, Height);
    HRGN hRgn3 = CreateRectRgn(0, 0, Width, Height);
    CombineRgn(hRgn3, hRgn1, hRgn2, RGN_DIFF);
    SetWindowRgn(Handle, hRgn3, TRUE);
    //можно заменить hRgn3 на hRgn2

    //Кусок в виде пятиугольника
    HRGN Reg1, Reg2;
    HRGN Region;
    POINT p[5];
    p[0] = Point(100, 0);
    p[1] = Point(Width-100, 0);
    p[2] = Point(Width, Height/2);
    p[3] = Point(Width/2, Height);
    p[4] = Point(0, Height/2);
    Region = CreatePolygonRgn(p, 5, ALTERNATE);
    SetWindowRgn(Handle, Region, true);

  9. Создание новой формы во время работы программы

    // Для того создать новую форму напишите:
    // следующих код:
    TForm * Formik= new TForm(this);
    TButton* button=new TButton(Application);
    button->Parent=Formik;
    button->Caption="New Button";
    button->Left=10;
    button->Top=15;
    button->Show();
    Formik->Caption=123;
    Formik->ShowModal();
    delete Formik;

  10. Как сделать прозрачную форму в W2K/XP

    // Для того сделать прозрачную форму напишите:
     int Transparency = 75;//насколько прозрачным будет окно (0-100%)
    long ExtStyle = GetWindowLong(Handle, GWL_EXSTYLE);
    SetWindowLong(Handle, GWL_EXSTYLE, ExtStyle | WS_EX_LAYERED);
    SetLayeredWindowAttributes(Handle, 0 , (255 * Transparency) / 100,
    LWA_ALPHA);

  11. Прозрачное окно с реакцией на нажатия кнопок, панелей

    // Для того создать форму напишите:
     void __fastcall TForm1::Photo()
    {
    int X0,Y0;
    bool Flag;
    TRect ScreenRect;
    TCanvas* ScreenCanvas=new TCanvas;
    try
    {
    Top=0;
    Left=Screen->Width;
    Width=Screen->Width;
    Height=Screen->Height;
    ScreenRect=Rect(0,0,Width,Height);
    ScreenCanvas->Handle=GetDC(0);
    Image1->Canvas->CopyRect(ScreenRect, ScreenCanvas,ScreenRect);
    ReleaseDC(Handle,ScreenCanvas->Handle);
    Left=Top;
    } __finally
    {
    delete ScreenCanvas;
    }
    }

  12. Новая форма как отдельное окно

    // Для того создать новую форму напишите:
     void __fastcall TForm1::CreateParams(TCreateParams& Params)
    {
    TForm::CreateParams(Params);
    Params.WndParent = 0;
    }

  13. Приложение без формы

    Создайте новый проект. Дальше: Project->Remove from project

  14. Определения класса окна определённого приложения

    Для того чтобы определить класс определённого приложения напишите следующий код:

    HWND hWnd=FindWindow(NULL,"Калькулятор");//для русскоязычной Windows
    if (hWnd)
    {
    char buff[100];
    GetClassName(hWnd,buff,100);
    ShowMessage(buff);
    }
    Автор: Srpj Сайт: http://srpj.narod.ru/


Строки
  1. Как переменную AnsiString конвертировать в char
  2. Как переменную AnsiString конвертировать в int
  3. Как переменную AnsiString конвертировать в float
  4. Как переменную char или int конвертировать в AnsiString
  5. Как узнать длину слова в пикселях
  6. Как конвертировать строку из кодировки WIN в KOI
  7. Как скопировать техт из строки в Clipboard
  1. Как переменную AnsiString конвертировать в char

    // Напишите следующий код:
    AnsiString a = "Hello World";
    char *b = a.c_str();

  2. Как переменную AnsiString конвертировать в int

    // Напишите следующий код:
    AnsiString a = "Hello World";
    int i = a.ToInt();
    или
    int i = StrToInt(a);

  3. Как переменную AnsiString конвертировать в float

    // Напишите следующий код:
    AnsiString a = "12.5";
    float d;
    d=a.ToDouble();

  4. Как переменную char или int конвертировать в AnsiString

    // Напишите следующий код:
    char Arr[240]= "Hello World";
    AnsiString Str;
    Str=(AnsiString)Arr;

  5. Как узнать длину слова в пикселях

    // Напишите следующий код:
    AnsiString a="Hello";
    int WidthOfString = Canvas->TextWidth(a);
    int HeightOfString = Canvas->TextHeight(a);
    TSize SizeOfString = Canvas->TextExtent(a);
    //У структуры TSize два поля cx и cy размеры
    //по горизонтали и вертикали

  6. Как конвертировать строку из кодировки WIN в KOI

    // Напишите следующий код:
    AnsiString S,N,C,SKoi,SWin;
    SKoi="__ёАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя";
    SWin="ёЁTюабцдефгхийклмнопярстужвьызшэщчъЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧЪ";
    int k;
    S="Строка"; //Строка WIN
    for(int j=1; j<=S.Length(); j++)
    {
    C=S[j];
    k=AnsiPos(C,SWin);
    if(k==0)
    N+=S[j];
    else
    N+=SKoi[k];
    }
    //N строка Koi8
    FAQ с сайта Borland X Portal

  7. Как скопировать техт из строки в Clipboard

    // Напишите следующий код:
    #include <clipbrd.hpp>

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    AnsiString s = "Hello, World !";
    Clipboard()->AsText = s;
    if (Clipboard()->HasFormat(CF_TEXT))
    Edit1->Text = Clipboard()->AsText;
    else
    Application->MessageBox("The clipboard does not contain text.", NULL, MB_OK);
    }


Курсор мыши
  1. Как переместить курсор мыши на X,Y
  2. Позиция курсора
  3. Как ограничить перемещение курсора мыши
  4. [+] Как загрузить свой курсор
  1. Как переместить курсор мыши на X,Y

    // Для перемещения курсора используйте функцию:
     SetCursorPos(X,Y);

  2. Позиция курсора

    // Для того чтобы узнать позицию курсора напишите следующий код:
     TPoint cPt;
    GetCursorPos(&cPt);
    ShowMessage(int(cPt.y));//Возвращает y-позицию курсора мыши
    TPoint cPt;
    GetCursorPos(&cPt);
    ShowMessage(int(cPt.x));//Возвращает x-позицию курсора мыши

  3. Как ограничить перемещение курсора мыши

// Для того что бы ограничить перемещение курсора мыши какой-либо областью экран
    напишите следующий код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
RECT LR;
LR.left=100;
LR.top=100;
LR.right=500;
LR.bottom=500;
ClipCursor(&LR);// Ограничиваем в заданой области
}
  4. Как загрузить свой курсор

    // Напишите следующий код:
    HWND i;
    i=LoadImage(0,"cursor1.cur",IMAGE_CURSOR,0,0,LR_LOADFROMFILE);
    if (i==0) ShowMessage("Ошибка загрузки курсора!");
    else
    {
    Screen->Cursors[1]=i;
    Form1->Cursor=1;
    }
    Автор: ant47


Клавиши
  1. Как програмно сымитировать нажатие клавиш CTRL+V
  2. Нажатие клавиши "a"(Win+M)
  3. Минимизация всех окон (Win+M)
  4. Имитация нажатия Alt+Tab
  5. Имитация нажатия CapsLock
  6. Имитация нажатия PrintScreen
  7. Имитация нажатия PrintScreen только для формы
  1. Как програмно сымитировать нажатие клавиш CTRL+V

    // Напишите следующий код:
    BYTE keys[256];
    GetKeyboardState(keys);
    keys[17] = 128;
    SetKeyboardState(keys);
    keybd_event(86, 0, 0, 0);
    // ПРИМЕЧАНИЕ: с помощью это примера можно сымитировать
    // и нажатие других комбинации, надо знать только код клавиш
    FAQ с сайта Borland X Portal

  2. Нажатие клавиши "а"

    // Напишите следующий код:
     keybd_event('A', 0,0,0);
    keybd_event('A', 0,KEYEVENTF_KEYUP,0);

  3. Минимизация всех окон (Win+M)

    // Напишите следующий код:
     keybd_event(VK_LWIN, 0, 0 ,0);
    keybd_event('M', 0, 0 ,0);
    keybd_event('M', 0, KEYEVENTF_KEYUP,0);
    keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP,0);

  4. Имитация нажатия Alt+Tab

    // Напишите следующий код:
     keybd_event(VK_MENU, 0, 0 ,0);
    keybd_event(VK_TAB, 0, 0 ,0);
    keybd_event(VK_TAB, 0, KEYEVENTF_KEYUP,0);
    keybd_event(VK_MENU, 0, KEYEVENTF_KEYUP,0);

  5. Имитация нажатия CapsLock

    // Напишите следующий код:
     keybd_event(VK_CAPITAL, 0, 0 ,0);
    keybd_event(VK_CAPITAL, 0, KEYEVENTF_KEYUP,0);

  6. Имитация нажатия PrintScreen

    // Напишите следующий код:
     keybd_event(VK_SNAPSHOT, 0, 0 ,0);
    keybd_event(VK_SNAPSHOT, 0, KEYEVENTF_KEYUP,0);

  7. Имитация нажатия PrintScreen только для формы

    // Напишите следующий код:
     keybd_event(VK_SNAPSHOT, 1, 0 ,0);
    keybd_event(VK_SNAPSHOT, 1, KEYEVENTF_KEYUP,0);


Устройства
  1. Открытие привода CD-ROM
  2. Закрытие привода CD-ROM
  3. Программное выключение монитора
  4. Программное включение монитора
  5. Как выключить/перезагрузить компьютер
  6. Сколько оперативной памяти
  7. Как определить подключена ли мышь
  8. Название процессора
  1. Открытие привода CD-ROM

    // Чтобы программно открыть привод CD-ROM, подключите
    // после vcl.h заголовочный файл mmsystem.h
    // и вызовите функцию mciSendString:
     void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    mciSendString("Set cdaudio door open wait", NULL, 0, Handle);
    }

  2. Закрытие привода CD-ROM

    // Чтобы программно закрыть привод CD-ROM, подключите
    // после vcl.h заголовочный файл mmsystem.h
    // и вызовите функцию mciSendString:
     void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    mciSendString("Set cdaudio door closed wait", NULL, 0, Handle);
    }

  3. Программное выключение монитора

    // Следующий код выключит монитор
    SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, 2);

  4. Программное включение монитора

    // Следующий код включит монитор
    SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, -1);

  5. Как выключить/перезагрузить компьютер

    // Для включения/перезагрузки компьютера вызовите
    // функцию ExitWindowsEx

    // выключить компьютер
     ExitWindowsEx(EWX_SHUTDOWN, 0);
    // перезагрузить компьютер
     ExitWindowsEx(EWX_REBOOT, 0);
    // завершить сеанс пользователя
     ExitWindowsEx(EWX_LOGOFF, 0);

  6. Сколько оперативной памяти

    // Для того чтобы узнать сколько оперативной
    // памяти на компьютере введите следующий код:
    MEMORYSTATUS mem;
    memset((void*)&mem,0,sizeof(mem));
    mem.dwLength=sizeof(mem);
    GlobalMemoryStatus(&mem);
    MessageDlg("Total memory:"+IntToStr(mem.dwTotalPhys),
    mtInformation, TMsgDlgButtons() << mbOK, 0);

  7. Как определить подключена ли мышь

    // Введите следующий код:
    if(GetSystemMetrics(SM_MOUSEPRESENT))
    MessageDlg("Мышь подключена!", mtInformation, TMsgDlgButtons() << mbOK, 0);
    else
    MessageDlg("Мышь не найдена!", mtError, TMsgDlgButtons() << mbOK, 0);

  8. Название процессора

    // Введите следующий код:
    AnsiString ProcessorName="Unknown";
    TRegistry *reg = new TRegistry;
    try {
    reg->RootKey = HKEY_LOCAL_MACHINE;
    reg->OpenKey("Hardware\\Description"
    "\\System\\CentralProcessor\\0", false);
    ProcessorName=reg->ReadString("ProcessorNameString");
    }
    __finally
    {
    delete reg;
    }
    MessageDlg(ProcessorName, mtInformation, TMsgDlgButtons() << mbOK, 0);


Редактор
  1. [+] Практическая работа с компилятором С++Builder
  2. Запуск C++Builder без заставки
  3. Запуск C++Builder без создания нового проекта
  4. Автоматическое открытие последнего проекта
  5. Как сделать чтобы Builder не создавал резервные файлы
  6. Как изменить размер сетки на форме
  7. Как отключить генерацию файлов отладки (*.tds)
  8. [+] Как поместить компонент на форму зная его имя
  9. [+] Поиск текста в файлах с исходным кодом
  10. [+] Несколько компонентов одного типа
  11. [+] Библиотека из DLL
  12. [+] Как перейти к объявлению какой-то функции или переменной
  13. [+] Восстановление всплывающей подсказки
  14. [+] Восстановление списка полей/параметров/методов объекта
  1. Запуск C++Builder без заставки

    // Для того, чтобы при запуске C++Builder не отображалась заставка, запустите C++Builder из командной строки с ключом -np:
     bcb.exe -ns

  2. Запуск C++Builder без создания нового проекта

    // Для того, чтобы при запуске C++Builder не создавался новый проект, запустите C++Builder из командной строки с ключом -np:
     bcb.exe -np

  3. Автоматическое открытие последнего проекта

    Надо зайти Tools->Enviroment Options и на вкладке Preferences поставить галочку Project desktop.

  4. Как сделать чтобы Builder не создавал резервные файлы

    Надо зайти Project->Options Во первых можно в Compiler отключить Debug Information Во вторых в Linker можно отключить Create Debug Information Ну и конечно же надо поставить галочку Don't generate state files.

  5. Как изменить размер сетки на форме

    Надо зайти Tools->Enviroment Options и на вкладке Designer для изменения размера надо у Grid size поменять значения X и Y.

  6. Как отключить генерацию файлов отладки (*.tds)

    Надо зайти Tools->Debugger Options и на вкладке General снять галочку у Integrated Debugger.

  7. Как поместить компонент на форму зная его имя

    Чтобы поместить какой-либо компонент на форму, не обязательно искать его на палитре компонентов: достаточно просто знать его имя. В меню выбираем: View -> Component List. Появляется окно со списком всех установленных компонентов. Чтобы выбрать нужный компонент, введите его имя и нажмите кнопку Add to form (или клавишу Enter) столько раз, сколько вам нужно этих компонентов.
    Автор: Srpj Сайт: http://srpj.narod.ru/

  8. Поиск текста в файлах с исходным кодом

    Помимо стандартного средства поиска текста в файлах с исходным кодом, C++Builder предоставляет такую возможность, как "Incremental Search". Чтобы воспользоваться ею, нажмите Ctrl+E (или выберите соответствующий пункт из меню), перейдите к началу файла и вводите с клавиатуры текст, который вам нужно найти. Это приведёт к тому, что в редакторе кода вы будете постепенно продвигаться к нужному фрагменту.
    Автор: Srpj Сайт: http://srpj.narod.ru/

  9. Несколько компонентов одного типа

    Если вам необходимо поместить на форму несколько компонентов одного типа, кликните на нужном компоненте, удерживая клавишу Shift. После этого вы можете разместить на форме сколько угодно экземпляров выделенного компонента до тех пор, пока не кликните на кнопке с изображением стрелки, находящейся в левой части палитры компонентов.
    Автор: Srpj Сайт: http://srpj.narod.ru/

  10. Библиотека из DLL

    Если у вас нет определённой библиотеки (к примеру, ddraw.lib), её можно создать из самой DLL, используя утилиту implib.exe, поставляемую вместе с компиляторами Borland.
    Пример в консоли:
    cd %windir%\system
    implib c:\ddraw.lib ddraw.dll
    Автор: Srpj Сайт: http://srpj.narod.ru/

  11. Как перейти к объявлению какой-то функции или переменной

    Если вам нужно перейти к объявлению какой-то функции или переменной, кликните на её имени с клавишей Ctrl.
    Автор: Srpj Сайт: http://srpj.narod.ru/

  12. Восстановление всплывающей подсказки

    Восстановить всплывающую подсказку с параметрами функции поможет комбинация Ctrl+Shift+Пробел. Курсор должен располагаться после открывающей скобки.
    Автор: Srpj Сайт: http://srpj.narod.ru/

  13. Восстановление списка полей/параметров/методов объекта

    Восстановить список полей/параметров/методов какого-то объекта (возникающий после написания имени объекта и, в зависимости от ситуации, знака '.' или '->'), можно с помощью Ctrl+Пробел. Курсор должен при этом быть установлен после '.' или '->'.
    Автор: Srpj Сайт: http://srpj.narod.ru/


Разное
  1. Регистрация редактора свойства типа AnsiString
  2. Мигание иконкой в панели задач
  3. Запуск скринсейвера из программы
  4. Скрытие таскбара
  5. Переключение раскладки клавиатуры (конкретный язык)
  6. Переключение раскладки клавиатуры
  7. Программная очистка корзины (для Windows 98)
  8. Запуск браузера
  9. Запуск почтового клиента
  10. Как добавить код на ассемблере
  11. Как сделать Shutdown (закрыть все запущенные приложения)
  12. Какая программа активна
  13. Блокировка клавиатуры и мыши
  14. Как из тела программы запустить обработчик события (как функцию)
  15. [+] Определение количества элементов в массиве
  16. [+] Имитации нажатия левой кнопки мыши
  1. Регистрация редактора свойства типа AnsiString

// Регистрация редактора свойства типа AnsiString производится
    следующим образом. Напишите вспомогательную функцию:
TTypeInfo *AnsiStringTypeInfo(void)
{
TTypeInfo *typeinfo = new TTypeInfo;
typeinfo->Kind = tkLString;
typeinfo->Name = "AnsiString";
return typeinfo;
}
// ... и используйте ее в вызове RegisterPropertyEditor
// (где TMyComponent - имя класса компонента,
// MyStringProperty - имя свойства типа AnsiString,
// TMyStringPropertyEditor - имя класса редактора свойства
// типа AnsiString).
RegisterPropertyEditor(AnsiStringTypeInfo(),
__classid(TMyComponent), "MyStringProperty",
__classid(TMyStringPropertyEditor));
  2. Мигание иконкой в панели задач

    // Чтобы помигать иконкой приложения в панели задач, разместите на форме компонент TTimer (Timer1) и напишите следующий обработчик события OnTimer (предварительно выставив интервал таймера и сделав его активным):
     void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
    FlashWindow(Application->Handle, false);
    FlashWindow(Application->Handle, true);
    }

  3. Запуск скринсейвера из программы

    // Следующий код запустит скринсейвер Handle - дескриптор окна вашей программы (программисты на C++Builder могут использовать Application->Handle):
     SendMessage(Handle, WM_SYSCOMMAND, SC_SCREENSAVE, 0);

  4. Скрытие таскбара

    // Напишите следующий код:
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    HWND H;
    H=FindWindow("Shell_TrayWnd",NULL); //находим хандл окна таскбара
    ShowWindow(H, SW_HIDE);//делаем его невидимым
    Sleep(2000);
    ShowWindow(H, SW_SHOW);//делаем его видимым
    }

  5. Переключение раскладки клавиатуры (конкретный язык)

    // Напишите следующий код:
    LoadKeyboardLayout("00000409", KLF_ACTIVATE);// Английская
    LoadKeyboardLayout("00000419", KLF_ACTIVATE);// Русская

  6. Переключение раскладки клавиатуры

    // Напишите следующий код:
    ActivateKeyboardLayout(0, 0);

  7. Программная очистка корзины (для Windows 98)

    // Напишите следующий код:
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    /* Очистка корзины
    Есть флаги - NULL - как обычно, т.е. по умолчанию
    SHERB_NOCONFIRMATION 0x00000001 - без запроса на удаление
    SHERB_NOPROGRESSUI 0x00000002 - без показа удаления
    SHERB_NOSOUND 0x00000004 - без звука
    при желании флаги можно сочетать через | */
    char sh[500];
    SHEmptyRecycleBin(Handle, sh, SHERB_NOSOUND|SHERB_NOCONFIRMATION);
    }

  8. Запуск браузера

    // Напишите следующий код:
    void __fastcall TForm1::Label1Click(TObject *Sender)
    {
    ShellExecute(Handle, "open", "http://google.com/",
    0, 0, SW_SHOWNORMAL);
    }

  9. Запуск почтового клиента

    // Напишите следующий код:
    void __fastcall TForm1::Label1Click(TObject *Sender)
    {
    ShellExecute(Handle,NULL,"mailto:newcb@narod.ru?subject=Tema",
    NULL,NULL,SW_SHOWNORMAL);
    }

  10. Как добавить код на ассемблере

    // Ассемблеровские вставки делаются так:
    asm {
    // код ассемблера
    }

  11. Как сделать Shutdown (закрыть все запущенные приложения)

    // напишите следующий код:

HANDLE hToken;
TOKEN_PRIVILEGES tkp;
// Get a token for this process.
if (!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
   ShowMessage("OpenProcessToken");
// Get the LUID for the shutdown privilege.
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,
   &tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1; // one privilege to set
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
// Get the shutdown privilege for this process.
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
   (PTOKEN_PRIVILEGES)NULL, 0);
// Cannot test the return value of AdjustTokenPrivileges.
if (GetLastError() != ERROR_SUCCESS)
   ShowMessage("AdjustTokenPrivileges");
// Shut down the system and force all applications to close.
if (!ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE , 0))
   ShowMessage("ExitWindowsEx");

  12. Какая на программа активна

// Для того что бы узнать какая программа активна
    кинте на форму таймер Timer1 и метку Label1
    напишите следующий код:
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
HANDLE hWnd;
hWnd = GetForegroundWindow();
char szTitle[41] = {0};
GetWindowText(hWnd,szTitle,40);
Label1->Caption = AnsiString(szTitle);
}
  13. Блокировка клавиатуры и мыши

    // Для блокировки клавиатуры и мыши напишите следующий код:
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    HINSTANCE hDll;
    //ниже прототип будущей функции
    DWORD __stdcall (*BlockInput)(bool Status);
    DWORD Result;
    Memo1->Lines->Add("");
    Memo1->Lines->Add("Загрузка функции BlockInput()...");
    hDll = LoadLibrary("User32.dll");
    Memo1->Lines->Add("hDll = " + IntToHex(int(hDll), 8));
    BlockInput = (DWORD __stdcall (*)(bool Status))GetProcAddress(hDll,
    "BlockInput");
    Memo1->Lines->Add("BlockInput = " + IntToHex(int(BlockInput), 8));
    if(!BlockInput)
    {
    Memo1->Lines->Add("Ошибка!!!");
    FreeLibrary(hDll);
    return;
    }
    Memo1->Lines->Add("Выполняем BlockInput(true)...");
    Result = BlockInput(true);
    Memo1->Lines->Add("Result = " + IntToStr(Result));
    if(Result)
    {
    Memo1->Lines->Add("Теперь клиатура и мышь доступны только, если нажать CTRL+ALT+DEL");
    Memo1->Lines->Add("Ждем 15 сек...");
    Sleep(15000);
    }
    else Memo1->Lines->Add("Ошибка!!!");
    Memo1->Lines->Add("Восстанавливаем все как было...");
    BlockInput(false);
    FreeLibrary(hDll);
    Memo1->Lines->Add("Готово.");
    }

  14. Как из тела программы запустить обработчик события (как функцию)

    // напишите следующий код в нужном месте:
    {
    ...
    Form1->Button1Click(Form1);
    ...
    }

  15. Определение количества элементов в массиве

    Чтобы в Run Time определить количество элементов в массиве, можно воспользоваться макросом ARRAYSIZE, определённым в файле sysopen.h следующим образом:
    #define ARRAYSIZE(a) (sizeof(a)/sizeof(a[0]))
    Автор: Srpj Сайт: http://srpj.narod.ru/

  16. Имитации нажатия левой кнопки мыши

    // Напищите слеующий код в нужном месте:
    INPUT inp[2];
    memset(inp,0,sizeof(inp));
    inp[0].type=INPUT_MOUSE;
    inp[0].mi.dwFlags=MOUSEEVENTF_LEFTDOWN;
    inp[1].type=INPUT_MOUSE;
    inp[1].mi.dwFlags=MOUSEEVENTF_LEFTUP;
    SendInput(2,inp,sizeof(INPUT));
    Автор: ant47