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

Delphi 2010

В предыдущих постах я начал рассказывать о некоторых проблемах перевода приложения на Delphi с поддержкой юникод (2009/2010/XE). Одним из проявившихся артефактов стало некорректный формат ввода даты в DevExpress компонентах, при языка.

Скажем, когда мы устанавливаем чешский, то при попытке ввести дату по средствам компонента TcxDateEdit получаем следующее:

incorrect_date

Соответственно, при попытке осуществить ввод данных в таком формате, получаем ошибку (Could not convert variant of type (Unicode string) to type (Date)).

При этом в Delphi 2007 все работало без проблем. Тем не менее, как следует из материалов на официальном сайте DevExpress, пользователи продукта сталкивались с подобными проблемами и при работе с младшими версиями Delphi. Например, при попытке изменить формат даты в процессе выполнения приложение. Решение довольно простое.

Подключаем модуль cxFormats и выполняем следующий код:

cxFormatController.BeginUpdate;
cxFormatController.UseDelphiDateTimeFormats := True;
cxFormatController.EndUpdate;
cxFormatController.GetFormats;
cxFormatController.NotifyListeners;

Все становится на свои места.

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

DevExpress. TIPS & TRICKS #0
DevExpress. TIPS & TRICKS #2
DevExpress. TIPS & TRICKS #3
DevExpress. TIPS & TRICKS #4
DevExpress. TIPS & TRICKS #5
DevExpress. TIPS & TRICKS #5.5
DevExpress. TIPS & TRICKS #6
DevExpress. TIPS & TRICKS #7

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

На первый взгляд, языковые проекты нормально конвертируются. Более того, несмотря на то, что в Delphi 2007 специфические символы в переводах не отображаются правильно, *.dfn файлы (те в которых хранятся переводы ресурсов формы) содержат юникод строки. Поэтому, если эти проекты пересобрать в Delphi 2009/2010/XE, то все ранее вбитые переводы будут выглядеть так, как они должны выглядеть без дополнительных телодвижений:

translate

Но при детальном рассмотрении, выявляются некоторые артефакты.

Вот так будет отрабатываться казалось бы обычный код MessageDlg(‘To continue please restart the application.’, mtWarning, [mbOK], 0); на том же чешском языке.

artefact

Читать далее

В предыдущих постах серии я упоминал о том, что разработка новой версии приложения велась в Delphi 2007. Теперь настала очередь перевода проекта на Delphi с поддержкой юникод. В принципе об этой процедуре написано довольно много. Поэтому я остановлюсь только на тех моментах, которые вызвали у меня затруднения. Как обычно в формате “заметок на полях”.

Прежде всего, ASProtect. Я уже писал о том, как правильно осуществлять вызов функций ASProtect API. Это не сложно:

CheckKeyAndDecrypt( PChar(ansistring(eCode.Text)), 
PChar(ansistring(eName.Text)), True )

Однако, описание функции CheckKeyAndDecrypt выглядит следующим образом:

function  CheckKeyAndDecrypt      ( Key, Name : PChar; SaveKey: Boolean ): Boolean; external aspr_ide name ‘CheckKeyAndDecrypt';

Проблема же может возникнуть при вызове функций подобных этой:

function  GetRegistrationInformation   ( ModeID : Byte; var Key : PChar; var Name : PChar ): Boolean; external aspr_ide name ‘GetRegistrationInformation';

Параметры Key и Name – модифицируемые и передать выражение в качестве параметра уже нельзя.

Что делать в этом случае? Да просто изменить заголовки в файле aspr_api.pas.

function  GetRegistrationInformation   ( ModeID : Byte; var Key : PANSIChar; var Name : PANSIChar ): Boolean; external aspr_ide name ‘GetRegistrationInformation';

Вызов остается предельно простым:

var
pchKey, pchName: PANSIChar;

GetRegistrationInformation(0, pchKey, pchName);

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

Я покупал ASProtect SKE в 2006-м году и на последние версии продукта моя лицензия не распространяется. Однако, как выяснилось, самый простой вариант – скачать последнюю версию протектора и взять оттуда aspr_api.pas. Все исправления в заголовки там внесены, и с предыдущими версиями продукта работает прекрасно.Там же можно посмотреть и обновленные примеры использования.

Кроме этого, я обнаружил пару проблем с cxGrid (сохранение и восстановление заголовков полей). Но, об этом я напишу по факту решения данной проблемы.

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

Редизайн интерфейса приложения. #0
Редизайн интерфейса приложения. #1
Редизайн интерфейса приложения. #2
Редизайн интерфейса приложения. #4
Редизайн интерфейса приложения. #5
Редизайн интерфейса приложения. #6
Редизайн интерфейса приложения. #7
Редизайн интерфейса приложения. #8

Перед тем, как продолжить рассказ о TcxScheduler, начатый в прошлом посте серии,  отвечу на многочисленные вопросы читателей блога, относительно русской документации по DevExpress. Ее нет, и как мне удалось узнать, ее создание не планируется. Но возможно создание шаблонов руководства пользователя на русском  языке.

