Форум: "Основная";
Текущий архив: 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.036 c