Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.06.2013, 21:18   #1
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию Списки записей

После долгого времяпровождения за монитором никак не найду ответ на простой вопрос:
Имеется список (в смысле TList<запись>) элементами которого являются записи с простыми типами (строки и числа). Чтение данных проглатывает без проблем, однако внесение данных вызывает ошибку.
Например:
Код:
Nodes[count].Id:=NewId();
Здесь Id обычный Интеджер.
Ошибка:
Цитата:
[dcc32 Error] TreeS.pas(461): E2064 Left side cannot be assigned to
Это при том, что ошибка возникает на этапе компиляции, то есть всякие там ошибки инициализации отметаются сходу.
Причем двумя строками ниже код:
Код:
result:=Nodes[count].Id;
проблем не вызывает.
Итак, какие есть предположения?
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 19.06.2013, 21:55   #2
ReportCube
Форумчанин
 
Аватар для ReportCube
 
Регистрация: 11.03.2011
Сообщений: 426
По умолчанию

Нсколько помню, у TTreeNodes свойство ID только для чтения
ReportCube вне форума Ответить с цитированием
Старый 19.06.2013, 22:19   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Не совсем понял, но похоже на проблему записи в элементы Record-свойства.

Так не прокатит (mm - TPoint):
Код:
MyComponent.mm.X:=0;
А так пожалуйста (если не Get-метод для чтения)
Код:
with MyComponent.mm do X:=0;
или (так всегда Ok)
Код:
mm1:=MyComponent.mm;
mm1.X:=0;
MyComponent.mm:=mm1;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 19.06.2013 в 22:25.
Аватар вне форума Ответить с цитированием
Старый 19.06.2013, 22:22   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Так ошибка четко говорит, что запись в
Код:
Nodes[count].Id
невозможна.

А невозможна обычно по 2 причинам:
1. Nodes[count] - это константа, что врятли
2. Свойство id - не имеет write действия, т.е. не так:
Код:
property id:Integer read fId write fId;
а так:
Код:
property id:Integer read fId;
Можете показать объявление типа "запись"?
Человек_Борща вне форума Ответить с цитированием
Старый 19.06.2013, 23:38   #5
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Можете показать объявление типа "запись"?
Код:
// Описание узла
type
    TTreeSNode=record

            Name:     String;                 // Имя данного узла
            Id:       Integer;                // Уникальный идентификатор узла
            Childs:   TList<Integer>;         // Список идентификаторов дочерних узлов
            Value:    String;                 // Текстовое значение узла
    end;
Код:
Nodes:      TList<TTreeSNode>;      // Список всех узлов
Цитата:
Нсколько помню, у TTreeNodes свойство ID только для чтения
Это мои ноды, и там будет так как я хочу, а не только для чтения.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 20.06.2013, 00:00   #6
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
// Описание узла
Попробуйте так:
Цитата:
type
TTreeSNode=record
private
fId:Integer;
public
Name:String;
class property Id:Integer read fId write fId;
Childs: TList<Integer>;
Value: String;
end;
В плане кода могу посоветовать следующее:
Код:
Nodes[count].Id:=NewId();
Похоже вы новую ветвь строите и присваиваете ей идентификатор и имя, так не лучше ли это в конструкторе делать?
Код:
type
    TTreeSNode=record
     private
       fName:string;
       fId:Integer;
     public
        Name:String;
        class property Id:Integer read fId;
        Childs:   TList<Integer>;
        Value:    String;
        class constructor Create(aName:string= ''; const aId:Integer = -1);
    end;
...
 
class constructor TTreeSNode.Create(aName:string= ''; const aId:Integer = -1);
begin
 if aId = -1 then
 fId:=NewId else
 fId := aId;
 fName:=aName;
end;
так удобнее(ну во всяком случае для меня). Часто практикую идентификацию объектов в списках по их id.
Авось и вам поможет =)

Код:
            Childs:   TList<Integer>;         // Список идентификаторов дочерних узлов
Может правильнее использовать список указателей на ^TTreesNode?

P.S. Можно ещё в исходниках VirtualTrees покопаться.

Последний раз редактировалось Человек_Борща; 20.06.2013 в 00:05.
Человек_Борща вне форума Ответить с цитированием
Старый 20.06.2013, 00:16   #7
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию

Собственно хранить нужно указатели на записи, ибо запись это не reference тип, а value. А список хранит всего лишь ссылку на объект, но не сам объект.
Подробнее можно почитать вот по этим ссылкам - 1, 2.
Будь проще и люди к тебе потянутся

Последний раз редактировалось spamer; 20.06.2013 в 00:18.
spamer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создать массив записей в соответствии с заданной структурой. Количество записей не больше 10. zulja Паскаль, Turbo Pascal, PascalABC.NET 0 21.05.2012 07:50
Обработка записей cppcod Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 27.12.2011 15:40
обработкой записей mrRenTgeN Помощь студентам 0 01.11.2011 16:01
Перенос записей groovy Microsoft Office Access 36 01.06.2011 07:50