Блог Александра Божко
Архивы
Рубрики

Технические приемы

Пост шпаргалка. Если вы обладатель Delphi XE6 или Delphi XE7, вам не нужно делать каких-то хитрых телодвижений, для того, создания кнопок на панели, соответствующей приложению в TaskBar‘е. Вы можете воспользоваться компонентом TTaskBar и, таким образом, решить все проблемы. Но, что делать, пользователям Delphi предыдущих версий (попутно напомню,  что при покупке последней версии Delphi вы получаете ключи ко всем предыдущим версиям, начиная с Delphi 7)?

У Боба Сворта есть довольно подробный солюшн, но я нашел в нем некоторые неточности. Ниже приведу свою, немного модифицированную версию данного решения.

Создание TaskbarList‘а ничем особо не отличается. Этот код будет работать и в Windows 7 и в Windows 8:

 

  procedure CreateTaskBarList();
  begin
      TaskbarList := CreateComObject(CLSID_TaskbarList) as ITaskbarList;
      TaskbarList.HrInit;
      Supports(TaskbarList, IID_ITaskbarList2, TaskbarList2);
      Supports(TaskbarList, IID_ITaskbarList3, TaskbarList3);
      Supports(TaskbarList, IID_ITaskbarList4, TaskbarList4);

    if not Application.MainFormOnTaskBar then
      FormHandle := Application.Handle
    else FormHandle := Application.MainForm.Handle;

      TaskbarList3.ThumbBarSetImageList(FormHandle, FMain.ImageList2.Handle);
  end;

Естественно, предварительно нужно проверить версию Windows (она должна быть не ниже 7). Я делаю это так же как и Dr. Bob:

  NeedCreateTBwButtons:= ((Win32MajorVersion=6) and (Win32MinorVersion>0)) or (Win32MajorVersion>6);

В надежде на то, что в последующих версиях Windows этот функционал никуда не денется. Ниже приведены значения переменных для существующих версий системы.

Win32MajorVersion Win32MinorVersion
6
  • Windows 8 (version 6.2)
  • Windows 7 (version 6.1)
  • Windows Vista (version 6.0)
5
  • Windows XP (version 5.1)
  • Windows 2000 (version 5.0)

А вот с кнопками на панели все не так просто. То, что показано в исходном примере работать будет. Но только для случая с одной кнопкой. Если внимательно почитать документацию, то в качестве параметра для метода ThumbBarAddButtons передается ссылка на массив THUMBBUTTON, а не на отдельную кнопку. Максимальное количество элементов в массиве – 7. Массив должен быть статическим.

Я описал его так:

ThbButtons: array [0..3] of TThumbButton;

Соответственно, кнопки я создаю следующим образом:

    ThbButtons[0].iId := 42;
    ThbButtons[0].iBitmap := 0;
    ThbButtons[0].dwMask := THB_FLAGS or THB_BITMAP or THB_TOOLTIP;
    ThbButtons[0].dwFlags :=  THBF_ENABLED;

    StrCopy(ThbButtons[0].szTip, PChar('Start Timer'));

    ThbButtons[1].iId := 43;
    ThbButtons[1].iBitmap := 1;

    ThbButtons[1].dwMask := THB_FLAGS or THB_BITMAP or THB_TOOLTIP;
    ThbButtons[1].dwFlags :=  THBF_ENABLED;

    StrCopy(ThbButtons[1].szTip, PChar('Pause Timer'));

    ThbButtons[2].iId := 44;
    ThbButtons[2].iBitmap := 2;

    ThbButtons[2].dwMask := THB_FLAGS or THB_BITMAP or THB_TOOLTIP;
    ThbButtons[2].dwFlags :=  THBF_ENABLED ;

    StrCopy(ThbButtons[2].szTip, PChar('Stop Timer'));

    ThbButtons[3].iId := 45;
    ThbButtons[3].iBitmap := 3;

    ThbButtons[3].dwMask := THB_FLAGS or THB_BITMAP or THB_TOOLTIP;
    ThbButtons[3].dwFlags :=  THBF_ENABLED;

    StrCopy(ThbButtons[3].szTip, PChar('Cancel'));

    TaskbarList3.ThumbBarAddButtons(FormHandle, 4, @ThbButtons);

Значения флагов, что называется “dwFlags”, не буду здесь их перечислять, для этого есть документация.

