Не так уж давно я расказывал в блоге про библиотеку для работы с 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, который использую сейчас.
Вот модуль [download id=»58″ format=»1″]
Его необходимо подключать в uses после модуля NativeXML.
В целом сlass helper позволил мне без больших затрат времени решить проблемы с предупреждениями компилятора.
Книжная полка
Описание: Рассмотрены практические вопросы по разработке клиент-серверных приложений в среде Delphi 7 и Delphi 2005 с использованием СУБД MS SQL Server 2000, InterBase и Firebird. Приведена информация о теории построения реляционных баз данных и языке SQL. Освещены вопросы эксплуатации и администрирования СУБД.
|
||
Название: О чем не пишут в книгах по Delphi
Описание: Рассмотрены малоосвещенные вопросы программирования в Delphi. Описаны методы интеграции VCL и API. Показаны внутренние механизмы VCL и приведены примеры вмешательства в эти механизмы. Рассмотрено использование сокетов в Delphi: различные режимы их работы, особенности для протоколов TCP и UDP и др.
|
Дим а как обстоят дела у натива с делфой 2010… может у меня версия просто старая, но на поздних версиях русские буквы аброкадаряться, причем в семерке работет нормально
я Vlad :). Использую NativeXML на Delphi 2010 за все время работы один единственные раз пришлось использовать UTF8ToAnsi() и то, потому, что просили сделать модуль под 6-ку. Никаких проблем с кодировками не наблюдал. Последняя версия 3.08 — лежит на форуме
#delphi Class helper для NativeXML. http://www.webdelphi.ru/2010/07/class-he…
RT @WebDelphi: #delphi Class helper для NativeXML. http://www.webdelphi.ru/2010/07/class-he…
Идею можно подкинуть авторам NativeXML. Глядишь, в новой версии модуля включат ваши наработки :)
Да собственно идея уже витает по их форуму, но чё-та никто не спешит поделиться там своим class helper’ом :) Мож и правда наткнуться на мой грешный блог и позаимствуют
Гениально :)
Ну может быть…класс хэлперы вообще вещь классная