Ёж — птица гордая, пока не пнешь, не полетит |
компоненты Delphi |
Полезные примочки |
|
В этом разделе представлены некоторые разработки, которые могут вам пригодиться.
Если что-то понравится, то можете использовать в своих некоммерческих программах, только не забудьте указать автора и источник в разделе «О программе». Если хотите получить исходники, и договориться о коммерческом использовании напишите мне.
Если считаете, что представленные здесь компоненты для кого-то могут представлять интерес, опубликуйте ссылку на эту страничку.
Последние изменения: 12.02.13.
[DCC Error] Unit1.pas(7): F1026 File not found: 'CWindowThread.dcu'
, то закройте Delphi и удалите файл C:\Documents and Settings\[Имя пользователя]\Application Data\Borland\BDS\5.0\EnvOptions.proj.
Рассмотрим самый тривиальный случай: программа задумалась на какое-то время — хорошо бы выдать пользователю некоторое приободряющее сообщение. Если не лень, то можно сделать новую форму с индикатором хода выполнения задачи и кнопкой «отмена», потом создавать и разрушать её по мере необходимости.
Конечно же, работа не сложная, хотя тоже отнимает время, по этому в программах сделанных за пару дней её обычно игнорируют. В общем, правильно делают, т. к. для нормальной работы простого добавления нижеприведенного кода, увы недостаточно.
F := TMessageForm.Create(nil
); try … finally F.Free; end ; |
Во-первых, надо позаботиться, что бы форма получала сообщения (о перерисовке, перемещении мыши, нажатии кнопок). Для этого в процессе выполнения длительной операции необходимо расставить вызов Application.ProcessMessages
, и сделать это так, что бы метод вызывался не слишком редко, и не слишком часто (иначе основное время займет бесполезная обработка сообщений). Довольно нудное занятие, не для ленивых, но что более печально код становится, менее удобочитаемым.
Во-вторых, это невозможно, если выполняется какая-то одна процедура, внутрь которой не залезть (например, сложный запрос). Это приводит к тому, что во время выполнения перестает перерисовываться форма с сообщением и её смысл вообще теряется. Можно конечно сложные запросы выполнять в своем потоке, только это сразу на порядок повышает сложность приложения.
В-третьих, время выполнения некоторых операций, обычно слишком маленькое, чтобы прочитать сообщение, но в редких случаях достаточное, чтобы пользователь успел позвонить с жалобой на зависание. Пример: чтение конфигурационных данных с сетевого диска, или с «уснувшего» диска. Либо сообщение постоянно мелькает, либо не появляется ни когда. Предпочтительнее — отображать окно на мониторе через некоторое время, после установки свойства Visible
.
Для радикального решения этих проблем предлагаю использовать окно, работающее в своем собственном потоке. Обращаю внимание, что это не форма, и даже не компонент, а потомок TThread
, что позволяет использовать его в консольных приложениях. Во многих случаях вполне достаточно добавления следующего кода:
F := TThreadWindow.Show; try //Если задача выполняется более 1 секунды, появится //окно, содержащее пиктограмму и текст //«Дождитесь окончания текущей операции!» … finally F.Free; end ; |
Эстеты, могут отображать индикатор хода выполнения задачи, кнопку «Отмена», заголовок, показывать окно с плавным изменением прозрачности (для Win2000 и старше), короче всячески менять внешний вид сообщения. Если задать предполагаемое время выполнения задачи, то будет отображаться оставшееся до конца время, правда как показывает практика, точный прогноз получается только для завершенной задачи. См. документацию
Вышеописанное окно ожидания не использует VCL, что делает консольные и «безоконные» приложения гораздо более компактными, однако затрудняет установку свойств. Чтобы упростить этот процесс, можно использовать специально созданный компонент. Достаточно бросить его на форму и отредактировать в инспекторе объектов. В IDE окно ожидания будет выглядеть также как в запущенной программе.
Для установки пиктограммы, можно использовать обычное свойство Icon: TIcon
, или указывать название ресурса с пиктограммой IconResourceName:String
. В состав компонента входят несколько пиктограмм. См. документацию
Окно, работающее в своем потоке может быть использовано для создания заставок (сплэш-форм) появляющихся во время загрузки приложения.
Чтобы создать окно заставки необходимо добавить в проект графический ресурс с названием 'SPLASH'
и модуль CSplashWindow
. Для отображения заставки надо вызвать процедуру ShowSplashWindow
во время инициализации модуля. Таким образом, в самом начале работы программы, появится окно содержащее изображение и текст с информацией о версии программы, если таковая имеется. Окно будет видимым 3 секунды.
Для задания свойств заставки во время работы программы можно менять свойства объекта, возвращаемого функцией SplashWindow
. Созданный при вызове функции объект будет автоматически разрушен, после того как заставка перестанет быть видимой. Обращение к ShowSplashWindow
и SplashWindow
может осуществляться в секции initialization
любого модуля пользователя. Этот модуль желательно поместить самым первым в раздел uses вашего проекта (файл dpr).
Чтобы изменять свойства окна заставки в Design-time поместите на любую форму компонент TCSplashWindow
(не более одного). В тексте и заголовке можно указывать макросы (%ProductName%, %FileVersion% и др.), которые будут замещены соответствующей информацией о версии файла. Во время работы программы, информация об окне-заставке и о запускаемом файле будет извлечена из ресурсов приложения.
Чтобы добавить в программу информацию о версии файла в IDE Delphi выберите пункт меню Project/Options/Version info .
Чтобы добавить в программу графические ресурсы создайте в любом текстовом редакторе файл с расширением .rc и текстом следующего вида
SPLASH BITMAP "path/ImageFile.BMP" |
Затем запустите программу BRCC32.exe указав в качестве параметра имя созданного файла .rc. Появится файл с тем же именем и расширением .res. В текст программы добавьте строку
{$R 'path/ResourceFile.res'} |
Аналогично можно добавлять в программу пиктограммы. Существует также большое количество редакторов ресурсов, таких как Restorator .
Вы можете поместить в программу несколько изображений для отображения в различных графических режимах. Названия у них должны иметь следующий вид: ResourceName_XX, где ResourceName — имя ресурса заданное свойством ResourceName
, XX — количество бит на пиксель.
Кроме того, поместить изображения можно, не только в основной исполняемый файл, но и в динамическую библиотеку (dll, bpl). Для того, чтобы указать, в какой именно библиотеке надо искать ресурсы, присвойте её хэндл, переменной DefaultHinstance
из модуля CSplashWindow
. Также можно поместить изображение в библиотеку языковой поддержки, добавив одну строку в проект.
library
TestSplash; {ITE} {DFMFileType} {UMain.dfm} {ITE} {DFMFileType} {UPassword.dfm} {ITE} {RCFileType} {TestSplash_DRC.rc} {$R 'UMain.dfm' MainForm:TForm} {$R 'UPassword.dfm' PasswordForm:TForm} {$R 'TestSplash_DRC.res' 'TestSplash_DRC.rc'} {$R 'Splash.res'} // Добавлено {$E ENU} begin end . |
Обращаю внимание на то, что этот файл при обновлении будет перезаписан и потребуется заново добавить строку.
Поиск ресурсов осуществляется в следующих модулях:
DefaultInstance
, если не 0
FindResourceHInstance
HInstance
DefaultInstance
имеет нулевое значение
Если в разных модулях есть несколько ресурсов, то будет использован первый подходящий.
Поскольку заставка может отображаться еще до появления главной формы и даже объекта Application
, механизм её создания не такой как у всех VCL-компонентов. Функция SplashWindow
при первом вызове выполняет следующие действия:
DefaultSplashClass
(если nil
, то TCSplashWindow
).
DefaultSplashClassName
(если не задан, то используется имя класса созданного экземпляра).
Разрушается заставка по таймеру, через короткий промежуток времени, после её сокрытия.
См. демонстрационные программы:
Пример загрузки Splash из dll. Исходники, exe + dll + enu
Окно ожидания и заставка в консольном приложении. Исходники + exe.
Окно ожидания и заставка в VCL приложении. Исходники + exe.
См. документацию
Тем, кто в своих программах пользовался быстрой кнопкой TSpeedButton, может понравиться её аналог с расширенными возможностями.
Что я болше всего не люблю в стандартной кнопке, так это способ задания изображения, каких трудов стоит создать картинку с 4 состояниями, а потом всякий раз выискивать нужный файл. Согласитесь, что гораздо удобнее один раз загрузить все изображения в TImageList, и потом для каждого состояния выбирать нужный номер. Частично эту проблему можно решить используя свойство Action. Однако, если заголовок не влезает, или он вообще не нужен кнопка будет выглядеть неправильно. Даже если попытаться удалить заголовок, то при запуске программы он вновь появится.
В моем компоненте TSpeedButtonCep в качестве источника изображений используется TImageList, для каждого из 7 состояний можно выбрать свою картинку, которая видна в инспекторе объектов. Если заголовок не вмещается, то он отображается более корректно.
Разумеется, не обязательно задавать все семь изображений, достаточно только одно, остальные будут автоматически преобразованы из исходного, в зависимости от выбранной рамки (к двум обычным добавлены еще рамка в стиле XP и отсутствующая). Например, если курсор находится не над кнопкой, то изображение становится черно-белым. Можно использовать также стандартные изображения треугольников, галок, точек и создавать DropDown кнопки.
Добавлено новое событие, которое периодически возникает, если пользователь нажал, но не отпустил кнопку.
Добавлена поддержка тем графического оформления XP в Delphi 5 См. свойство ThemeEnabled
.
Кроме очевидных расширений добавлена возможность делать полупрозрачные кнопки (работает и в Windows 98). См. документацию
Те, кто в своих программах использует TActionList
, TToolbar
, TActionManager
и пр., наверно, часто формируют коллекцию изображений (глифов), в основном одних и тех же с некоторыми отличиями. Эта однообразная работа побудила меня создать компонент (потомок TDragImageList
), который содержит в себе часто используемые глифы. По мере создания я добавил некоторые полезные возможности и переделал редактор.
Коллекция глифов TImageListCep
имеет следующие отличия от стандартной:
Width
и Height
изображения не пропадают а меняют масштаб;Информация о загружаемых ресурсах содержится в коллекции TResourceNames
. Модуль ImageListCep
включает три ресурса, с названиями 'StandartBtn_XX' (XX: 16, 24, 32). Чтобы добавить изображения из этих ресурсов установите свойство элемента коллекции Name := 'STANDARTBTN'
.
Если, в Вашей программе есть другие графические ресурсы, то для того, чтобы они стали доступны в среде разработки установите свойство FileName
равным полному имени откомпилированной программы.
Глифы которые загружаются из файлов bmp и ico в режиме Design-Time, аналогично TImageList хранятся в свойстве CustomImg
. Для него так же можно задать размеры. Результирующий набор изображений всегда включает изображения из ResourceNames
и CustomImg
.
Редактор компонента реализован в модуле FormImageListCep
.
Редактор свойств загружаемого ресурса вызывается из контекстного меню по правому клику мыши на соответствующей строке.
Загружать в коллекцию можно файлы любого зарегистрированного в Delphi формата. Чтобы иметь возможность добавлять файлы png и jpg в раздел interface надо вставить соответствующие модули например:
interface
uses Windows, Messages, ... , pngimage, jpeg; // Добавление поддерживаемых форматов png и jpg |
TGradientActionMainMenuBar
, TGradientActionToolBar
, которые являются потомками стандартных компонентов TActionMainMenuBar
и TActionToolBar
. При этом появится возможность использования дополнительного стиля графического оформления. Посмотреть, как это выглядит можно запустив демонстрационное приложение.
Установка компонентов
Чтобы компоненты были видны в палитре компонентов Delphi, скачайте архив, скопируйте файлы из папок lib, bin, source, выберите пункт меню Component/Install Packages , нажмите кнопку Add и выберите файл WindowThreadCep.bpl, затем ControlsCepEx.bpl, затем EditorsCepEx.bpl. Обратите внимание, что бы эти файлы были откомпилированы для вашей версии . После этого рекомендую закрыть и открыть Delphi. В палитре компонентов появится новая станица Cep , с новыми компонентами. В Delphi 5,6,7: пользовательские компоненты обычно располагаются в папке C:\Program Files\Borland\Delphi5(7)\Projects\Bpl. В BDS 2006: в папке С:\Мои документы\Borland Studio Projects\Bpl. Можно всю эту работу проделать автоматически. Для этого извлеките всё содежимое архива в какую-нибудь временную папку и запустите программу SetupComponent.exe Если у вас раньше уже были установлены компоненты, то советую сначала их удалить. Если в Delphi 2007 при попытке запуска приложения возникает ошибка вида |
Кто не очень любит возиться с установкой компонентов, возможно, оценит небольшую утилиту SetupComponent.
Если эта программа запускается без ключей, то она пытается найти файл Setup.ini (в той же папке, где сам находится). В этом файле перечислены параметры работы программы и названия файлов, необходимых для работы компонентов. Указанные файлы в зависимости от типа скопируются в папки:
<DestinationPath>\Bin\<UserFolder>
<DestinationPath>\Lib\<UserFolder>
<DestinationPath>\Source\<UserFolder>
Если <DestinationPath> не указан, то используется путь, по которому установлена соответствующая версия Delphi. После копирования, если в ini-файле установлен параметр CanCompile=1, все файлы dpr, будут откомпилированы, затем все полученные файлы с расширением bpl будут зарегистрированы в системном реестре, после чего Вы можете запустить Delphi, в которой уже будут установлены и готовы к работе соответствующие компоненты. Информация о ходе установки записывается в файл <DestinationPath>\<UserFolder>LogX.txt
Т. е. если Вы ранее не устанавливали мои компоненты, то достаточно разархивировать скаченный файл в любую временную папку и запустить из неё SetupComponent.exe. Если Вы раньше их устанавливали вручную, то сначала вручную полностью удалите их.
Внимание Перед запуском SetupComponent обязательно закройте среду Delphi, иначе некоторые файлы не смогут быть скопированы, или удалены.
Для того чтобы удалить автоматически установленные компоненты запустите программу SetupComponent с ключем /uninstall или командный файл Uninstall.bat.
Эта программа может быть использована и для создания простейших дистрибутивов (архивов готовых для установки компонентов). Для получения краткой информации о параметрах запуска используйте ключ /h, или мыльте мне.
Со времен сотворения Delphi существует компонент TDBNavigator
, предназначенный для навигации по наборам данных. Не удивительно, что его внешний вид заставляет вспомнить Windows3.11. Такие воспоминания заставили меня создать свой собственный аналогичный компонент TNavigatorCep
на основе инструментальной панели (TActionToolBar)
. Этот комонент кроме традиционных кнопок, содержит кнопки для работы с наборами данных в памяти (TClientDataSet)
и специальный индикатор, отображающий состояние набора.
Использование механизма акций TDataSetAction
освобождает от необходимости задавать свойство DataSource
, компонент будет всегда связан с тем набором данных, который в данный момент редактируется.
Введены свойства Buttons
и VisibleButtons
. Первое устанавливают те кнопки, которые могут быть видимыми в навигаторе, а второе указывает кнопки, которые фактически видны, т.е. пользователь программы может по своему усмотрению менять состав отображаемых кнопок. Состояние навигатора может записываться и читаться из потока с помощью методов SaveToStream
и LoadFromStream
.
В качестве небольшого украшательства добавлено свойство Wait
, позволяющее отображать песочные часики над индикатором состояния.
При изменении размера навигатора автоматически меняется размер значков (16, или 24). Если навигатор располагается на TControlBar
, то размер зависит от его свойства RowSize
.
Полагаю, дальнейшие пояснения не потребуются, всё довольно очевидно. Работает только на BDS 2006, или Delphi 2007.
Про стандартный компонент TControlBar
, полагаю, нет необходимости рассказывать. Наличие некоторых глюков заставило меня взяться за написание его потомка, где я попытался сделать поведение более стабильным, однако попытки оказались тщетными и, в конце концов, появился его полный аналог TControlBarCep
(от TWinControl
).
Если в вашей программе уже используется стандартный контрол, то для быстрой замены обычно достаточно в текстовом представлении формы (файл *.dfm) заменить TControlBar
на TControlBarCep
.
object
ControlBar1: TControlBar //было
object ControlBar1: TControlBarCep //стало |
Позволяет упростить создание и редактирование текстовых литералов. Например, нажав сочетание клавиш Alt+v можно поместить в программу текст из буфера обмена в виде:
'Некоторый текст в' + #13#10 + '''апострофах''.' |
Сочетание клавиш Alt+c позволяет сделать обратную операцию. При копировании возникает окно, в котором можно отредактировать текст. Работа происходит в формате Unicode, однако эксперт совместим с Delphi 5 и старше.
При выполнении длительных математических расчетов часто используются циклы такого вида:
For
z := StartZ to
FinishZ do
For y := StartY to FinishY do For x := StartX to FinishX do Execute(x, y, z); |
При этом мой двухядерный процессор загружается на 50%, что меня всегда напрягало. Кроме того, программа подвисает и требует дополнительных ухищрений для предотвращения этого. Чтобы загрузить процессор на все 100%, создан компонент TMultiThreadFor
, попутно он позволяет:
Orders
, и установить обработчики событий onBeforeStart
, onAfterFinish
, onPercent
и onExecute
. Последний обработчик выполняется в разных потоках, поэтому на него накладываются некоторые ограничения:
Еще есть два дополнительных события onStartThread
, onFinishThread
которые могут использоваться для инициализации и деинициализации каждого потока (нити).
Вот небольшой демонстрационный пример. На 2-х ядерном процессоре ускорение у меня получилось ~1,4 раза. Чтобы точнее определять время установите галочку "Не обновлять изображение", закройте все активные приложения (WinAmp и т.п.) и не "вазюкайте" мышью.
В этом компоненте для редактирования узлов не используется свойство базового класса Items
, а добавлена коллекция NodeClients: TNodeClients
, каждый элемент коллекции в свою очередь также содержит аналогичную коллекцию Items: TNodeClients
. К элементам коллекции можно привязать действия (Action). Поддерживается перетаскивание действий из редактора TActionManager
. Добавлен также специализированный редактор компонента, который значительно упрощает процесс формирования узлов.
Некоторые наверно замечали, что порядок следования модулей в разделе uses, может влиять на компиляцию проекта. Это следствие того, что в разных модулях имеются идентификаторы с одинаковыми названиями. При компиляции, по умолчанию, будет задействован тот идентификатор, который объявлен в последнем (по порядку объявления) модуле.
Здесь (3Mb) можно увидеть список таких идентификаторов. Анализировались исходники Delphi 2010 Architect 14.0.3513.24210. Дополнительных компонентов не устанавливалось. Свойства и методы классов не учитывались. Пропущены файлы, в полном названии которых встречается тест DUNIT EXSMPLE TEST . Проигнорирован специальный идентификатор Register . Кроме повторяющихся идентификаторов произведен поиск идентификаторов с неподходящими названиями: SizeOf Length Str Val High Low Goto Write Read Writeln Readln .
Если найдёте неучтенные идентификаторы, или те, что, по Вашему мнению, не должны попасть в список, пишите, мне будет интересно.
Когда собирается релиз приложения, да и во многих других случаях требуется выполнить некие обязательные действия. Многие предпочитают использовать компилятор командной строки в bat-файлах. Немного другой подход позволяет, запускать bat-файлы из IDE, что несколько упрощает работу. Кроме того есть возможность сгенерировать фай wxs на основе информации о версии приложения, а затем сформировать инсталляционный пакет msi.
После инсталляции пакета ExpertCepBuild.dpk в IDE Delphi появится пункт меню Project/Полная сборка и запуск Alt+B. Если выбрать этот пункт меню, появится диалоговое окно:
Вы можете указать приложения, которые будут выполняться до и после сборки приложения. В качестве параметров запуска можно использовать следующие макросы:
Для быстрой вставки макросов, можно использовать контекстное меню, вызываемое по правому клику, или сочетанием клавиш Ctrl+enter.
В нижней части формы можно увидеть вывод консольных приложений. По кнопке Свойства MSI (Ctrl+m) отображается окно с параметрами создания инсталляционного пакета. При первом запуске вам потребуется указать путь к приложению Windows Installer XML.
После сборки проекта, в той же папке, будет сформирован wxs-файл, c информацией о версии файла (см. меню IDE Project/Options/Version Info). Кроме стантдартных полей, здесь Вы можете также задать следующие:
Затем этот файл будет откомпилирован в инсталляционный пакет с расширением msi. После установки, исполняемый файл будет размещаться по адресу ..\Program Files\{GroupFolder\}[ProductFolder]\[ExeName], а ярлык в системном меню в папке Start/Programs/{GroupName/}{ProductName/}[ModuleName].
Вы можете самостоятельно отредактировать созданный wxs-файл, чтобы эти изменения не потерялись при следующей сборки проекта, в окне свойств MSI, указывается, какие поля необходимо обновлять при сохранении wxs. По умолчанию, будет обновляться только версия и поле UpgradeCode. Более подробную информацию по созданию инсталляционных пакетов см. здесь и здесь. Созданный эксперт позволяет создавать ярлык в меню автозапуска, а также устанавливать и регистрировать библиотеку Midas.dll, однако не претендует на полноценный редактор инсталляционных приложений как Advanced Installer, или WiXAware, но позволяет автоматизировать рутинные операции.
Для установки этого эксперта потребуется наличие Microsoft XML, v. 6.0. Возможно, этот пакет и так есть. Импортированная библиотека типов находится в файле MSXML2_TLB.pas. Если этот файл уже имеется среди путей поиска, при компиляции ExpertCepBuild.dpk будет использован именно он, а находящися в архиве файл скопирован не будет.
Как многим известно, в Delphi есть возможность формировать xml-документацию, на основе специальным образом оформленных комментариев (см. Project/Options/Delphi Compiler/Compiling/Other options/Generate XML Documentation). Подробно о том, как правильно делать комментари можно прочитать здесь.
И так после компиляции проекта, кроме файлов с расширением pas, появятся файлы с расширением xml. Эти файлы содержат информацию из тэгов summary, remarks, param, и пр., но к сожалению в абсолютно нечитаемом формате. Для преобразования в читаемый формат используется схема xslt-преобразования Doc.xsl. Чтобы Internet Explorer мог отображать полученные xml-файлы в человеческом виде, достаточно включить в него ссылку на схему преобразования (см. строку 2).
<?xml version="1.0" encoding="utf-8"?> <?xml-stylesheet type="text/xsl" href="Doc.xsl"?> <namespace name="... |
Однако не все браузеры это поймут. Чтобы получить нормальный html-файл можно воспользоваться небольшой утилитой. Архив содержит исходники, исполняемый файл, схему преобразования, и картинки используемые в готовом файле. В результате работы программы получается такой текст.
Файл содержит исходные коды компонентов, демонстрационные примеры и программу для автоматической установки (12.02.13). |
Delphi 5 - 2011 |