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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не удается получить кол-во записей в TList 
:(
    Опции темы
gesper
  Дата 20.12.2013, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


"Shарфик"
*


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

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



Создается два класса, второй(TEntityList) живет внутри первого(TObject). Класс созданный на основе базового класса при создании себя создает второй класс и помещает в него указатель на класс списка. Т.е. Документ, хранит свои объекты и в списке объектов дублируется указатель, на список уже выбранных объектов.  
Код

  inherited Create;
  List:=TEntityList.Create;
  FSelectList:=TList.Create;
  List.SelectedList:=FSelectList;
 ...


Проблема в том, что голова не варит уже. Делал так, присваивал переменным указатель на место памяти где смотреть нужные данные и все работало всегда, а тут хоть тресни.. они при присвоении "List.SelectedList:=FSelectList;" как будто клонируются. Т.е. если запрошу кол-во эл-тов списка, то условие List.SelectedList.Count=FSelectList.Count не будет выполняться. И в private и protected пробовал держать переменные, один хрен. Что я пропустил? 
--------------------
...И приколется обломившийся и oбломится приколовшийся...
PM MAIL   Вверх
Poseidon
Дата 21.12.2013, 01:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

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



Цитата(gesper @  20.12.2013,  22:06 Найти цитируемый пост)
Т.е. если запрошу кол-во эл-тов списка, то условие List.SelectedList.Count=FSelectList.Count не будет выполняться.

Есть подозрения что TEntityList.SelectedList.Count перекрыт. Покажи хотя бы описание TEntityList

Это сообщение отредактировал(а) Poseidon - 21.12.2013, 01:01


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
gesper
Дата 21.12.2013, 01:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


"Shарфик"
*


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

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



Цитата(Poseidon @ 21.12.2013,  01:00)
Цитата(gesper @  20.12.2013,  22:06 Найти цитируемый пост)
Т.е. если запрошу кол-во эл-тов списка, то условие List.SelectedList.Count=FSelectList.Count не будет выполняться.

Есть подозрения что TEntityList.SelectedList.Count перекрыт. Покажи хотя бы описание TEntityList

Да мне не жалко и все скинуть, просто куда. 

Код

   TEntityList      = class(TList)
   private
        FID                 : Integer;
        FListSelectedEntity : TList;
        FEntityMinMaxPoint: TMinMaxPoint;
        function GetCount: Integer;
        function GetItem(Index: Integer): TEntity;
        procedure SetItem(Index: Integer; const Value: TEntity);
        procedure SetMinMaxPoint(ParentID: Integer; const X, Y, Z: Extended);  overload;
        procedure SetMinMaxPoint(const APoint:TFloatPoint;var Data:TMinMaxPoint);  overload;

   protected
        
   public
       constructor Create; virtual;
       destructor Destroy; override;

       procedure Add(AEntity: TEntity); overload;
       function  Add(ParentID:Integer): TEntity; overload;
       procedure Insert(Index: Integer; AEntity: TEntity);
       procedure Delete(Index: Integer);
       procedure Repaint(LogicalDrawing: TLogicalDraw);
       procedure RepaintVertex(LogicalDrawing: TLogicalDraw);
       procedure DeselectAll;

       procedure SetSelectedList(var AList:TList);
       procedure ResetMinMaxPoint; overload;
       function  GetMinMaxPoint:TMinMaxPoint; overload;

       property  ID: Integer read FID write FID;
       property  SelectedEntity: TList read FListSelectedEntity write FListSelectedEntity; // Напрямую пишет/читает

       property  Count: Integer read GetCount;
       property  Items[Index: Integer]: TEntity read GetItem write SetItem;
   end;

--------------------
...И приколется обломившийся и oбломится приколовшийся...
PM MAIL   Вверх
Poseidon
Дата 21.12.2013, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

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



Ну все правильно. У TList свой Count, у TEntityList свой. Ты уверен что они подсчитывают по одинаковому алгоритму? Покажи реализацию TEntityList.GetCount


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
gesper
Дата 21.12.2013, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


"Shарфик"
*


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

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



Цитата(Poseidon @ 21.12.2013,  09:54)
Ну все правильно. У TList свой Count, у TEntityList свой. Ты уверен что они подсчитывают по одинаковому алгоритму? Покажи реализацию TEntityList.GetCount

Давай заново. Тут речь не о TEntityList.GetCount 

Код

 TEntityList      = class(TList)
   private
        FListSelectedEntity : TList;
   protected

   public
       property  SelectedEntity: TList read FListSelectedEntity write FListSelectedEntity;
   end;

TActiveDocument= class
  private

  protected
    FSelectList     :TList;
  public
    property  SelectList :TList read FSelectList write FSelectList;
  end;




Код

constructor TActiveDocument.Create(AOwner: TComponent);
  inherited Create;
  List:=TEntityList.Create; //создаем набор объектов ListA
  FSelectList:=TList.Create; // создаем список выбранных объектов ListB
  List.SelectedEntity:=FSelectList; // в переменную в списке объектов ListA пишем адрес списка выбранных ListB


Код

constructor TEntityList.Create;
begin
  inherited Create;
  ResetMinMaxPoint;
end;


Код

         ...
         DevString:=DevString+'  SelectList.Count:'+inttostr(ActiveDocument.FSelectList.Count); //Тут число изменяется
         DevString:=DevString+'  SelectedEntity.Count:'+inttostr(ActiveDocument.List.SelectedEntity.Count); //тут всегда 0
        .....TextOut(0,0,DevString);


создания ActiveDocument.List.SelectedEntity нету негде, она назгачается как ярлык только, а работает как будто другой список :(

Это сообщение отредактировал(а) gesper - 21.12.2013, 20:57
--------------------
...И приколется обломившийся и oбломится приколовшийся...
PM MAIL   Вверх
БелАмор
Дата 21.12.2013, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(gesper @  21.12.2013,  21:52 Найти цитируемый пост)
constructor TActiveDocument.Create(AOwner: TComponent);
  inherited Create;
  List:=TEntityList.Create; //создаем набор объектов ListA
  FSelectList:=TList.Create; // создаем список выбранных объектов ListB
  List.SelectedEntity:=FSelectList; // в переменную в списке объектов ListA пишем адрес списка выбранных ListB


Вы нарушаете важнейший принцип:
"Одно и то-же значение должно храниться в единственном экземпляре".

Вы создаёте объект типа TList и указатель на него храните в двух разных местах:
FSelectList
List.SelectedEntity

Первоначально (после вызова конструктора) там хранятся одинаковые указатели, ссылающиеся на тот самый TList.
Однако, у вас предусмотрено свойство SelectList, которое меняет указатель только в FSelectList:

Цитата(gesper @  21.12.2013,  21:52 Найти цитируемый пост)

  protected
    FSelectList     :TList;
  public
    property  SelectList :TList read FSelectList write FSelectList;
  end;


Если вы где-то присвоите SelectList ссылку на другой список, то произойдёт рассинхронизация, поскольку
List.SelectedEntity будет ссылаться на старый список, тогда как FSelectList - на новый.

P.S. Кстати, вы не привели объявление List, хотя и понятно, что это TEntityList.

PM   Вверх
gesper
Дата 21.12.2013, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


"Shарфик"
*


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

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



Цитата(БелАмор @ 21.12.2013,  22:19)
Вы нарушаете важнейший принцип:
"Одно и то-же значение должно храниться в единственном экземпляре".

Вы создаёте объект типа TList и указатель на него храните в двух разных местах:
FSelectList
List.SelectedEntity

Первоначально (после вызова конструктора) там хранятся одинаковые указатели, ссылающиеся на тот самый TList.
Однако, у вас предусмотрено свойство SelectList, которое меняет указатель только в FSelectList:

Цитата(gesper @  21.12.2013,  21:52 Найти цитируемый пост)

...


Если вы где-то присвоите SelectList ссылку на другой список, то произойдёт рассинхронизация, поскольку
List.SelectedEntity будет ссылаться на старый список, тогда как FSelectList - на новый.

БелАмор,  спасибо. Мне и нужно было, реализовать доступ к одному списку с двух мест. Пролема в том, что уперся мировозрением в точку отсчета от процедуры создания документа, а в первоночальном варианте программы, список выборки создавался в управляющем классе. Действительно переписывалась ссылка, но только не в той переменной на которую грешил.
--------------------
...И приколется обломившийся и oбломится приколовшийся...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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