Это издание представляет собой коллекцию ответов на нетрадиционные вопросы программирования на Delphi, нестандартных решений, интересных идей. Примеры рабочего кода, созданного многими программистами, собирались более двух лет и охватывают широкий круг вопросов: реализацию математических алгоритмов и работу с функциями Windows API, применение массивов, работу с графикой, а также управление рабочим столом, реестром, папками и файлами Windows, форматирование дискет, взаимодействие с аппаратным обеспечением. Значительное внимание уделено базам данных: таблицам dBASE и Paradox, настройке Delphi для работы с базами данных, подключению сервера Oracle или InterBase, особенностям использования SQL. Те, кто интересуется мультимедиа, найдут в книге советы по работе со звуком. Рассмотрены создание компонентов с нужными свойствами, а также способы изменения или дополнения уже созданных. Этой теме посвящена самая большая глава сборника. Примеры, имеющие отношение к классам Delphi, помогут понять особенности взаимодействия в MDI- и SDI-приложениях, освоить создание новых форм и управление ими. Сборник также содержит советы по работе с Интернетом и применению механизма OLE для обмена данными в приложениях.
Введение 1. Алгоритмы преобразования Преобразование шестнадцатеричной строки в целое Преобразование целого в шестнадцатеричную строку Преобразование ASCII в шестнадцатеричное значение Преобразование двоичного числа в десятичное Преобразование Comp в String Преобразование арабских чисел в римские Преобразование в EBCDIC Добавление лидирующих символов Преобразование BMP в ICO Преобразование ICO в BMP Преобразование BMP в JPEG Арифметика времени Арифметика дат Номер месяца по его имени Получение элемента даты Год четырьмя цифрами Преобразование даты в количество секунд Вычисление даты Пасхи Использование DateTime в DBGrid Вычисление восхода и захода солнца и луны Вычисление расстояния при известных широте и долготе Рисование кривых Безье Управление битами Гауссово размывание Рисование фрактальных графов Вращение изображения 64-битное кодирование/декодирование Защита программ перекрытием кода Генерация случайного пароля Как закодировать строку Как стереть самого себя Пример защиты типа SHAREWARE Перекодировка текста из DOS в Windows и наоборот Чтение и запись файлов UNIX Перенос русского текста по слогам Сумма прописью Проверка кредитной карты Проверка ISBN Генерация еженедельных списков задач Правильное округление дробных чисел Эквивалент Trim$(), Mid$() и другие Корректное сравнение и арифметические действия с DWORD 2. API Переменные окружения DOS Изменение системного времени Раскрытие строк с подстановкой вида '%SystemRoot%\IOSUBSYS\' Получение имени модуля Управление монитором Изменение пиктограммы приложения Как получить указатели всех процессов, запущенных в системе Работа с другим приложением без Hook и DLL на примере GetFocus Обработка WM_SysCommand Проблема синтаксиса DrawCaption FlashWindow для пиктограмм Извлечение пиктограммы из файлов EXE и DLL Как предотвратить запуск копии приложения Приоритет приложения Улучшение работы LockWindowUpdate Использование WSAAsyncSelect при отсутствии формы Контроль завершения приложения Определение завершения работы Windows Перехват выгрузки операционной системы Завершение работы Windows Создание консольных приложений 3. Pascal (интегрированная среда) Описание типов файлов для Delphi Директивы компилятора, способные увеличить скорость Сохранение пользовательских настроек Опубликованное свойство в Инспекторе объектов Создание редактора свойств Особенности вызова редактора свойств Код определения свойств Отображение свойств во время выполнения программы Имя свойства в течение выполнения приложения Редактор свойств для точки Свойство только для чтения во время выполнения приложения Свойство TStringList Конфликт имен параметров Вызов процедуры, имя которой содержится в переменной Выполнение процедуры по ее адресу Передача функции как параметра Переменная в качестве имени процедуры Переменное количество параметров любого типа Проблема передачи записи Работа метода Assign Создание объектных переменных Особенность использования StrAlloc и GetMem Быстрое сравнение памяти Арифметика указателей Динамическое распределение памяти Массив объектов изображений Сохранение массива с изображениями Динамические массивы Заполнение массива случайными значениями Массив констант Массив без ограничения типа и размера Массивы размером более 64К Шаблон массива переменной длины Запись массива в поток Проблема циклических ссылок Получение ссылки на экземпляр класса Функция, возвращающая тип Проблема с типизированными файлами Использование перечислимых констант Константа из другого модуля дает неверное значение Заголовок файла TGA Создание палитры Изменение цветовой палитры изображения Функция для работы с палитрами RGB Создание и использование 256-цветной палитры Загрузка 256-цветного Bitmap Захват изображений Bitmap без формы Рисование без мерцания Растягивание пиктограммы Тень в заданной области Создание тени у метки Компонент для отрисовки линий Отображение ломаной линии Рисование на инструменте управления Вывод текста на родительском элементе управления Надпись под углом Сохранение и восстановление шрифта «Прозрачный» текст Вывод текста на экран с обрезанием по длине Создание DIB из BMP Двоичный файл с набором изображений Преобразование 16-битного DCR в 32-битный Эксперт ресурсов Загрузка изображения/курсора из RES-файла 256-цветное изображение из. RES-файла Несколько пиктограмм в Delphi EXE Включение JPEG в EXE-файл Хранение данных в EXE-файле Оглавление файлов помощи Отображение диалога Help Search Использование файла помощи Таблицы строк Регулярные выражения Применение Tools Interface Назначение события во время выполнения программы Делегирование события Получение имени обработчика события Синтаксис ссылки на событие Сообщение для всех форм Имитация события MouseOff Обработка исключительных ситуаций Использование исключений в базе данных Определение версии Delphi 4. Базы данных Проблемы с кириллицей в Database Desktop Информация о псевдониме BDE База данных в кодировке CP1251 ASCII-драйвер для файлов CSV ASCII-файл, содержащий разметку полей Получение физического пути к таблице Получение информации о таблице Структура таблицы Создание DBF-файла во время работы приложения Упаковка таблиц dBASE Динамическое создание полей Создание индексного файла из приложения Создание таблицы с автоинкрементальным полем Создание и удаление полей во время выполнения программы Восстановление записи dBASE Обработка исключения Index not found Создание кросс-таблиц Создание уникального ID для новой записи Таблицы в оперативной памяти Проблема медленного доступа к таблице Проблема загрузки DBCLIENT. DLL Хитрости многопользовательского доступа к базам данных Дубликат записи Paradox или dBASE Имя пользователя базы данных Paradox Создание таблицы Paradox Печать структуры таблицы Paradox Ускорение открытия таблицы Paradox Пароли Paradox Замена пароля для таблицы Paradox из приложения Особенность первичного индекса Paradox Создание поля autoincrement в таблицах Paradox Доступ к файлам Paradox через BDE в сети Lantastic Network Изменение месторасположения NET-файла во время работы Использование TClientDataSet в локальном приложении с таблицами Paradox Чтение OLE из BLOB-поля Paradox Проблемы работы с Paradox в одноранговой сети Проблемы работы с Paradox в сети Поля Byte в Paradox Каскадное удаление с проверкой целостности Проблема транзакций Пакование таблиц Paradox Вызов TUTILITY Исключение показа поля Поля DBGrid и Memo Информация из одной таблицы на двух формах Копирование и удаление таблиц из приложения DBFSeek и DBFLocate Выполнение запросов к базе данных в фоновом режиме Повторный запрос к таблице Контроль изменения данных Дублирование набора записей Ошибка при добавлении или изменении записей Поиск величины при вводе Удаление и восстановление индексов Странности в работе AddIndex Особенности работы с Update Простой пример работы с базой данных из DLL Значение по умолчанию для объекта TField Сохранение в базе данных файла формата JPEG Автоматическая вставка SEQUENCE Запись и чтение чисел в поле BLOB Поля BLOB с длинным текстом Запись потока в поле BLOB Загрузка изображений в поля BLOB Извлечение изображения из поля BLOB Изображение и поля BLOB в InterBase Клиентский запрос к серверу Получение метода сервера Быстрый поиск в базах данных Поиск записи в больших таблицах Изменение каталога псевдонима во время выполнения приложения Копирование записи в пределах одной и той же таблицы Текущий номер записи таблицы Связь c DB2 в сети Netware Create Trigger - чувствительность к регистру Использование MS ADO Создание функции провайдера Передача UserName и Password в удаленный модуль данных Использование интерфейсов в RemoteDataModule Модуль данных для каждого MDIChild 5. BDE Проверка наличия IDAPI RecCount в таблицах ASCII Увеличение размера LCK-файла Локальный и общий доступ Распространение BDE Получение дескриптора соединения ODBC посредством BDE Информация о псевдонимах BDE Получение пути псевдонима и таблицы Отображение всех псевдонимов в ComboBox Задание псевдонима программным путем Изменение псевдонима во время выполнения программы Псевдоним на лету Синтаксис функции DbiAddAlias Добавление псевдонима с помощью функции DbiAddAlias Копирование таблицы с помощью BDE Обратные вызовы BDE32 для получения статуса операций Демонстрация обратного вызова BDE Запись буфера BDE на диск Приложения BDE32 в одноранговой сети Работа с BDE в сети Управление сетевыми каталогами (BDE) Решение проблемы BDE «Index out of Date» Пример DBIDoRestructure Пример использования DbiAddFilter Проблемы установки Interbase Server Управление локальным сервером Interbase Автоматический logon к локальной InterBase Проблемы регистрации UDF COLLATE PXW_CYRL по умолчанию Приращиваемые поля и Interbase BLOB-поля Interbase Использование OLE с Interbase Interbase в Linux Проблемы кириллицы в Oracle при работе с BDE Связь Oracle с Windows 95 Связь с Personal Oracle Анализ таблиц в Oracle Проблемы с Oracle в режиме отладки SQL в Delphi Зарезервированные слова Local SQL Параметризованные запросы Имя таблицы в SQL-запросе Интерактивные SQL-запросы SQL-запросы в изменившейся структуре базы данных SQL - суммирование вычисляемого поля SQL - сортировка вычисляемого поля Синтаксис SQL-функции Substring SQL и расширенные символы SQL Server и проблемы StoredProc SQL - применение функции SUBSTRING SQL и пробельные символы Неработающий SQL OR Функции работы с датами в SQL Сиротские Master-записи Refresh для запросов Default Cursor после завершения выполнения запросов 32-битное соединение с сервером Sybase Ошибка BDE32 $2104 Ошибка ApplyUpdates Ошибка создания дескриптора курсора Нарушение уникальности записи Ошибка псевдонимов IIS, Novell и ошибки учетной записи 6. Мультимедиа Мультимедиа-программирование в Delphi Извлечение звука из динамика в Windows 9x Формат WAV-файла Создание пустого WAV-файла Проигрывание WAVE-файла, помещенного в ресурс «Декомпиляция» файла формата WAV и получение данных Удаление содержимого WAV-файла Получение идентификатора диска Определение типа CD Серийный номер AudioCD Контроль джойстика в Delphi 7. Аппаратное обеспечение Дата BIOS из приложения Получение списка процессов Определение загрузки ресурсов GDI и USER Получение информации о процессоре Определяем процессор Работа с портами микропроцессора CPU Speed Форматирование носителя Определение свободного места на диске Серийный номер тома Управление дисководом Управление метками томов диска Копирование с диска на дискету и обратно Получение размера файла Определение устройства CD-ROM Открытие и закрытие привода CD-ROM Использование клавиш для управления компонентами Как перехватить нажатия клавиш в системе Особенности использования KeyPreview Перехват клавиатуры Блокирование ввода информации Имитация нажатия клавиши Индикация статуса клавиш Перехват курсорных клавиш Создание собственных «горячих» клавиш Недоступность комбинации <Alt>+<Tab> Управление клавишей <Caps Lock> Чтение и установка клавиши <Num Lock> Управление индикаторами на клавиатуре Перехват нажатия клавиши <Tab> Переключение языка Управление кнопкой Windows Пуск из приложения Имитация ввода с клавиатуры для приложений DOS «Замена» кнопок мыши Перехват событий мыши Мышь над формой Выход указателя мыши за границы компонента Добавление события OnMouseLeave Определение и использование курсора Использование анимированных курсоров Управление MouseOver посредством Hint Количество заданий на печать Замена принтера по умолчанию Замена порта принтера AT-команды модема S-регистры модема Список установленных модемов Определяем состояние модема Набор номера модемом Использование TAPI Управление динамиком PC 8. Операционная система Определение версии ОС Определение размера оперативной памяти Откуда инсталлировалась Windows Имя программы и расширение Изменения в реестре Загрузка приложения при запуске Windows Панель управления Определение имени Группы Запуска Путь/имя папки My Computer Вызов стандартного системного окна О программе Замена обоев на Рабочем столе Управление хранителем экрана Окно свойств компьютера из приложения Очистка Коpзины (Recycle Bin) Кнопки в панели задач Windows 9.x Замена изображения на кнопке Пуск Управляем кнопкой Пуск Управляем пунктом меню Документы Поиск файла из приложения Определение изменений на дисплее Управляем режимами дисплея Прячем Панель задач Пиктограмма приложения в Панели задач Сохранение приложения в виде пиктограммы Загрузка пиктограммы Создание ярлыков Всплывающее меню и Tray Рисование на минимизированной пиктограмме Метка диска под Win32 Процедура форматирования Подсчет размера директории Поиск загрузочного диска Поиск на жестком диске Управление каталогами и файлами Объекты и TRegistry Работа с RegIniFile Registry, работающий со значениями типа REG_MULTI_SZ Сообщения Windows Сообщение для всех главных окон Центрирование информационного диалога (MessageDlg) MessageDlg в обработчике OnExit Текст на кнопках MessageDlg Использование Shell_NotifyIcon ProcessMessages Избавление от системного окна с ошибкой Функции InputBox и InputQuery Проверка используемого в системе шрифта Прием файлов из Program Manager Drag & Drop c Windows 95 Explorer Перемещение формы не за заголовок Рассуждения о потоках Использование собственных курсоров в приложении Преобразование координат Запуск приложения в полноэкранном режиме Добавление своих пунктов в системное меню окна Получение различных диалогов из шаблона формы Задержка без использования времени CPU Моментальный снимок экрана Количество цветов в системе Быстрый способ вывода графики Как бороться с «квадратичностью» Image Копирование содержимого экрана на форму Обзор сети (типа Network Neighborhood) Определение собственного IP-адреса Остановка и запуск сервисов Определение доступных серверов приложений Как определить доступность сетевых ресурсов? Получение сетевого имени пользователя Список пользователей в Windows NT/2000 Подключение сетевого диска в Delphi Перезагрузка Windows из приложения Plugins Минимизация ресурсов, используемых IDE Delphi Зависание Delphi 4, 5 Ошибка 1157 Борьба с SoftIce 9. Компоненты Цветная кнопка Нажатие кнопки Обработка нажатия нескольких кнопок Смена пиктограммы BitBtn во время работы приложения Кнопка с несколькими строками текста Альтернатива кнопкам в Delphi Программное открытие ComboBox Выпадающий список ComboBox Hint в выпадающем списке ComboBox Автоматический формат даты в компоненте Edit Работа с массивом компонентов Расположение текста в правой части TEdit Ограничение TEdit на ввод нецифровой информации Числовая маска компонента TEdit c помощью OnKeyPress Использование SetFocus в OnExit компонента Edit Матрица на основе TEdit Отслеживаем позицию курсора в EditBox Трехмерная рамка для текстовых компонентов TLabel + TEdit без контейнера «Бегущая» строка Советы по работе с палитрой Изменение палитры при выводе изображения Особеннности вывода изображения Рисование прямоугольника на изображении Множественный выбор в ListBox Изменение позиций элементов ListBox с помощью Drag&Drop Улучшение компонента ListBox Использование цвета в ListBox Инкрементный поиск в ListBox Уменьшение мерцания ListBox в обработчике OwnerDraw Пример Ownerdraw для Listbox Прокрутка в TListBox Щелчок в пустой области TListBox Использование выбранных элементов TListBox Расширение TListBox Табуляция в графическом ListBox Выравнивание в ListBox ListBox с графикой Горизонтальная полоса прокрутки в TListBox Динамическое добавление пунктов меню Очень длинные меню Слияние MDI-меню Назначение обработчика MenuItem OnClick Пиктограммы в пунктах меню Исправление пиктограмм в недоступных пунктах меню Вызов всплывающего меню Динамическое создание пункта всплывающего меню Обработчик динамически созданного пункта меню Динамическое создание пунктов подменю во всплывающем меню Использование контекстного меню с VBX Вызов контекстного меню в позиции курсора Событие OnKeyPress и курсорные клавиши в TMemo Поиск и замена текста в TMemo Текущая позиция курсора в TMemo TMemo и StringList Использование встроенного отката в TMemo TMemo со свойствами Строка/Колонка Ограничение длины и количества строк в TMemo Использование шрифтов и стилей в TMemo Добавление строк в TMemo Вставка текста в TMemo Импортирование файла в TMemo Создание страниц TNoteBook во время работы приложения Проблема с освобождением ресурсов TNoteBook TNoteBook как контейнер для форм Добавление и удаление страниц в TNoteBook TPaintBox в буфер обмена Отрисовка TOutline Поточность TOutline Раскрытие пути к элементу TOutline по его индексу Перемещение панели мышью на форме во время выполнения программы Панель с изменяющимися размерами Компонент с вложенной панелью Индикатор хода выполнения в строке состояния ProgressBar с невидимой рамкой Некорректность реализации свойства BorderWidth TrackBar для эстетов Чтение текста RTF из базы данных Подсчет слов в TRichEdit Ошибка TRichEdit в Windows NT Проблема печати RTF Исправление загрузки текста RTF через поток Ограничение размера текста в TRichEdit Вставка текста в TRichEdit Позиция курсора в TRichEdit Прокрутка TRichEdit Модернизация компонента TRichEdit Группа переключателей и ActiveControl Синхронизация двух компонентов ScrollBox Мерцание ScrollBar Двойной щелчок на TSpeedButton SpeedButton и Glyph Обработчик события OwnerDraw в компоненте StatusBar Отображение всплывающих подсказок в строке состояния Дополнительная информация в строке состояния Установка атрибутов «только для чтения» для столбцов компонента StringGrid Помещение изображения в ячейку StringGrid Сохранение и чтение StringGrid TStringGrid с переносом текста в ячейках StringGrid и файловый поток Выравнивание текста в колонках StringGrid Помещение компонентов в StringGrid Выбор строки/колонки компонента TStringGrid Ширина колонок StringGrid Цвет неактивной ячейки StringGrid Вставка и удаление строк в StringGrid Обновление картинки в ячейке StringGrid Многострочность в заголовках колонок StringGrid StringGrid без выделенной ячейки Один щелчок на StringGrid вместо трех StringGrid как DBGrid «Авторазмер» для StringGrid Раскрашенный StringGrid Использование <Tab> в StringGrid как <Enter> Поиск в StringGrid по маске Потеря визуального курсора в StringGrid Разрешение экрана и StringGrid Форматирование ячеек TStringGrid Добавление элементов управления в TTabbedNotebook и TNotebook Недоступная страница в TabbedNotebook Динамическое создание объектов в TabbedNotebook Доступ к страницам TabbedNotebook Перемещение на страницу TabSet по имени Изменение количества вкладок в TabSet во время выполнения программы Ускорение работы TreeView Поточность TreeView Получение доступа к узлам TreeView Изменение шрифта в TreeView для выделения узлов Отмена вставки нового узла в TreeView из приложения Динамическое создание компонента TTable Динамическое создание файла базы данных Синхронизация таблицы и StringList Создание индекса во время выполнения программы Проверка изменения данных таблицы Использование DBIOpenLockList Заполнение DBComboBox и DBListBox Ошибка в DBComboBox или особенность работы? Перевод в верхний регистр первого вводимого символа в DBEdit Исправление DBEdit MaxLength Поиск и управление TDBEdit/TField Insert/Overwrite с помощью DBEdit Использование опции MultiSelect в DBGrid Помещение компонентов в DBGrid Сортировка колонок в DBGrid DBGrid с цветными ячейками Отображение графики в DBGrid Пример формы запроса на Delphi Изменение размеров DBGrid Перемещение данных из DBGrid DBGrid и клавиши акселерации DBGrid - свойства FixRows и FixCols DBGrid - поддержка одинарного щелчка Работа с несколькими записями Предохранение от автоматического добавления записи Перехват события компонента DBGrid OnMouseDown Использование клавиши <Enter> как <Tab> в DBGrid Обновление вычисляемых полей в DBGrid DBGrid без вертикальной полосы прокрутки Многострочный DBGrid DBGrid DefaultDrawDataCell TDBGrid - копирование в буфер обмена DBGrid с номером строки Текстовое содержимое ячейки DBGrid DBGrid - выбранные строки Улучшенный DBGrid Контроль данных в TDBGrid Обновление DBGrid после редактирования отдельной записи в отдельной форме Решение проблемы передачи фокуса DBGrid Позиция ячейки в DBGrid Сортировка DBLookupComboBox по вторичному индексу Значение DBLookupComboBox Две колонки в DBLookupComboBox Проблема хранения DBImage Копирование текста DBMemo Поиск текста в DBMemo Пример KeyDown компонента DBNavigator Свойства кнопок DBNavigator DBNavigator без пиктограмм Настройки всплывающих подсказок в TDBNavigator Выключение кнопок в TDBNavigator Получение индекса компонента в списке родителя Дублирование компонентов и их потомков во время выполнения приложения Refresh или Repaint? Имя класса компонента и модуля Пример компонента HotSpot Прозрачный компонент Создание свойства массива компонентов Отображение всплывающих подсказок компонентов Создание компонентов для работы с базами данных Позиция курсора в TEdit Файл типа TList Сохранение содержимого TreeView Использование шрифта в TreeView TImage - эффект плавного перехода TOutline - чтение из файла TOutline - Drag & Drop Компонент HTML-редактора Canvas и освобождение дескрипторов Определение свойства объекта 10. Классы Поиск класса Создание синего экрана установки Отображение логотипа при запуске приложения Круглый логотип при запуске приложения Деактивация приложения Невидимая главная форма Приложения без форм Окно произвольной формы Окно без заголовка Добавление пунктов в системное меню программы Создание формы на основе строки Форма OnTop Особенности fsStayOnTop Обработка запроса на максимальное раскрытие окна Минимизирование формы при запуске Чтение флажка Run Minimized Предотвращение закрытия формы Предотвращение изменения размеров формы Масштабирование окна Текущая позиция окна Сохранение размеров, позиции и состояния окна Определение перемещения формы Восстановление размера окна Помещение компонентов VCL в область заголовка Перемещение формы Помещение формы в поток Рисуем на рамке окна Вызов функций из различных дочерних MDI-окон Динамическое создание формы Создание формы небольшой ширины Управление разворачиванием формы Закрытие модальной формы Модальные формы и минимизация Модальные диалоги для всей системы Сворачивание окон приложения Динамическое создание/закрытие формы Заполнение изображением MDI-формы Удаление заголовка дочерней MDI-формы Проблема закрытия дочернего MDI-окна Скрытие дочерних MDI-форм Создание главной формы по условию Мерцание формы Слияние меню дочернего и главного окна Прямой вызов метода Hint «Устойчивые» всплывающие подсказки Создание Hint-окна Канва от THandle Изменение цвета Прозрачные формы и изображения Использование пиктограммы в качестве глифа Использование Parser Пример использования Parser Преобразование PChar в StringList Создание списка StringList c объектами StringList, владеющий объектами StringList и потоки Запись строки в поток с помощью TWriter/TReader Встроенные форматы буфера обмена Копирование в буфер обмена Просмотр буфера обмена Копирование большого файла в буфер обмена Буфер обмена и потоки Поддержка команд Cut, Copy, Paste Копирование формы в буфер обмена Индикатор хода выполнения в консольном приложении Высокоточный таймер Информация о DataLink 11. Интернет UUE-кодирование Проблемы ISAPI в Delphi 3 Dialer Проверка URL Проверка соединения с провайдером TCLIENTSOCKET и TSERVERSOCKET Работа с cookies Объект DocInput Объект DocOutput Захват текущего URL в MS IE IP-адрес и имя хоста Обработка ошибок WinSock 12. OLE Получение данных из Program Manager через DDE Управление Program Manager в Windows 95 с помощью DDE Добавление группы в Program Manager DDE - передача текста COM OLE-тестер Чтение сложных OLE-документов OLE-сервер Интерфейс OLE AutoServer Вызов DLL Delphi из MS Visual C++ Проблема использования в DLL чисел с плавающей точкой DLL - убийственная утилита Импортирование или «обертка» вызовов функций DLL Uses в DLL Функции VER. DLL 13. Часто задаваемые вопросы (FAQ) Перечень авторов