Как вы, наверное, уже догадались, здесь я реализовал кнопки  таймера. Обработчик события нажатия кнопок можно реализовать так. как и в базовом примере (отловить сообщение WM_COMMAND). В демонстрационном примере он у меня сработал, а вот в реальном приложении, – почему-то нет. Вероятно, где-то что-то перекрывается. Я не слишком огорчился сему факту, и использовал событие OnMessage компонента ApplicationEvents.

Получилось примерно так: Читать далее

Небольшая зарубка на память, касающаяся FireDAC в актуальной версии Delphi XE6. Но прежде, пару слов о том, где искать ответы на вопросы, касающиеся FireMonkey. Русскоязычные пользователи здесь оказались в привилегированном положении.

Fire-monkey.ru – русскоязычный форум, посвященный FireMonkey, администрируемый и модерируемый Ярославом Бровиным. Так что здесь вы сможете получить ответы, что называется, “из первых рук”. Еще один ресурс давно и хорошо известен – форум SQL.RU и тема, посвященная FireDAC. Здесь вы сможете получить ответы от Дмитрия Арефьева, автора данной библиотеки. И еще хочу порекомендовать блог Андрея Ефимова, в котором собраны ответы на наиболее популярные вопросы, касающиеся FireMonkey.

Собственно, теперь сама заметка.

Для соединения с БД используем FireDAC. База, похоже, значения не имеет. Тестировал на MSAccess и на SQLite. С помощью LiveBinding в XE6 подключаем ListBox. При перемещении по списку перемещение по DataSet’у не происходит. В XE5, однако, все работает нормально. Подключение с помощью dbGo, тоже работает.

Для разрешения данной проблемы следует установить значение FetchOptions.LiveWindowParanoic в True.

Узнать больше:

Читать далее

Для чего это нужно?

Речь идет не о компиляции приложения из IDE в эмуляторе, а именно о запуске собранного приложения. Эту возможность могут использовать тестировщики и прочие “заинтересованные персоны”. При этом  никакие платные инструменты не используются. Все что нужно для того, что бы посмотреть на Windows (или Mac OS) машине как работает ваше приложение, находится в свободном доступе.

Что нужно для работы?

Главным инструментом, который необходим для работы является Android SDK. Android SDK предоставляет API библиотеки и средства разработки, необходимые для создания, тестирования и отладки Android приложений. Скачать SDK можно на официальном сайте. Размер 510 М.

Кроме этого, приложения придется запускать с параметрами. Проводник Windows сам по себе является далеко не лучшей оболочкой. Для работы же с параметрами приложений он не предназначен принципиально. Что бы не мучатся с cmd я рекомендую использовать “олдскульный” менеджер файлов (например FAR Manager или Total Commader).

Настройка эмулятора

После скачивания Android SDK вам необходимо распаковать архив и запустить SDK Manager.exe. С помощью менеджера вы сможете настроить установленные компоненты SDK. Для работы эмулятора вам понадобится как минимум Android SDK Tools, Android SDK Platform-tools и SDK Platform для соответствующей версии API.

SDKManager

После того, как вы убедитесь, что необходимые компоненты установлены запустите на выполнение файл android.bat с параметром avd из каталога <SDK Path>\sdk\tools. Таким образом будет запущен Android Virtual Device Manager. Читать далее

Еще при подготовке к харьковскому мероприятию в рамках Мирового тура RAD Studio XE5 я столкнулся с небольшой проблемой в работе с SQLite с помощью FireDAC. Если заполненную в Windows приложении базу перенести вместе с приложением на Android, кириллические строки в базе перестают читаться (вместо букв отображаются знаки вопроса). Однако, если заполнять базу непосредственно на мобильном устройстве, русские символы считываются вполне корректно. Данные из базы заполненной в стороннем приложении, или в Delphi приложении, использующем другие компоненты доступа к данным, так же отображались нормально. Слету найти решения не удалось, и мне пришлось процитировать известного украинского футбольного специалиста: “Будем разбираться!”

В отличие от последнего, разобраться с описанной проблемой мне удалось. По умолчанию при подключении к SQLite в FireDAC используется формат строк ANSI.

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

 

Делу время, а потехе час. Это я к тому, что помимо исследований Delphi для Android (а вы уже тестируете бету?) есть работа, которую нужно делать.  За сим, очередной пост-шпаргалка, возможно, кому-нибудь пригодится.

В коде моих проектов имеется множество функций, подобных, приведенной ниже.

function TFMain.ExtDescrExists(): Boolean;
var
 qry: TADOQuery;
