Копия викизеркало

Это зеркало вики с pascal.chat. Правка, история и вход — там.

Turbopower Visual PlanIt/ru

English · Português · Русский

О компоненте

Visual PlanIt - это набор синхронизированных, привязанных к данным, компонентов для добавления в приложения возможностей управления временем, задачами и контактами. Получите Outlook-подобный интерфейс без хлопот.

Этот компонент был разработан для кроссплатформенных приложений.

Скриншоты

Авторы

Авторы: Turbo Power Software
Порт на LCL: Christian Ulrich и Werner Pamler

Лицензия

Mozilla Public Licence 1.1

Загрузка

SVN

Вы можете проверить последний исходный код из https://lazarus-ccr.svn.sourceforge.net/svnroot/lazarus-ccr/components/tvplanit

Командная строка для этого

text
svn co https://lazarus-ccr.svn.sourceforge.net/svnroot/lazarus-ccr/components/tvplanit

Сообщения об ошибках / запросы на новые функции

Отчеты об ошибках и запросы функций должны быть отправлены в Lazarus/Free Pascal Bug Tracker; уточняйте, пожалуйста, что для проекта "Lazarus-CCR": http://bugs.freepascal.org/

Журнал изменений: новые функции

Несовместимые изменения

Зависимости / Системные требования

Установка


Прим.перев.: не помню, с какой точно версии, но в Lazarus 1.8.4 уже была доступна установка этого компонента посредством Online Package Manager c установкой пакета Zeos при необходимости.


Документация

