Главная страница
    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.039 c
6-1121686897
SergeyDon
2005-07-18 15:41
2005.11.06
как лучше организовать ожидание в потоке?


6-1122268035
joisy
2005-07-25 09:07
2005.11.06
Контроль и Сохранение Веб Страниц


1-1129631371
BorlandC
2005-10-18 14:29
2005.11.06
Как проверить что файл уже открыт?


3-1127744907
Malamba
2005-09-26 18:28
2005.11.06
запрос с параметрами вымахивается


1-1129528210
Карелин Артем
2005-10-17 09:50
2005.11.06
Как сохранить/считать свойства потомка TObject в строку?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский