Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.11.06;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.048 c
2-1129346563
antoxa2005
2005-10-15 07:22
2005.11.06
Подскажите, если кто знает. Как добавить записи в таблицуБД MySQL


5-1101036755
Ilg
2004-11-21 14:32
2005.11.06
Простейший Редактор свойств


2-1129204133
vok
2005-10-13 15:48
2005.11.06
Процедура открытия файла


2-1129321721
fmcoder
2005-10-15 00:28
2005.11.06
Сделать часы, прибавляющие секунды равномерно


2-1129151326
Megabyte
2005-10-13 01:08
2005.11.06
SQL-инструкция для создания нового usera





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский