IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> иерархическая структура объектов, Delphi 7
сообщение
Сообщение #1


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


Здравствуйте!
Есть тема "Иерархия структуры таблицы Менделеева", в пределах которой нужно построить иерархию объектов, состоящей как минимум из 3-х уровней.
Для демонстрации работы построенной иерархии классов, создаётся приложение, позволяющее:
создавать, удалять объекты, изменять характеристики объектов, визуализировать объекты, манипулировать на форме объектами, сохранять/считывать текущее состояние объектов в формате XML.

Есть некоторые задумки насчёт иерархии (изображение)...Может кто-нибудь подскажет другой подход?
Ну а прежде всего - трудности с визуализацией и манипулированием объектами...Может быть у кого-нибудь есть идеи, как для начала идейно подойти к этим вопросам? что можно придумать? Подскажите пожалуйста..!


Эскизы прикрепленных изображений
Прикрепленное изображение
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Гость






Твои атрибуты... Смотри, сохранять дерево (вместе с тем, что хранится в объектах, связанных с узлами), можно так:
procedure Tree2XML(tree: TTreeView);
var
tn : TTreeNode;
XMLDoc : TXMLDocument;
iNode : IXMLNode;

procedure ProcessTreeItem(tn: TTreeNode; iNode: IXMLNode);
var cNode : IXMLNode;
begin
if tn = nil then Exit;

cNode := iNode.AddChild('item');
cNode.Attributes['text'] := tn.Text;
cNode.Attributes['imageIndex'] := tn.ImageIndex;
cNode.Attributes['stateIndex'] := tn.StateIndex;
// Вот это и есть твой атрибут ...
if tn.Data <> nil then begin
cNode.Attributes['sData'] := TBPeriod(tn.Data).sData;
end
else cNode.Attributes['sData'] := '';

tn := tn.getFirstChild;
while tn <> nil do begin
ProcessTreeItem(tn, cNode);
tn := tn.getNextSibling;
end;
end; (*ProcessTreeItem*)

begin
XMLDoc := TXMLDocument.Create(nil);
XMLDoc.Active := True;
iNode := XMLDoc.AddChild('tree2xml');
iNode.Attributes['app'] := ParamStr(0);

tn := tree.TopItem;
while tn <> nil do begin
ProcessTreeItem (tn, iNode);
tn := tn.getNextSibling;
end;
XMLDoc.SaveToFile(ChangeFileExt(ParamStr(0),'.XML'));
XMLDoc := nil;
end; (* Tree2XML *)

procedure TForm1.btnSaveXMLClick(Sender: TObject);
begin
Tree2XML(TreeView1);
end;
Чтобы восстановить из XML сохраненное таким образом дерево:
procedure XML2Tree(tree: TTreeView; XMLDoc: TXMLDocument);
var
iNode : IXMLNode;

procedure ProcessNode(Node : IXMLNode; tn: TTreeNode);
var
cNode : IXMLNode;
newPeriod: TBPeriod;
begin
if Node = nil then Exit;

with Node do begin
// Есть сохраненные атрибуты? Восстанавливаем ...
if Attributes['sData'] <> '' then begin
newPeriod := TBPeriod.Create(
Attributes['text'], Attributes['sData']
);
tn := tree.Items.AddChildObject(
tn, Attributes['text'], newPeriod as TObject
);
end
else // Нету? И не надо ...
tn := tree.Items.AddChild(tn, Attributes['text']);

tn.ImageIndex := Integer(Attributes['imageIndex']);
tn.StateIndex := Integer(Attributes['stateIndex']);
end;

cNode := Node.ChildNodes.First;
while cNode <> nil do begin
ProcessNode(cNode, tn);
cNode := cNode.NextSibling;
end;
end; (*ProcessNode*)
begin
tree.Items.Clear;
XMLDoc.FileName := ChangeFileExt(ParamStr(0),'.XML');
XMLDoc.Active := True;

iNode := XMLDoc.DocumentElement.ChildNodes.First;

while iNode <> nil do begin
ProcessNode(iNode,nil);
iNode := iNode.NextSibling;
end;

XMLDoc.Active := False;
end;

procedure TForm1.btnLoadTreeClick(Sender: TObject);
var
ParentObj: TComponent;
XMLDoc: TXMLDocument;
begin
ParentObj := TComponent.Create(nil);
XMLDoc := TXMLDocument.Create(ParentObj);
XML2Tree(TreeView2, XMLDoc);
end;
(я для проверки сохранял из одного дерева, восстанавливал в другое... Из доп. информации сохраняется только строка Data, если у тебя есть еще что-то добавляй и в ProcessTreeItem, и в ProcessNode)...

Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 

