Ёж — птица гордая, пока не пнешь, не полетит
компоненты Delphi
Полезные примочки

  
  
  

В этом разделе представлены некоторые разработки, которые могут вам пригодиться.

Если что-то понравится, то можете использовать в своих неком­мерческих программах, только не забудьте указать автора и источник в разделе «О программе». Если хотите получить исходники, и договориться о коммерческом использовании напишите мне.

Если считаете, что представленные здесь компоненты для кого-то могут представлять интерес, опубликуйте ссылку на эту страничку.

Последние изменения: 12.02.13.

Обратите внимание на несколько замечаний:

  1. Для тех, кого не интересуют готовые решения, но кто хочет узнать, как это работает, опубликованы несколько статей на сайте Королевство Delphi. Ссылки к статьям обозначены значком . К статьям приложены примеры и полные исходники компонентов с урезанными возможностями.
  2. В конце этой страницы выложены полнофункциональные исходные коды наборов компонентов для нескольких версий Delphi, а также демонстрационные программы, которые создают компоненты в Runtime и компилируются без предварительной установки компонентов.
  3. Чтобы быстро установить/удалить компоненты используйте установщик SetupComponent который также находится внутри выложенных архивов. Запускать только после закрытия IDE Delphi.
  4. Установщик скопирует все нужные файлы, откомпилирует и зарегистрирует их в среде Delphi (эта операция выполнится для всех установленых версий Delphi). Если Вы всё-таки не доверяете ему, можете ставить самостоятельно, но тогда не спрашивайте, почему не работает. См. также инструкцию.
  5. Если у Вас Delphi 2007, а на инструкцию, как водится, забили, напомню еще раз, что если при попытке запуска приложения возникает ошибка вида [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 .

Обращаю внимание на то, что этот файл при обновлении будет перезаписан и потребуется заново добавить строку.

Поиск ресурсов осуществляется в следующих модулях:

  1. В DefaultInstance, если не 0
  2. В загруженном модуле языковой поддержки (ENU, RUS и т.п.). См. документацию по FindResourceHInstance
  3. В текущем модуле. См. HInstance
  4. Во всех остальных загруженных модулях (Dll и Bpl), если DefaultInstance имеет нулевое значение

Если в разных модулях есть несколько ресурсов, то будет использован первый подходящий.

Поскольку заставка может отображаться еще до появления главной формы и даже объекта Application, механизм её создания не такой как у всех VCL-компонентов. Функция SplashWindow при первом вызове выполняет следующие действия:

  1. Создаёт единственный экземпляр класса, заданного переменной DefaultSplashClass (если nil, то TCSplashWindow).
  2. Во всех ресурсах содержащих dfm-данные, пытается найти компонент, имя класса которого задаётся переменной DefaultSplashClassName (если не задан, то используется имя класса созданного экземпляра).
  3. Если такой компонент найден, то информация о нём используется для задания свойств заставки.

Разрушается заставка по таймеру, через короткий промежуток времени, после её сокрытия.

См. демонстрационные программы:
Пример загрузки 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 имеет следующие отличия от стандартной:

  1. Может содержать изображения из ресурсов программы, которые добавляются в программу с помощью директивы компилятора {$R ИмяФайла.res}, и изображения, которые загружаются обычным образом из файла dfm;
  2. При изменении свойств Width и Height изображения не пропадают а меняют масштаб;
  3. Редактор компонента позволяет экспортировать изображения в формате RES (при наличие утилиты BRCC32.exe);
  4. Можно указать размер добавляемых изображений, если он отличается от размера коллекции;
  5. Добавлена возможность импорта пиктограмм из DLL и EXE;
  6. Улучшен предварительный просмотр в диалоге открытия файлов.

Информация о загружаемых ресурсах содержится в коллекции 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

Установка компонентов

Чтобы компоненты были видны в палитре компонентов 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 при попытке запуска приложения возникает ошибка вида [DCC Error] Unit1.pas(7): F1026 File not found: 'CWindowThread.dcu', то закройте Delphi и удалите файл C:\Documents and Settings\[Имя пользователя]\Application Data\Borland\BDS\5.0\EnvOptions.proj


Кто не очень любит возиться с установкой компонентов, возможно, оценит небольшую утилиту 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 //стало

Эксперт «Специальная вставка» для среды разработки Delphi

Позволяет упростить создание и редактирование текстовых литералов. Например, нажав сочетание клавиш 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, попутно он позволяет:

  1. прерывать выполнение вычислений в любой момент;
  2. периодически получать сведения о проценте выполненных работ;
  3. работать основной программе в обычном режиме, пока в фоновом режиме выполняются расчеты;
  4. частично освободить программиста от ввода однотипного кода и упростить многопоточное программирование.

Orders, и установить обработчики событий onBeforeStart, onAfterFinish, onPercent и onExecute. Последний обработчик выполняется в разных потоках, поэтому на него накладываются некоторые ограничения:

  1. нельзя обращаться к VCL компонентам;
  2. нельзя использовать слишком короткий и простой код, т.к. при этом затраты на организацию работы компонента будут превышать собственно затраты на вычисления;
  3. нельзя также использовать слишком долгоработающий код т.к. это сделает невозможным прерывание работы цикла;
  4. его нельзя использовать в тех случаях, когда важен строгий порядок вычислений, т.к. в общем случае обрабатываются случайные элементы последовательности.

Еще есть два дополнительных события 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. Если выбрать этот пункт меню, появится диалоговое окно:

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

  1. $PROJECT — полное имя проекта (файл dpr)
  2. $EXENAME — полное имя откомпилированного файла (файлы exe, dll, ocx)
  3. $HOSTNAME — иолное имя запускающего приложения (см. пункт меню Run/Parameters.../Host application )
  4. $PARAMS — параметры запуска приложения (см. пункт меню Run/Parameters.../Parameters )

Для быстрой вставки макросов, можно использовать контекстное меню, вызываемое по правому клику, или сочетанием клавиш Ctrl+enter.

В нижней части формы можно увидеть вывод консольных приложений. По кнопке Свойства MSI (Ctrl+m) отображается окно с параметрами создания инсталляционного пакета. При первом запуске вам потребуется указать путь к приложению Windows Installer XML.

После сборки проекта, в той же папке, будет сформирован wxs-файл, c информацией о версии файла (см. меню IDE Project/Options/Version Info). Кроме стантдартных полей, здесь Вы можете также задать следующие:

  1. ModuleAuthor — может использоваться для заполнения атрибута Manufacturer вместо поля CompanyName
  2. ModuleName — определяет папку и пункт меню в котором будет расположено приложение после установки. Если свойство отсутствуе, то будет использовано свойство ProductName.
  3. GroupName — дополнительная папка содержащая группу проектов в системном меню Start/Programs
  4. GroupFolder — дополнительная папка в Program files

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

Схема преобразования xml-документации в html

Как многим известно, в 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

Hosted by uCoz