Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.06;
Скачать: CL | DM;

Вниз

Не получается создать список объектов   Найти похожие ветки 

 
stef   (2005-10-13 03:41) [0]

Помогите!!!
Посмотрите на эту объектную модель. Обратите внимание на список объектов PSegmentsSetRL


 //класс сегмент коммуникации
 TSegmentCommunicate = class(TObject)
   DateCreate  :     TDate;//Дата заложения
   TimeUse     :     word;//Срок возможной эксплуатации в годах
 end;

//класс сегмент коммуникации дорога
 TSegmentCommunicateRL = class(TSegmentCommunicate)
   Type_RL     :     integer;
   Width       :     word;//ширина дороги
 end;

//множество сегментов коммуникаций дорога
 PSegmentsSetRL = ^TSegmentRL;
 TSegmentRL = record
   SegmentCommunicateRL:TSegmentCommunicateRL;
   Prev        :PSegmentsSetRL;
   Next        :PSegmentsSetRL;
 end;
 TSegmentsSetRL = class(TObject)
   SegmentsSetRL:PSegmentsSetRL;
   HandleNow:PSegmentsSetRL;//указатель на текущий сегмент коммуникаций
   //в списке сегментов дорога
   function TakeNewSegmentRL:PSegmentsSetRL;//возвращает указатель на
   //новый созданный в списке сегмент коммуникаций дорога
 end;

   //класс Система коммуникаций
 TSystemCommunicate = class(TObject)
   SegmentSetRL:TSegmentsSetRL;
 end;

var
 Map:TSystemCommunicate;

implementation

{$R *.dfm}

function TSegmentsSetRL.TakeNewSegmentRL:PSegmentsSetRL;
begin
 new(map.SegmentSetRL.SegmentsSetRL);//tmp
 if Map.SegmentSetRL.HandleNow=nil
 then
   begin
     Map.SegmentSetRL.HandleNow:=map.SegmentSetRL.SegmentsSetRL;
     Map.SegmentSetRL.HandleNow.Prev:=Map.SegmentSetRL.HandleNow;
     Map.SegmentSetRL.HandleNow.Next:=Map.SegmentSetRL.HandleNow;
   end
 else
   begin
     Map.SegmentSetRL.SegmentsSetRL.Next:=Map.SegmentSetRL.HandleNow.Next;
     Map.SegmentSetRL.SegmentsSetRL.Prev:=Map.SegmentSetRL.HandleNow;
     Map.SegmentSetRL.HandleNow.Next.Prev:=Map.SegmentSetRL.SegmentsSetRL;
     Map.SegmentSetRL.HandleNow.Next:=Map.SegmentSetRL.SegmentsSetRL;
     Map.SegmentSetRL.HandleNow:=Map.SegmentSetRL.SegmentsSetRL;
   end;
 result:=Map.SegmentSetRL.HandleNow;
end;

end.


Заполнение списка объектов происходит при помощи вызова функции TakeNewSegmentRL сл. образом

       map.SegmentSetRL.TakeNewSegmentRL;
       map.SegmentSetRL.HandleNow.SegmentCommunicateRL.Width:=WidthCalc(FrstX,FrstY,X,Y);

...
{функция WidthCalc работает точно, она просто считает расстояние м/у двумя точками}

Так вот.

при попытке просмотреть список вот таким образом:


procedure TForm1.Button2Click(Sender: TObject);
begin
 form1.Edit2.Text:=inttostr(map.SegmentSetRL.HandleNow.SegmentCommunicateRL.Width);
 map.SegmentSetRL.HandleNow:=map.SegmentSetRL.HandleNow.Next;
end;


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

результат, который должен быть:
50,100,150,200.

Вместо этого появляется:
100,100,150,100,
или
50,150,150,150.

Мучаюсь уже 4 дня и ночи. Помогите, что я делаю не так?


 
ЮЮ ©   (2005-10-13 05:50) [1]


Заполнение списка объектов происходит при помощи вызова функции TakeNewSegmentRL сл. образом

      map.SegmentSetRL.TakeNewSegmentRL;
      map.SegmentSetRL.HandleNow.SegmentCommunicateRL.Width:=WidthCalc(FrstX,FrstY,X,Y);


И это работает? Ведь в TakeNewSegmentRL не создается никакой объект класс TSegmentCommunicateRL, у которого ты тем не менне пытаешься установть св-во Width. Неужели все это работает без AV?

P.S. Нв кой вообще городить этот двусвязный список, если существуют T[Object]List ?

PSegmentsSetRL = ^TSegmentRL это уже лишнее, ибо переменная типа TSegmentRL это уже и есть указатель на объест типа TSegmentRL, который неплохо бы и создать


 
stef   (2005-10-13 16:28) [2]

Во-первых: что такое AV?
2) Надо сказать, что работает до того момента как происходит вывод на экран. Т.е. если посмотреть отладчиком значения Width сразу после занесения их в список, то и адреса всех указателей списка совпадают и сами значения Width. Но сразу когда начинается работа с перемещением по списку начинаются глюки.
3)PSegmentsSetRL = ^TSegmentRL это уже лишнее, ибо переменная типа TSegmentRL это уже и есть указатель на объест типа TSegmentRL, который неплохо бы и создать
А это действительно так ... спасибо.
4) Никогда, если честно не работал с TList, всегда вручную списки писал, но чувствую пришло время попробовать. Думаю он достаточно гибкий и не ест много памяти(в данном случае это очень важно).
5) Огромное спасибо, ато я уже отчаился. Вы подарили мне надежду.


 
Amoeba ©   (2005-10-13 16:59) [3]


> PSegmentsSetRL = ^TSegmentRL это уже лишнее, ибо переменная
> типа TSegmentRL это уже и есть указатель на объест типа
> TSegmentRL, который неплохо бы и создать

TSegmentRL это не обект, а всего лишь запись:

PSegmentsSetRL = ^TSegmentRL;
TSegmentRL = record
  SegmentCommunicateRL:TSegmentCommunicateRL;
  Prev        :PSegmentsSetRL;
  Next        :PSegmentsSetRL;
end;


 
ЮЮ ©   (2005-10-14 03:37) [4]

>Amoeba ©   (13.10.05 16:59) [3]

Точно.
Но в такой каше немудрено звпутаться :)


 
Amoeba ©   (2005-10-14 11:10) [5]


> ЮЮ ©   (14.10.05 03:37) [4]

Это точно! Автор вопроса уже тем, что по идентификатору невозможно отличить объект от простой записи, сам себе подкладывает грабли. Вобщем не код, а глюкодром какой-то получился.



Страницы: 1 вся ветка

Текущий архив: 2005.11.06;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.029 c
2-1129215799
Fast2
2005-10-13 19:03
2005.11.06
Почему при выполнении пишет Transaction is active ?


4-1125834545
Valera
2005-09-04 15:49
2005.11.06
CDROM для мультимедия


2-1129400637
_root
2005-10-15 22:23
2005.11.06
Exit для другой части


1-1129193445
melbis
2005-10-13 12:50
2005.11.06
Оптимальное использование TreeView


4-1125764005
viv-x
2005-09-03 20:13
2005.11.06
Работа с TAPI на Delphi под Win 98 и Win XP