Вне зависимости от того, какое представление активно, в режиме исполнения (Run Time Mode) мы можем вызвать контекстное меню и обнаружить два неактивных пункта: New Event (новое событие) и New All Day Event (новое ежедневное событие). Очевидно, предполагается, что ExpressScheduler позволяет добавлять события. Для того, что бы активировать данную возможность добавим компонент TcxSchedulerStorage и укажем его в качестве значения свойства Storage нашего компонента TcxScheduler.

Теперь, запустив приложение, мы можем убедиться, что пункты контекстного меню стали доступными. Вызвав пункт New Event, мы увидим диалоговое окно, позволяющее настроить параметры события. Соответственно, после создания события появляется и его отображение в ExpressScheduler’е.

Читать далее

Те, кто следит за новостями русскоязычной Delphi-блогосферы, уже, наверняка успели ознакомиться с отчетом о борьбе с очередным приступом паранойи у очередного антивируса. Вообще, в последнее время мне кажется, что от бестолковых антивирусных программ вреда больше чем от всяческих троянов…

Вот моя история борьбы с Panda(ссылка в данный момент недоступна). Если полазить по различным форумам, то таких историй можно найти не мало.

После истории с Panda, я решил провести маленький эксперимент. Скомпилировал приложение из одной формы и залил exe на Virus Total. Полюбуйтесь отчетом! Это было собрано в Delphi 2010. Ради чистоты эксперимента я попросил тоже проделать нескольких своих коллег. Результат примерно тот же.

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

Серия моих постов о DevExpress осталась не законченной. И еще несколько постов про гриды я планирую сделать. Но недавно свалилась очередная интересная задача. Потребовалось “прикрутить” к приложению диаграмму Гантта.

Для решения данной задачи придется использовать сторонние компоненты. Очевидно, что вариантов два ExpressScheduler и TMS Planner. Есть и другие компоненты, но проект – не однодневка. И, вполне вероятно в будущем будет мигрировать на старшие версии Delphi. Своими руками рыть яму проекту не хочу, поэтому использоваться будет то, что гарантированно доживет до следующей версии Delphi. Более того, с учетом того, что DevExpress уже используется в приложении, практически со 100% й вероятностью будет выбран ExpressScheduler. Что, однако, не является поводом не посмотреть на TMS Planner, и не рассказать о нем в блоге.

Но начну, по понятным причинам, с ExpressScheduler.

Итак, прежде всего, посмотрим, из каких элементов состоит ExpressScheduler?

Читать далее

К сожалению, опять погряз в работе и мой блог недополучил запланированной доли внимания. Будем исправляться. Итак, новости прошедшей недели…

Обновился Delphi Roadmap.

В этом году мы должны увидеть Rad Studio XE. А анонсированные ранее кроссплатформенность и 64-битность будут, но чуть попозже. Возможно в первой половине следующего года. Читать далее

Клиент Delphi Prism

Шаг 3.1 Настройка подключения

  1. Запускаем Delphi Prism; Закрываем все проекты;
  2. Запускаем приложение – сервер;
  3. Открываем Server Explorer (Alt+Ctrl+S)
  4. Из контекстного меню DataConnection выбираем пункт Add Connection…
  5. Data Source меняем на DataSnap (DataSnap Provider) (если такого пункта нет, возможно у вас не полная версия Prism);
  6. Настраиваем соединение. Если вы все делали по умолчанию и запускаете Prism и сервер на одной машине, то настройки следующие:

Что бы как-то сгладить сумбур предыдущего поста, я, как и обещал, опишу все последовательность действий по созданию простого приложения DataSnap с нативным клиентом и .Net клиентом.

Инструментарий.

Для работы мы будем использовать БД MS Access (предположим, что она уже создана), Delphi 2010 Architect, а так же Delphi Prism 2010 и MS Visual Studio 2010. В принципе, версия .Net средств разработки не так уж и важна.

В качестве компонентов доступа к БД – AnyDAC.

В качестве путеводителя по возможностям DataSnap - руководство от Боба Сварта, откуда я иногда и буду дергать цитаты. Читать далее

imageup.ru - хостинг для изображенийВ прошлой части рассказа, я описал суть проблемы. Напомню вкратце, что необходимо создать трехзвенку, с MS Access в качестве СУБД и сервером приложений, написанном на Delphi. При этом клиенты должны разрабатываться и в Delphi (descktop client) и в .Net среде (ASP .Net application).

Все оказалось не совсем замечательно. Все официальные источники утверждают, что Delphi Prism может работать с DataSnap серверами. И это так. Но есть некоторые ограничения.

Как выяснилось, .Net приложения могут использовать только методы DataSnap. Вот, как описывает создание клиента в Delphi с помощью метода Боб Сварт:

Читать далее

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



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