Подписка

добавить на Яндекс

Наши проекты

Delphi+Google

Google API

Google API в Delphi - проект с открытым исходным кодом.

Chrono

Chrono

Хронометр - программа для ведения списка задач.

ODFProc

ODFProc

ODFProc - работа с документами OpenOffice в Lazarus и FreePascal.

Поддержка блога

А тут я коплю на лицензию Delphi XE на iPad =).
Сумма пожертвования не фиксирована.

Публикации

Год назад

Случайный пост

Последние

Сообщения форума

Комментарии

Социальные сети

Google

Facebook

Twitter

Опрос

Вы сейчас или в ближайшем обозримом будущем планируете разрабатывать кроссплатформенное приложение с использованием Firemonkey?



Loading ... Loading ...

Блоги и сообщества

Статьи по Delphi DelphiFeeds.ru - Все Delphi-блоги Рунета Сообщество умных людей VR-Online.RU Бесплатный журнал для программистов и всех, кто интересуется IT Статьи и уроки по Delphi Новостной блог о высоких технологиях
Система Orphus
Опубликовал Vlad 10 июля 2010 в 16:13.
Категории: Delphi в Web.


Не так уж давно я расказывал в блоге про библиотеку для работы с XML - NativeXML. В целом работа с библиотекой достаточно удобна и проста. Имеется достаточно методов и свойств объектов, позволяющих одной операцие записать в XML хоть простое число, хоть TRect или даже TBrush. В общем каких-либо серьезных нареканий по работе с этой библиотекой у меня нет. Кроме одного - бесчисленный предупреждений компилятора:

W1057 Implicit string cast from 'string' to 'UTF8String'

С одной стороны, можно было бы махнуть рукой и сказать "да и хрен с ними - с варнингами", а с другой стороны, прочитав статью на DelphiKingdom "Hints and Warnings или Спасение утопающих" как-то не горел желанием оставить всё как есть, тем более, что количество warnings в двух модулях по (примерно 2000 строк в каждом) обнаружилось порядка 450. Вобщем не мало. Вариантов решения проблем с сообщениями компилятора у меня было несколько.

Первый вариант самый простой - отключить все warnings с помощью директив компилятора. Но этот вариант, сами понимаете, только для успокоения себя, но никак не для решения проблемы.
Второй вариант - изменить типы всех строковых переменных со string на UTF8String или присваивать значения переменным, например так:

var s: string
     utf8: UTF8String;
begin
  s:=string(utf8);
  utf8:=UTF8String(s)
end;

В этом случае все warnings были бы разрешены и всё было б замечательно. Если б не одно НО. Во-первых модули по объему, скажем так, не мелкие и выискивать в них каждое присвоение, заворачивать строку в string или UTF8String - дело муторное и долгое. Во-вторых, лишний тескт в коде процедуры или функции никак не делает её более чиабельной - код "захламляется".
И тут вспомнилась ещё одна замечательная возможность новой версии Delphi - использование class helpers.
Почему бы не использовать эту возможность для разрешения предупреждений компилятора - немного расширить возможности класса TXMLNode и позволить ему работать не только с UTF8Strings, но и обычными string'ами, которые в Delphi 2010 ни что иное как UnicodeString.
Объявляем следующий хэлпер:

TXMLNode_ = class helper for TXMLNode

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

  function NodeNew(const AName: UTF8String): TXmlNode;

Создаем новый метод в хэлпере:

  function NodeNew(const AName: String): TXmlNode;overload;
...
function TXMLNode_.NodeNew(const AName: String): TXmlNode;
begin
  Result:=NodeNew(UTF8String(AName));
end;

Теперь у нас есть два метода NodeNew. Первый принимает UTF8String, второй - string.
Теперь, что касается свойств. Я наиболее часто использовал следующие свойства класса TXMLNode:

property Name: UTF8String read FName write SetName;
property AttributeName[Index: integer]: UTF8String read GetAttributeName write SetAttributeName;

