Не так уж давно я расказывал в блоге про библиотеку для работы с 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, который использую сейчас.
Вот модуль
NativeHelper(859 bytes)
Его необходимо подключать в uses после модуля NativeXML.
В целом сlass helper позволил мне без больших затрат времени решить проблемы с предупреждениями компилятора.
Воровство и мошеничество в Сети цветет махровым цветом. А почему? Потому, что нам подчас лень придумывать и запоминать сложные пароли. Почему бы в этом случае не использовать Генератор паролей - пусть машина сгенерирует случайный пароль, а мы только запомним или запишем на бумажке.
-------------------------------------------------
| Делись! | Загружай! | Плюсуй! |
| | |









10 Июл 2010 в 1:24 пп
#delphi Class helper для NativeXML. http://www.webdelphi.ru/2010/07/class-he...
11 Июл 2010 в 9:35 дп
Дим а как обстоят дела у натива с делфой 2010… может у меня версия просто старая, но на поздних версиях русские буквы аброкадаряться, причем в семерке работет нормально
11 Июл 2010 в 11:04 дп
я Vlad :). Использую NativeXML на Delphi 2010 за все время работы один единственные раз пришлось использовать UTF8ToAnsi() и то, потому, что просили сделать модуль под 6-ку. Никаких проблем с кодировками не наблюдал. Последняя версия 3.08 — лежит на форуме
12 Июл 2010 в 2:21 пп
RT @WebDelphi: #delphi Class helper для NativeXML. http://www.webdelphi.ru/2010/07/class-he...
23 Июл 2010 в 2:58 дп
Идею можно подкинуть авторам NativeXML. Глядишь, в новой версии модуля включат ваши наработки :)
23 Июл 2010 в 3:00 дп
Да собственно идея уже витает по их форуму, но чё-та никто не спешит поделиться там своим class helper’ом :) Мож и правда наткнуться на мой грешный блог и позаимствуют
02 Апр 2011 в 7:50 пп
Гениально :)
02 Апр 2011 в 8:15 пп
Ну может быть…класс хэлперы вообще вещь классная