Поиск по блогу

четверг, 21 января 2010 г.

Добавление и удаление атрибутов узлов (вершин) в XML в Delphi (с использованием компонента TTreeView)

Предыдущая статья на тему — "Добавление и удаление вершин в XML (визуализация с помощью TTreeView)".

Продолжаю развивать начатую тему про редактирование XML. Сегодня будем добавлять и удалять атрибуты узлов.

Для этого создадим контекстное меню и привяжем его к объекту TValueListEditor, расположенному на закладке Attributes (исходники полученной на ранних этапах заготовки можно скачать). Напомню, что атрибуты и их значения попадают в ValueListEditor благодаря следующему участку кода в обработчике события OnClick экземпляра компонента TTreeView:

try
ValueListEditor.Strings.Clear;
for i := 0 to iNode.AttributeNodes.Count -1 do
ValueListEditor.InsertRow(iNode.AttributeNodes[i].NodeName,
iNode.AttributeNodes[i].Text,true);
except
end;


В меню создаем 2 пункта (Insert и Delete) и прописываем в их обработчиках:

procedure TMainF.insert1Click(Sender: TObject);
var
S : String ;
begin
if CurrNode = nil then exit;
if CurrNode.ParentNode = nil then exit;
S := InputBox('Введите имя атрибута:','Введите имя атрибута:','');
try
if S <> '' then ValueListEditor.InsertRow(S,'value',false);
except
ShowMessage('Такой атрибут уже существует');
end;
end;

Сейчас при выборе insert в контекстном меню у нас будет такая картина:


Вводим название атрибута, в результате чего он добавляется в список и его значение можно будет отредактировать.


Если делать все по-правильному, то при вводе названия атрибута надо бы проверять его на валидность (чтобы начиналось с буквенного символа, не включало недопустимые символы (пробелы и т.д.)). Но это уже детали, пока оставим так, как есть (при попытке добавить узел с невалидным именем будет эксепшн).

Для редактирования значений атрибутов напишем в обработчике OnStringsChange следующее:

procedure TMainF.ValueListEditorStringsChange(Sender: TObject);
var
i : integer;
AttName,
AttValue : String;
begin
for i := 0 to ValueListEditor.RowCount - 1 do
begin
try
AttName := ValueListEditor.Keys[i];
except
AttName := 'attribute'+intToStr(i);
end;
try
AttValue := ValueListEditor.Values[AttName];
except
AttValue := '';
end;
try
if AttName <> '' then
CurrNode.Attributes[AttName] := AttValue;
except
end;
end;
end;


Ну и листинг процедуры удаления атрибута:

procedure TMainF.delete1Click(Sender: TObject);
var
i : integer ;
K : String ;
begin
ValueListEditor.OnStringsChange := nil;
i := ValueListEditor.Selection.Top;
K := ValueListEditor.Keys[i];
ValueListEditor.DeleteRow(i);
CurrNode.AttributeNodes.Delete(K);
ValueListEditor.OnStringsChange := ValueListEditorStringsChange;
end;


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

Чтобы быть в курсе обновлений блога, можно подписаться на RSS.

Статьи схожей тематики:



Комментариев нет:

Отправить комментарий

Комментарии модерируются, вопросы не по теме удаляются, троллинг тоже.

К сожалению, у меня нет столько свободного времени, чтобы отвечать на все частные вопросы, так что, может, свой вопрос лучше задать на каком-нибудь форуме?

Поделиться