Если вам нужна полная документация пакета VisualPlanIt, получите оригинальный 300-страничный PDF-файл TurboPower с официального сайта SourceForge версии под Delphi (https://sourceforge.net/projects/tpvplanit/files/tpvplanit_docs/))

Использование компонентов планировщика

С чего начать

Простой проект

Вот краткое руководство для ваших первых шагов с компонентами VisualPlanIt.

pascal
procedure TForm1.FormCreate(Sender: TObject);
begin
  // Используйте этот код, если имя файла не задано в Object Inspector...
  VpXmlDatastore1.FileName := name_of_the_datastore_file;
  // ... и хранилище данных не подключено автоматически
  VpXmlDatastore1.Connected := true;
  // Этот код выбирает первый ресурс (index 0), найденный в хранилище данных 
  if VpXmlDatastore1.Resources.Count > 0 then
    VpXmlDatastore1.Resource := VpXmlDatastore1.Resources.Items[0];  
end;

Категории событий

Редактор событий используется для ввода или редактирования деталей события. Вы найдете здесь комбинированный список с надписью "Category"(Категория). Элементы комбинированного списка можно использовать для классификации событий, например "Business"(Деловые), "Private"(Личное), "Birthday"(День рождения) и т.д. Однако эти элементы имеют только обобщенные имена, такие как "Category 1", "Category 2" и т.д. Вы можно выбрать более описательные имена, посетив свойство хранилища данных CategoryColorMap. Поле "Descriptions"(Описания) определяет текст, который будет отображаться в выпадающем списке. Чтобы иметь возможность различать категории в элементе управления DayView, вы также можете установить здесь цвет фона и растровое изображение.

Воспроизведение звука события

Компоненты планировщика готовы воспроизводить звук в заранее определенное время до наступления события. Для этого необходимо установить флажок "Reminder"(Напоминание) в редакторе событий.

Есть несколько способов настроить звук:

В Windows звуки воспроизводятся автоматически без дополнительного кода, потому что там встроены универсальные звуковые утилиты. В Linux, однако, это менее стандартизировано. Но хранилище данных предоставляет событие OnPlaySound, где может быть выполнена правильная команда воспроизведения звука. Проект fulldemo в папке examples содержит модуль, который проверяет звуковые движки, обычно доступные в различных системах; этот модуль представляет собой адаптированную версию playsound component от Gordon Bamber в Lazarus components and code repository (https://sourceforge.net/p/lazarus-ccr/svn/HEAD/tree/components/playsoundpackage/))

Хранилища данных

Хранилища данных отвечают за постоянное хранение записей о событиях, задачах и контактах.

Предком этой иерархии классов является TVpCustomDatastore. Он реализует базовую функциональность и предоставляет фундаментальные абстрактные методы, такие как LoadEvents, LoadTasks, LoadContacts, PostResources, PostEvents, PostTasks, PostContacts. Его класс-член Resources (type: TVpResources) хранит все ресурсы в списке как элементы TVpResource. Такой элемент ресурса, в свою очередь, содержит другие списки: Расписание, Задачи и Контакты для всех записей событий, задач и контактов. Доступ к выбранному в данный момент ресурсу можно получить из свойств Resource или ResourceID хранилища данных (последний представляет собой уникальный числовой идентификатор для идентификации ресурса).

TVpCustomDBDatastore, унаследованный непосредственно от TVpCustomDatastore. Это еще один (псевдо-) абстрактный класс, который обеспечивает базовую функциональность базы данных посредством четырех наборов данных: ResourceTable, EventsTable, TasksTable и ContactsTable. Поскольку базы данных имеют очень эффективные методы поиска и фильтрации, эти хранилища данных предоставляют свойство DayBuffer, которое определяет диапазон дат до и после текущей выбранной даты, для которой загружаются записи.

TVpIniDatastore

Это простое хранилище файловых данных, которое наследуется от TVpCustomDatastore. Он хранит записи данных в простой файловой структуре ini. Имя ini-файла должно быть указано в соответствующем свойстве. Файл загружается после того, как хранилище данных было создано, если свойство времени разработки AutoConnect имеет значение true или когда свойство среды выполнения Connected переключено на значение true. Файл сохраняется автоматически, когда Connected возвращается к false - это происходит до уничтожения хранилища данных.

Демонстрационный проект examples/datastores/ini является примером того, как можно использовать хранилище данных ini.

TVpXmlDatastore

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

Посмотрите демонстрационный проект в examples/datastores/xml, чтобы увидеть, как работает хранилище данных xml.

TVpBufDSDatastore

Следующие хранилища данных наследуются от TVpCustomDBDatastore. Первая, TBufDSDataset, использует простые таблицы TBufDataset для хранения данных планировщика. Четыре обязательных файла называются "Resources.db", "Events.db", "Contacts.db" и "Tasks.db" и хранятся в папке, указанной свойством Directory. Если AutoCreate имеет значение true, тогда таблицы создаются автоматически при первом запуске программы; в противном случае должен быть вызван метод хранилища данных CreateTables.

Применение этого хранилища данных продемонстрировано в examples/datastores/bufdataset и в examples/fulldemo.

TVpSqlite3Datastore

Это хранилище данных является специализированным хранилищем для таблиц SQLite3. Для этого используются компоненты SQLDB. Вы должны добавить TSQLite3Connection и TSQLTransaction в форму, связать их вместе, используя соответствующие свойства. Свяжите SQLite3Connection с Connection хранилища данных. Требуемые SQLQueries создаются автоматически, если AutoCreate хранилища данных имеет значение true или после вызова CreateTables. База данных хранится в файле, указанном DatabaseName соединения.

Проект в examples/datastores/sqlite3 демонстрирует, как можно использовать хранилище данных sqlite3.

TVpFirebirdDatastore

База данных Firebird предоставляет хранилище для TVpFirebirdDatastore. Опять же, здесь используются компоненты SQLDB. Чтобы установить соединение с базой данных, TIBConnection должен быть связан с Connection хранилища данных. Он должен предоставить всю информацию для подключения к базе данных, такую как имя базы данных, имя пользователя и пароль. Кроме того, необходим компонент TSQlTransaction. База данных должна создаваться средствами, предоставляемыми Firebird, или сторонними инструментами администрирования базы данных. Это можно сделать и из хранилища данных, но это приводит к исключению. Если в хранилище данных AutoCreate необходимые таблицы создаются автоматически, когда они не найдены; В качестве альтернативы вызовите CreateTables для хранилища данных.

Использование хранилища данных показано в examples/datastores/fb.

TVpZeosDatastore

TVpZeosDatastore работает с Компонентами базы данных ZEOS. Поскольку они отсутствуют в стандартном дистрибутиве Lazarus, [компонент] содержится в отдельном пакете laz_visualplanit_zeos, который находится в папке source/addons/zeos и должен быть установлен после [установки самого] laz_visualplanit.

TZConnection требуется для установления соединения с базой данных. Таблицы создаются внутри, либо автоматически, если AutoCreate имеет значение true, либо вручную, вызывая CreateTable.

Демонстрационный проект можно найти в examples/datastores/zeos.

TVpFlexDatastore

В упомянутых выше хранилищах данных, связанных с базой данных, таблицы создаются хранилищем данных. Это гарантирует, что поля [будут] названы так, как ожидается хранилищем данных. С другой стороны, если таблицы уже существуют или предоставляются другими приложениями, весьма вероятно, что имена полей не будут повторно распознаны. TVpFlexDatastore может быть решением [этой проблемы]. Его название указывает на то, что это очень «гибкое» хранилище данных. В частности, можно связываться с любой системой базы данных, если доступен TDataset-потомок.

Вы должны добавить в форму четыре компонента TDataset, каждый из которых соответствует одному из данных Resources, Events, Contacts и Tasks, и связать их с DataSource хранилища данных через компоненты TDataSource. Затем дважды щелкните TvVpFlexDatastore, чтобы открыть FieldMapper. Это инструмент для назначения полей базы данных внутренним полям хранилища данных. Для каждого поля базы данных, которое вы хотите включить в планировщик, выберите соответствующее поле хранилища данных в правом списке. После нажатия кнопки "Add"(Добавить) пара полей отображается в списке "Field Mappings"(Сопоставление полей).

Есть два примера проектов

Другие хранилища данных

Следующие хранилища данных из исходного дистрибутива Delphi включены в папку с исходниками, но не добавлены в пакет, поскольку для них требуется BDE, который недоступен для Lazarus:

Наложение событий

Компоненты DayView и WeekView в основном отображают события одного ресурса. Однако возможно переключиться в overlay mode(режим наложения), где другие ресурсы могут отображаться в тех же элементах управления. Это может быть достигнуто путем назначения ресурса TVResourceGroup (свойство Group):

pascal
type
  TVpOverlayPattern = (opSolid, opClear, opHorizontal, opVertical, opFDiagonal, opBDiagonal, opCross, opDiagCross);

  TVpOverlayDetail = (odResource, odEventDescription, odEventCategory);
  TVpOverlayDetails = set of TVpOverlayDetail;  

  TVpResourceGroup = class
    //...
    property Caption: String;
    property Count: Integer;
    property Items[AIndex: Integer]: TVpResource;
    property Pattern: TVpOverlayPattern;
    property ResourceID: Integer;
    property ReadOnly: boolean read FReadOnly;
    property ShowDetails: TVpOverlayDetails;
  end;

procedure TMainForm.CreateResourceGroup;
const
  NAME_OF_GROUP = '';  // пусто -> используйте взамен описания ресурсов
  PARENT_ID = 1;
  OVERLAYED_ID = 2;
var
  datastore: TVpCustomDatastore;
  grp: TVpResourceGroup;
begin
  datastore := VpControlLink1.Datastore;
  grp := datastore.Resources.AddResourceGroup([PARENT_ID, OVERLAYED_ID], NAME_OF_GROUP);
  grp.ReadOnly := true;
  grp.Pattern := opDiagCross;
  if datastore.Resource <> nil then
    datastore.Resource.Group := grp else
    datastore.Resource.Group := nil;
  datastore.RefreshEvents;  // или: datastore.UpdateGroupEvents;
end;

Идентификаторы наложенных ресурсов указываются в виде массива в первом параметре вызова AddResourceGroup. Первый идентификатор играет особую роль: он относится к ресурсу, к которому присоединена группа. Если этот ресурс отображается в компоненте DayView или WeekView, то события другого указанного идентификатора(ов) накладываются на один и тот же элемент управления.

Уровень детализации, видимый пользователю, просматривающему наложенные события, контролируется свойством ShowDetails группы ресурсов. По умолчанию отображается только имя наложенного ресурса. Если необходимо предоставить больше деталей, вы можете добавить другие элементы TVpOverlayDetails. Фон наложенных событий в дневном обзоре заштриховывается, как указано в свойстве Pattern группы ресурсов, если категория событий не исключена из видимых деталей; в противном случае событие рисуется, как указано в свойстве HiddenCategories хранилища данных.

Редактирование, удаление, перетаскивание наложенных событий по умолчанию отключено, но это можно разрешить, установив для свойства ReadOnly их группы ресурсов значение false.

Чтобы включить или отключить группы ресурсов, контекстное меню компонентов DayView и WeekView расширено соответствующим подменю. Подменю содержит элемент «none», означающий «нет наложенных событий», а также элемент для каждой группы ресурсов, в которой текущий выбранный ресурс является родительским. Заголовок пунктов меню определяется вторым (необязательным) параметром вызова AddResourceGroup (NAME_OF_GROUP); если поле пустое, имя группы выводится из описаний наложенных ресурсов.

Печать и предварительный просмотр

Пакет VisualPlanIt содержит процедуры для печати элементов управления планировщика. Реализован даже предварительный просмотр печати. Процесс печати определяется с помощью шаблонов, которые здесь называются "print formats"(форматы печати). Они могут быть созданы во время разработки или с помощью XML-файла, загруженного во время выполнения, содержать список компонентов, которые будут напечатаны.

Основой поддержки печати является класс TVpPrinter - он доступен через свойство Printer в TVpControlLink. Он содержит дополнительную информацию, необходимую для процесса печати, и содержит список доступных PrintFormats.

Для быстрого доступа к дизайнеру формата печати дважды щелкните компонент TVpControlLink. Нажмите на верхнюю кнопку "New"(Новый), чтобы открыть редактор основного формата. Здесь вы можете назначить осмысленное имя для формата печати. При нажатии на нижнюю кнопку "Edit"(Редактировать) открывается редактор "Element"(Элемент) - это инструмент для определения содержимого в формате печатной печати, аналогичный дизайнеру отчетов, но менее удобный. В дополнение к элементам управления планировщика, DayView, WeekView, MonthView, TaskList и ContactGrid, редактор также позволяет добавлять в формат дополнительные объекты текста и формы. Несколько элементов могут содержаться в одном формате. Расположите элементы, используя спецификации Top/Left/Width/Height справа. Кроме того, всю страницу формата можно поворачивать с шагом 90°.

«Предварительный просмотр» может быть создан с помощью компонента TVpPrintPreview. Назначьте ControlLink формы для ControlLink и Printer модуля Printers для свойства Printer компонента предварительного просмотра. Для правильной работы печати у вас должен быть [предварительно установлен] пакет Printer4Lazarus в соответствии с требованиями проекта; это проще всего сделать, добавив в форму стандартный TPrintDialog, который вам, возможно, понадобится в любом случае. Откройте предварительный просмотр печати, вызвав его метод Execute. Следует отметить, что сам предварительный просмотр печати не выдает никаких команд печати. Поэтому должен быть написан дополнительный код печати, если пользователь решит начать распечатку из предварительного просмотра, что-то вроде этого:

pascal
if VpPrintPreviewDialog1.Execute then
  if PrintDialog1.Execute then begin
    Printer.BeginDoc;
    try
      VpPrintPreviewDialog1.ControlLink.Printer.Print(
        Printer, 
        VpPrintPreviewDialog1.StartDate, 
        VpPrintPreviewDialog1.EndDate
      );
    finally
      Printer.EndDoc;
     end;
  end;

См. проработанный пример в проекте fulldemo в папке examples.

Локализация

Все внутренние строки, используемые пакетом VisualPlanIt, могут быть локализованы с помощью утилит перевода, доступных в Lazarus. Переведенные po-файлы можно найти в папке languages дистрибутива. Скопируйте их в языковую папку вашего приложения и переведите [его], вызвав

pascal
uses
  translations;
var
  langdir: String;  // языковая папка вашего приложения 
  lang: String;     // аббревиатура языка, например "de" для немецкого
//...
  TranslateUnitResourceStrings('vpsr', langdir + 'vpsr.' + lang + 'po');

Note: Пользователям предлагается отправлять [разработчику] переводы ресурсов для своего родного языка.

Помимо предоставления переведенных строк, должны быть адаптированы различные «свойства, относящиеся к дате/времени» элементов управления планировщика:

Наконец, TVpControlLink реализует процедуры локализации адресов в диалоге редактора контактов. Для этого к пакету VisualPlanIt прилагается файл vplocalize.xml. Он содержит правила для построения адресов в правильном формате, варьирующемся от страны к стране. Если это имя файла назначено свойству LocalizationFile элемента ControlLink, то эти правила вступают в силу при создании диалога редактора контактов. Обратите внимание, что этот файл не переводится с помощью файлов po.

Использование панели навигации

TVpNavBar, показанный справа на этом скриншоте демо navbar, представляет собой инструмент навигации, похожий на тот, который известен в Outlook. Он состоит из нескольких папок, представленных кнопочными элементами управления, и нескольких элементов - это помеченные значки в большом пространстве между двумя кнопками. Кнопка папки, которую можно нарисовать в нескольких стилях, похожих на кнопки или вкладки, всегда отображается над соответствующей областью элемента. Щелчок по папке делит стопку папок на верхнюю и нижнюю части и отображает элементы, назначенные этой папке, между соответствующей папкой вверху и следующей папкой внизу. Индекс развернутой в данный момент папки задается свойством ActiveFolder, а индекс выбранных элементов в этой папке задается свойством ActiveItem. Событие OnItemClick запускается при щелчке элемента, в качестве параметра он имеет индекс выбранного элемента.

Значок может быть назначен каждому элементу. Эти изображения собраны в списке изображений, назначенном свойству Images панели навигации. Изображения обычно должны быть 32x32 пикселей. Свойство IconSize каждой папки определяет, будут ли эти изображения отображаться непосредственно как «большие изображения» или уменьшены в 2 раза (16x16 пикселей) как «маленькие изображения». Уменьшение масштаба выполняется компонентом.
Заполнить TVpNavBar во время разработки легко, если версия VisualPlanIt по крайней мере 1.0.10, в которой работает редактор компонентов NavBar. Просто дважды щелкните по компоненту или выберите «Layout Tool ...» в контекстном меню компонента. Откроется редактор компонентов, отображаемый здесь в виде скриншота. Он содержит три списка:

Если версия VisualPlanIt древнее, чем версия 1.0.10, получение папок и элементов в NavBar будет немного сложнее, поскольку редактор компонентов еще не был перенесен/адаптирован для Lazarus. В этом случае лучше всего изучить эту задачу с помощью инспектора объектов:

Гаджеты

В дополнение к компонентам планировщика пакет Visual PlanIt содержит также два автономных гаджета:

TVpLEDLabel

Это 14-сегментный светодиодный дисплей, который может отображать любую строку ASCII. Строка определяется с помощью свойства Caption, но количество светодиодных символов должно быть определено явно с помощью свойства Columns

TVpClock

Это цифровые или аналоговые часы - в зависимости от свойства DisplayMode. Разнообразие настроек можно применять для каждого режима отдельно, используя свойства в AnalogOptions и DigitalOptions. Свойства в значительной степени говорят сами за себя, за исключением, возможно, DigitalOptions.MilitaryTime, который активирует 24-часовое отображение, если true, или 12-часовой режим am/pm, если false. AnalogOptions.ClockFace заменяет нарисованный по умолчанию циферблат часов растровым изображением - см. Скриншот выше.

С помощью свойства ClockMode работа часов может быть изменена со стандартных часов (cmClock) [на другие] (секундомер или таймер обратного отсчета, cmTimer и cmCountdownTimer соответственно).


From the Free Pascal wiki, page "Turbopower Visual PlanIt/ru", as it stood on 2020-03-02 after a change by Trev, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's Licensing page. If you have concerns about this material, message the admin.

Версия 2, последнее изменение: WikiArchive, .