Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> что-то происходит с экземплярами класса в списке, код вдруг перестал работать 
:(
    Опции темы
ragzovskii
Дата 19.12.2009, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 19.12.2009

Репутация: нет
Всего: нет



Доброго времени суток.

Код

procedure TController.GenerateTree(treeView: TTreeView);
var
  hasParent: Boolean;
  node: TResource;
begin
  nodeList:=TTreeNodes.Create(treeView);
  repeat
//здесь ищутся корни дерева (элементы, для которых флаг hasParent=false)
    if hasParent=False then
    begin
      node:=TResource(nodeList.Add(nil,IntToStr(parentList[current])));
      node.id:=parentList[current];
      repeat
        ExplodeNode(node);
        node:=TResource(node.getNextSibling);
      until node=nil;
    end;
    current:=current+1;
    hasParent:=False;
  until current>length(parentList)-1;
  NameTree;
end;

procedure TController.ExplodeNode(treeNode: TResource);
var
  I: Integer;
  tempList: Array of integer;
  tempNode: TResource;
begin
    SetLength(tempList,GetChildrenCount(StrToInt(treeNode.Text)));
    getChildren(StrToInt(treeNode.Text),tempList);
    for I := 0 to Length(tempList)-1 do
    begin
      tempNode:=TResource(nodeList.AddChild(treeNode,IntToStr(tempList[I])));
      ExplodeNode(tempNode);
    end;
end;

procedure TController.NameTree;
var
  node: TResource;
  I: Integer;
begin
  node:=TResource(nodeList.GetFirstNode);
  I:=0;
  repeat
    node.id:=StrToInt(node.text);
    node.Text:=nameList[node.id-1];
    node.name:=node.Text;
    node.position:=I;
    node:=TResource(node.GetNext);
    I:=I+1;
  until node=nil;

end;


процедура generateTree работает с некоторыми списками, в которых ищет корневые вершины дерева, и раскрывает их по порядку с помощью процедуры explodeNode.
ошибка возникает в методе NameTree. на втором проходе, node.Text='' и метод StrToInt отваливается. Если этот метод не вызывать, то дерево заполняется так, как надо, но в названиях вершин стоят ID (издержки метода generateTree). дебаггер показывает, что со списком nodeList творится черт знает что: если метод ExplodeNode вызывается более, чем 2 раза, то в списке NodeList значения полей уже созданных экземпляров содержат неправильные данные. Если вместо node:=TResource(node.GetNext) написать node:=TResource(node.GetNextSibling), то компилятор не может скомпилировать юнит, который к этим двум вообще никакого отношения не имеет.

что самое интересное: этот код работал корректно.
есть какие-нибудь идеи?
PM MAIL   Вверх
dvamaster
Дата 22.12.2009, 07:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 559
Регистрация: 30.6.2004
Где: Россия : Курган

Репутация: нет
Всего: 10



судя по всему TResource наследник TTreeNode

тогда собственные поля в TResource будут отсутствовать в памяти (не выделены), и будут писаться непонятно куда!
при добавлении создавай TResource и  используй AddNode


а если это совершенно иной класс то тем более работать не может!!!
в этом случае используй AddChildObject где аргумент Ptr есть объект TResource
Код

AddChildObject(parent, 'строка', Pointer(@res); // где res: TResource


доступ к TResource
Код

res := TResource(Node.Data); // где res: TResource


при уничтожении дерева не забудь деструктировать все TResource

Это сообщение отредактировал(а) dvamaster - 22.12.2009, 07:44


--------------------
Хорошую информацию трудно добыть. Сделать с ней что-нибудь - еще труднее. /L. Skywalker/

Что же я сделал не так? /Король Лир/

Я делаю это для твоего же блага! /Любой родитель и палач/

PKUNZIP.ZIP /неизвестный/
PM MAIL WWW ICQ   Вверх
ragzovskii
Дата 24.12.2009, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 19.12.2009

Репутация: нет
Всего: нет



Действительно! я совсем забыл, что использую не перегруженные методы. Спасибо smile
Правда я уже полностью переписал этот код, но на будущее пригодится.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0403 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.