Сообщений в этой теме
18192123   иерархическая структура объектов   4.12.2008 20:29
volvo   Какие именно трудности возникли? Какими компонента…   4.12.2008 21:30
18192123   Пока описала свой класс TBPeriod: unit UnitClasse…   5.12.2008 17:56
volvo   Правильно... AddObject принимает три параметра. Пе…   5.12.2008 20:02
18192123   FormMain.TreeViewNew.Items.AddObject(FormMain.Tre…   6.12.2008 1:09
18192123   Вопрос насчёт создания класса-потомка для моего кл…   5.12.2008 23:15
volvo   Для инициализации тех полей, которые есть у предка…   5.12.2008 23:38
volvo   надо вместо AddObject использовать AddChildObject …   6.12.2008 1:38
18192123   надо вместо AddObject использовать AddChildObject…   6.12.2008 2:12
18192123   Ещё один вопрос по классам... Есть класс TPeriod и…   6.12.2008 21:30
volvo   Неправда... У тебя в потомке И title, И feature, п…   6.12.2008 22:59
18192123   Неправда... У тебя в потомке И title, И feature, …   6.12.2008 23:47
18192123   Например, я добавила в TreeView объект с некоторым…   7.12.2008 1:06
volvo   Совсем забыл уточнить, что для работы с TTreeView …   7.12.2008 1:42
Гость   У меня возник вопрос по Drag&Drop.. Я хочу реа…   8.12.2008 6:10
18192123   У меня возник вопрос по Drag&Drop.. Я хочу ре…   8.12.2008 6:12
volvo   Для того, чтобы это работало, и для TreeView и для…   8.12.2008 6:30
Гость   Пусть я определила функцию, процедуру и свойство д…   8.12.2008 22:34
18192123   Ой..повторилась история с постом от "Гость…   8.12.2008 22:38
volvo   Кто ж мешает? TBPeriod(TreeViewNew.Selected.Data).…   8.12.2008 23:25
18192123   Снова вопрос по Drag&Drop..теперь в пределах T…   9.12.2008 1:39
volvo   nodeTmp := Items.AddChild(TargetNode, SourceNod…   9.12.2008 2:33
18192123   nodeTmp := Items.AddChild(TargetNode, SourceNo…   9.12.2008 3:57
volvo   Вот тут есть описание (правда по-английски): Expor…   9.12.2008 4:23
18192123   Вот тут есть описание (правда по-английски): Expo…   12.12.2008 3:32
Гость   А скажите пожалуйста, где будет лежать создаваемый…   9.12.2008 7:13
18192123   А скажите пожалуйста, где будет лежать создаваемы…   9.12.2008 7:14
volvo   Судя по строке XMLDoc.SaveToFile(ChangeFileExt(Par…   9.12.2008 7:23
volvo   Твои атрибуты... Смотри, сохранять дерево (вместе …   12.12.2008 4:32
Гость   Мне вот ещё что не понятно... Как быть при записи/…   12.12.2008 23:29
18192123   Мне вот ещё что не понятно... Как быть при записи…   12.12.2008 23:30
volvo   Сохранять в XML вместе с данными еще и некоторый и…   12.12.2008 23:50
18192123   Сохранять в XML вместе с данными еще и некоторый …   13.12.2008 1:04
volvo   Ты ж сказала, что у тебя почти у всех классов один…   13.12.2008 1:17
18192123   Ты ж сказала, что у тебя почти у всех классов оди…   13.12.2008 1:42
volvo   Ну, например, так: if tn.Data <> nil th…   13.12.2008 2:33
18192123   Вот такой вопрос возник.. Если я хочу создать очер…   17.12.2008 1:42
volvo   Где и как задается уровень НОВОГО узла? В предыдущ…   17.12.2008 1:54
18192123   Есть какие-то ограничения? ТОлько по смыслу)   17.12.2008 2:01
volvo   Ну, если дерево будет именно таким, как было сказа…   17.12.2008 2:18
18192123   Ну, если дерево будет именно таким, как было сказ…   17.12.2008 2:30
volvo   А, вот ты о чем... Ну, это просто: у каждого узла …   17.12.2008 3:18
18192123   Спасибо!!) Получилось, как и хотела!…   17.12.2008 4:52
volvo   procedure TFormMain.TreeViewNewDragDrop(Sender, So…   17.12.2008 5:42
18192123   Это имела в виду? Да, большое спасибо!! …   17.12.2008 6:05


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 3.05.2024 14:23
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name