Создадим аналогичные свойства, но рассчитанные на работу со string:

type
 TXMLNode_ = class helper for TXMLNode
 private
   function GetNameUnicode: string;
   procedure SetNodeUnicode(const aName: string);
   function GetAttributeUnicodeName(index:integer):string;
   procedure SetAttributeUnicodeName(index:integer; aValue:string);
 public
   function  NodeNew(const AName: String): TXmlNode;overload;
   property  NameUnicode: string read GetNameUnicode write SetNodeUnicode;
   property  AttributeUnicodeName[Index: integer]: String read GetAttributeUnicodeName write SetAttributeUnicodeName;
end;
 
implementation
 
function TXMLNode_.GetNameUnicode: string;
begin
  Result:=string(Name);
end;
 
procedure TXMLNode_.SetNodeUnicode(const aName: string);
begin
  Name:=UTF8String(aName);
end;
 
function TXMLNode_.GetAttributeUnicodeName(index: integer): string;
begin
  Result:=string(AttributeName[index])
end;
 
procedure TXMLNode_.SetAttributeByUnicodeName(const aName, aValue: string);
begin
  AttributeByName[UTF8String(aName)]:=UTF8String(aValue);
end;

Таким образом мы добавили два новых свойства для узла TXMLNode. Аналогичным образом можно расширять и дополнять другие методы и свойства класса. Все их я рассматривать не буду, а просто выложу тот class helper для TXMLNode, который использую сейчас.
Вот модуль zip NativeHelper(859 bytes)
Его необходимо подключать в uses после модуля NativeXML.
В целом сlass helper позволил мне без больших затрат времени решить проблемы с предупреждениями компилятора.

-------------------------------------------------
Воровство и мошеничество в Сети цветет махровым цветом. А почему? Потому, что нам подчас лень придумывать и запоминать сложные пароли. Почему бы в этом случае не использовать Генератор паролей - пусть машина сгенерирует случайный пароль, а мы только запомним или запишем на бумажке.
-------------------------------------------------
Понравилась статья? Тогда:
Делись! Загружай! Плюсуй!
   Отправить PDF на   
Читай ещё статьи на WebDelphi.ru

Комментарии (8)

WP_Cloudy
  • WebDelphi пишет:

    #delphi Class helper для NativeXML. http://www.webdelphi.ru/2010/07/class-he...

  • BegemoT пишет:

    Дим а как обстоят дела у натива с делфой 2010… может у меня версия просто старая, но на поздних версиях русские буквы аброкадаряться, причем в семерке работет нормально

  • Vlad пишет:

    я Vlad :). Использую NativeXML на Delphi 2010 за все время работы один единственные раз пришлось использовать UTF8ToAnsi() и то, потому, что просили сделать модуль под 6-ку. Никаких проблем с кодировками не наблюдал. Последняя версия 3.08 — лежит на форуме

  • AlanAnalista пишет:

    RT @WebDelphi: #delphi Class helper для NativeXML. http://www.webdelphi.ru/2010/07/class-he...

  • Максим Коробов пишет:

    Идею можно подкинуть авторам NativeXML. Глядишь, в новой версии модуля включат ваши наработки :)

  • Vlad пишет:

    Да собственно идея уже витает по их форуму, но чё-та никто не спешит поделиться там своим class helper’ом :) Мож и правда наткнуться на мой грешный блог и позаимствуют

  • Ромко пишет:

    Гениально :)

  • Vlad пишет:

    Ну может быть…класс хэлперы вообще вещь классная

Ваш ответ

Внимание: Все комментарии модерируются, и это может вызвать задержку их публикации. Отправлять комментарий заново не требуется.

Пожалуйста, заключайте исходный код в тэги [code][/code].
Если код большой, то воспользуйтесь Вставкой кода на отдельной странице и оставьте в комментарии ссылку на исходник