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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Access violation, Обращему свойству существующего объек 
:(
    Опции темы
AS-Web
Дата 29.11.2005, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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




Код

TLink=class
  InNode,ToNode: TPNode;
  Cost: Integer;
  procedure Draw(canvas: TCanvas);
  Constructor Create;
  Destructor free;
 end;
...
TNode=class
 private
  MinPath: integer;
  Links: TList;
  Checked: boolean;
  Shape: tshape;
  FLabel: tlabel;
  Number: integer;
  Tag: integer;
  FOwner: TPGraph;
  down:boolean;
  fstart: tpoint;
  //Procedure ShapeMosedown: TShape.
 public
  Procedure SetRoot;
  Procedure ResetChecker ;
  procedure ShapeMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
  procedure ShapeMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
  procedure ShapeMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
  Constructor Create(Owner: TPgraph;x,y:integer);
  property owner: TPGraph read fowner write fowner;
  Destructor Free;
 end;
...
{tgRAPH.CONNECT}
 temp:=tlink.Create;
 temp.InNode:=what;
 temp.ToNode:=self.root;
 temp.Cost:=cost;
 self.root^.Links.Add(@temp); <-Здесь self.root inaccessible

Подскажите, пожалуйста, почему могло произойти исключение?
PM MAIL ICQ   Вверх
Демо
Дата 29.11.2005, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



А self - это что такое здесь?


--------------------
    
PM MAIL ICQ Skype   Вверх
CosmoMan
Дата 29.11.2005, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата
А self - это что такое здесь?

Это такой специальный указатель, который передается
методу объекта при его вызове.

Я не понял.
Кода мало.
tgRAPH.CONNECT - что за процедура.

Код описания класса tgRAPH
Links.Add(@temp) - что за метод?

Ты уверен, что под все память выделил?
PM MAIL   Вверх
Bose
Дата 30.11.2005, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1458
Регистрация: 5.3.2005
Где: Riga, Latvia

Репутация: 23
Всего: 51



а сам по себе Self здесь определён?

PM MAIL WWW Skype   Вверх
AS-Web
Дата 30.11.2005, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А что, Self во внутренней процедуре класса бывает не определён? TGraph.Connect - это процедура аоединения двух объектов класса Tnode.
В свойство Links каждого заносится ссылка на другой.

Другой вопрос - почему если у меня есть переменная main: TGraph, то её адрес и адрес SElf во внутренней процедуре не совпадают
PM MAIL ICQ   Вверх
Alexeis
Дата 30.11.2005, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата
self.root^.Links.Add(@temp);

надо self.root^.Links.Add(temp);


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
AS-Web
Дата 30.11.2005, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Так тоже не канает

Дело в том, что Self.root указывает не на ту переменную

Это сообщение отредактировал(а) AS-Web - 30.11.2005, 12:10
PM MAIL ICQ   Вверх
Alexeis
Дата 30.11.2005, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Нужно больше кода smile


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
AS-Web
Дата 30.11.2005, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Тебе что конкретно дать?
PM MAIL ICQ   Вверх
Alexeis
Дата 30.11.2005, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Процедуру целиком с
Цитата

{tgRAPH.CONNECT}
temp:=tlink.Create;
temp.InNode:=what;
temp.ToNode:=self.root;
temp.Cost:=cost;
self.root^.Links.Add(@temp); <-Здесь self.root inaccessible



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
AS-Web
Дата 30.11.2005, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

procedure Tgraph.Connect(what: tpnode; Cost: integer);
var temp:TLink;
begin
 if what <>nil then
 begin
 temp:=tlink.Create;
 temp.InNode:=what;
 temp.ToNode:=self.root;
 temp.Cost:=cost;
 main.root^.Links.Add(@temp);
 what^.Links.Add(@temp);
 if not what^.I_O then //если в списке соединённых узлов
 begin
  fNotInGraph.Extract(what);
  FIngraph[what^.Number-1]:=@what;
 end;
 temp.Draw(main.root^.owner^.fcanvas);
 end;
end;

2 CosmoMam:
Код

function Tgraph.Add(x, y: integer): TPnode;
var curr:Tnode; temp: tpoint;
begin
 temp.x:=x;
 temp.y:=y;
 curr:=tnode.Create(@MAIN,twincontrol(owner).screentoclient(temp).x,twincontrol(owner).screentoclient(temp).y);
 FNotInGraph.Add(@curr);
 FIngraph.Add(nil);
 result:=@curr;
end;

procedure Tgraph.Connect(what: tpnode; Cost: integer);
var temp:TLink;
begin
 if what <>nil then
 begin
 temp:=tlink.Create;
 temp.InNode:=what;
 temp.ToNode:=self.root;
 temp.Cost:=cost;
 main.root^.Links.Add(@temp);
 what^.Links.Add(@temp);
 if not what^.I_O then
 begin
  fNotInGraph.Extract(what);
  FIngraph[what^.Number-1]:=@what;
 end;
 temp.Draw(main.root^.owner^.fcanvas);
 end;
end;

constructor Tgraph.Create(Owner: tcomponent;Canvas:Tcanvas);
begin
 root:=nil;
 fnumitems:=0;
 fFilename:='';
 self.owner:=owner;
 fcanvas:=Canvas;
 FNotInGraph:=tlist.Create;
 FInGraph:=tlist.Create;
end;

procedure Tgraph.DrawGraph;
var i,j: integer;
begin
 for i:=1 to FInGraph.Count-1 do
  for j:=1 to TPnode(FIngraph.Items[i])^.Links.Count-1 do
  begin
   TPLink(TPNode(FIngraph.Items[i])^.Links[j])^.Draw(canvas);
  end;
  for i:=1 to FNotInGraph.Count-1 do
  for j:=1 to TPnode(FNotInGraph.Items[i])^.Links.Count-1 do
  begin
   TPLink(TPNode(FNotInGraph.Items[i])^.Links[j])^.Draw(canvas);
  end;
end;

function TGraph.Extract: TPNode;
begin
 if self.Selected<>nil then
 begin;
  if self.selected^.I_O then
   self.FInGraph.Extract(self.selected)
  else
   self.FNotInGraph.Extract(self.selected);
   self.Selected^.Free;
   self.selected:=root;
 end;
end;

destructor TGraph.Free;
var i: integer;
begin
 for i:=1 to fingraph.Count-1 do
  if fingraph[i]<>nil then
   TPNOde(fingraph[i])^.Free;
 fingraph.Free;
 for i:=1 to fnotingraph.Count-1 do
  if fnotingraph[i]<>nil then
   TPNOde(fnotingraph[i])^.Free;
 FNotInGraph.Free;
end;

procedure Tgraph.LoadFromFile(s: string);
var f: file of byte;  curr: tnode;curr2: Tlink; i,j: integer;
begin
 assignfile(f,s);
 reset(f);
 read(f,fnumitems);
 {for i:=1 to fnumitems do
 begin
  curr:=tnode.Create;
  read(f,curr);
  for j:=1 to curr^.Links.Count do
  begin
   read(f,curr2);
   curr2
  end;
 end;   }
end;

procedure TGraph.ResetChecker;
var i: integer;
begin
if root <> nil then
 root.ResetChecker;
end;

procedure Tgraph.SaveToFile(s: string);
var f: file of TNode;   i: integer;
begin
 assignfile(f,s+'.dat');
 rewrite(f);
 for i:=0 to self.NumItems-1 do
  begin
   if self.FInGraph[i]
   write(f,self[]);
  end;
end; 


Тут не всё робит. Но всё-таки главный вопрос: почему self и переменная имеют разный адрес?
PM MAIL ICQ   Вверх
CosmoMan
Дата 30.11.2005, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Что такое main.root, было же self.root?
Можеш дать описание класса Tgraph с его переменными.
Может переделать все немного попроще, чтобы более ясно ошибку увидеть.
PM MAIL   Вверх
AS-Web
Дата 1.12.2005, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



main.root - это как в программе объект обозначен.root: TPnode;
PM MAIL ICQ   Вверх
Alexeis
Дата 1.12.2005, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



CosmoMan правельно требует - без класса Tgraph не разобраться.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
CosmoMan
Дата 1.12.2005, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Main это то же самое, что и self?

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.0818 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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