уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

Не так уж давно я расказывал в блоге про библиотеку для работы с 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 и др.
купить книгу delphi на ЛитРес
0 0 голоса
Рейтинг статьи
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Подписаться
Уведомить о
8 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии
BegemoT
11/07/2010 09:35

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

WebDelphi
10/07/2010 13:24

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

AlanAnalista
AlanAnalista
12/07/2010 14:21
Ответить на  WebDelphi

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

Максим Коробов
Максим Коробов
23/07/2010 02:58

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

Ромко
Ромко
02/04/2011 19:50

Гениально :)