begin
 Result:= True;
 try
 qry:= TADOQuery.Create(Self);
 qry.Connection:= DM.cnDatabase;
 qry.SQL.Add('SELECT ExpenseID FROM tblProjectExpenses WHERE ExpenseDescription<>NULL');

 qry.Open;
 if qry.IsEmpty then
 begin
  Result:= False;
 end;
 qry.Close;
 finally
 FreeAndNil(qry);
 end;

end;

Откровенно говоря, подобный код мне не особо нравится, прежде всего из-за громоздкости. Обратите внимание на рисунок:

237matches

Необходимость повторного использования кода в данном случае очевидна. Однако, сделать универсальное решение не совсем просто, поскольку в некоторых случаях проверяется наличие записей в таблице, в других – требуется извлечь значения различных типов. Чтобы решить эту задачу, я набросал небольшой класс: Читать далее

Очередной пост, рожденный из практической задачи.

Я уже неоднократно писал о том, что для защиты приложений использую ASProtect SKE, и время от времени мне приходится решать нестандартные задачи, связанные с его использованием. Как раз сегодня, мне пришлось поэкспериментировать с одной из таких задач. Суть в следующем. В нашем проекте существует основное приложение и несколько приложений сателлитов. Эти дополнительные приложения продаются отдельно и, соответственно, защищаются отдельными ключами. В один прекрасный момент мы решили одно из таких приложений объединить с главным, сохранив при этом необходимость его регистрации.

Иными словами, приложение должно проверять не один ключ, а сразу два. Можно ли это реализовать с помощью ASProtect? Я решил это проверить.

Актуальная версия ASProtect SKE – 2.65. Хотя я продолжаю использовать более раннюю версию (2.2), рекомендую все же скачать и установить последнюю. Дело в том, что в ней представлен исправленный файл aspr_api.pas, адаптированный для работы с новыми версиями Delphi, поддерживающими unicode. В принципе, вы можете использовать и более раннюю версию продукта с обновленными api заголовками.

В качестве базового я взял пример из комплекта поставки (..Reg_trial\Delphi).

Прежде всего, давайте откроем .aspr2 файл – проект ASProtect. В оригинальном примере он содержит два режима: Trial Mode и Registered Mode. Кроме того, следует убедиться, что ключ хранится в текстовом файле. Для этого откройте пункт меню Options | Keys storage area type:

asprotect_storage_type Читать далее

Как вы знаете, начиная с XE2 в Delphi в качестве встроенного генератора отчетов используется специальная версия FastReport.

И единственная проблема, которая в связи с этим возникает – перевод старых отчетов, написанных на Rave, на Fast Report. К счастью, команда Fast Reports Inc. позаботилась о пользователях и предоставила конвертер отчетов из Rave в Fast Report. Детально процедура использования конвертера описана в блоге Антона Хайрудинова.

Совершенно недавно я попробовал преобразовать некоторые из отчетов в моем рабочем проекте на FR. И мне это удалось! Однако, были нюансы, о которых ниже.

По сути, конвертер отчетов представляет собой один единственный модуль (ConverterRR2FR.pas). Он поставляется с исходным кодом, и, в свою очередь, использует следующие модули:

{ FastReport }

frxClass,
frxBarCode,
frxBarcod,
frxADOComponents,
frxBDEComponents,
frxDBXComponents,
frxIBXComponents,
frxCustomDB,

{ RaveReport }

RpDefine,
RpRave,
RpBase,
RpSystem,
RpBars,
RvClass,
RvProj,
RvCsRpt,
RvDefine,
RvCsStd,
RvCsBars,
RvCsDraw,
RvCsData,
RvDatabase,
RvDriverDataView;

Вот тут и начинается самое интересное. Прежде всего, XE2 стала последней версией, в которой присутствовал Rave Report.

В Delphi XE3 Rave Report уже нет!

А модули RR нужны, иначе ConverterRR2FR.pas попросту не откомпилируется. Как следствие, единственная версия Delphi, в которой вы можете использовать данный инструмент, без дополнительных ухищрений – XE2. Однако, здесь уместно напомнить, что все владельцы XE3 автоматически получают лицензию и на предыдущие версии соответствующих продуктов. В том числе, и на XE2.

Вторая сложность заключается в том, что ConverterRR2FR при работе использует модули, которых нет в Embarcadero редакции FastReport (frxADOComponents,  frxBDEComponents,  frxDBXComponents, frxIBXComponents). И здесь следует воспользоваться недвусмысленными рекомендациями форума поддержки:

FR Embarcadero Edition dosn’t support internal datasets. So, easy way – install FR Trial and convert Rave reports. Other way – comment all references to internal datasets classes in ConverterRR2FR.pas

FR Embarcadero Edition не поддерживает внутренних датасетов. Поэтому простейший вариант – установить FR Trial и преобразовать отчеты Rave. Второй способ – закомментировать все ссылки на классы внутренних датасетов в ConverterRR2FR.pas.

Я воспользовался первым вариантом.

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

В принципе все зависит от исходных отчетов. В моем случае их около 30. “История успеха”, описанная на том же форуме поддержки свидетельствует об успешном преобразовании более чем 300 отчетов.

Повторюсь, что если вы хотите перевести свой проект на старшую версию Delphi, но до этого использовали Rave, то без конвертации отчетов вам не обойтись. Но данная процедура не слишком болезненна.

В одном из следующих постов я собираюсь рассказать о значительно более веселой и трепетной во всех отношениях процедуре. А именно, о сабмите Delphi приложения на Microsoft AppStore.

11 октября в Харькове прошел семинар в рамках RAD Studio XE3 World Tour. Подробный отчет о семинаре вы можете увидеть на сайте http://delphixe.com.ua/.

Я на семинаре показывал небольшой пример, иллюстрирующий работу механизма Visual LiveBinding. Как и обещал, выкладываю видео и, собственно, сам пример.

В качестве СУБД я использовал SQLite, компоненты доступа, для чистоты эксперимента, от стороннего производителя – LiteDAC от DevArt.

Я полностью записал весь процесс создания приложения, который занял около 20 минут. Получилась небольшая иллюстрация того, что теперь в FireMonkey приложения для работы с БД можно создавать практически так же просто, как и в VCL. Я не буду здесь приводить развернутых описаний, лишь вкратце расскажу, суть происходящего на видео. Если у вас возникнут вопросы, вы можете задать их в комментариях.

Первый ролик показывает процесс подключения компонентов доступа к БД. По сути ничем не отличается от аналогичного процесса в VCL.

Ролик 1. Читать далее

За последние дни мне пришло сразу несколько писем с вопросами относительно использования FireMonkey 3D. Прошу меня простить, если не сразу отвечаю на них, но ответы часто требуют некоторой подготовки. К тому же, не на все ваши вопросы можно ответить в двух словах. Естественно, что отвечать я планирую в данном блоге.

Данный пост родился в процессе подготовки одного из таких “ответов”. Описанный ниже прием я решил вынести в отдельный пост исключительно ради более удобной структуризации материала.

Как импортировать COLLADA (.dae) модель в FireMonkey программно (в Run Time).

Изначально, в секции uses необходимо подгрузить два модуля FMX.DAE.Importer и FMX.Import.

Приведенный ниже код демонстрирует как решить поставленную задачу.

var
MI: TDAEModelImporter;
ImSe: TModelImportServices;

begin
 MI:=TDAEModelImporter.Create;
 ImSe:=  TModelImportServices.Create;
 ImSe.RegisterImporter(MI);

 Model3D1.LoadFromFile('H:\ScreenShorts\SU_Model\cube.dae');

...
end;

Прежде чем загружать файл в компонент TModel3D, мы должны зарегистрировать т.н. импортер. Иначе формат файла попросту не будет распознан. В режиме проектирования, как вы знаете, ничего подобного делать не нужно. Достаточно просто задать свойство MeshCollection с помощью встроенного диалога.

О том, какие нюансы существуют при импорте моделей в FireMonkey - в следующем посте.

А пока напоминаю:

  1. До окончания конкурса осталось менее недели!
  2. Воспользоваться специальными предложениями Embarcadero вы можете только до 29 июня.

Другие статьи серии:

FireMonkey. Tips & Tricks #0
FireMonkey. Tips & Tricks #1
FireMonkey. Tips & Tricks #2 (Upd2)
FireMonkey. Tips & Tricks #4

Не могу пройти мимо этой статьи. Визуализация физики биллиарда с помощью FireMonkey. Anders Ohlsson.

Отличный пример с исходным кодом. Рекомендую всем. кто хочет познакомиться с 3D возможностями FireMonkey.

Продукты DevArt
Купить онлайн:



Читай русскоязычные Delphi блоги
Каталог блогов Blogdir.ru
Яндекс.Метрика