Модераторы: 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   Вверх
AS-Web
Дата 1.12.2005, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Я и сам бы хотел это понять! Self - это ссылка на самого себя в коде класса, а main - это объект, объявленный в программе в её общей части.

Даю код Графа:
Код

 TGraph=class
 private
  fRoot: TPnode;
  FSelected: TPNode;
  FNumItems: byte;
  Ffilename: string;
  FCanvas: Tcanvas;
  Fowner:Tcomponent;
  FNotInGraph:tlist;
  FInGraph: tlist;
 public
  Procedure LoadFromFile(s: string);
  Procedure SaveToFile(s: string);
  Function Add(x,y: integer): TPnode;
  Function Extract: TPNode;
  Procedure Connect(what: tpnode;Cost:integer);
  Procedure DrawGraph;
  Procedure ResetChecker;
  Property NumItems: byte read FNumItems write  FNumItems;
  Property Canvas: TCanvas read Fcanvas write  Fcanvas;
  Property Owner: tcomponent read fowner write  fowner;
  Property Root: TPNode read fRoot write  FRoot;
  Property Selected: TPNode read fSelected write  FSelected;
  Constructor Create(Owner:Tcomponent;Canvas:Tcanvas);
  Destructor Free;
 end;


Это сообщение отредактировал(а) AS-Web - 1.12.2005, 19:06
PM MAIL ICQ   Вверх
CosmoMan
Дата 1.12.2005, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ооох...
Разбирался я, разбирался.
Мне так кажется, что это какойто компонент по работе с графикой.
Причем он частично закомпиляный. И тот код, который ты говориш - это код компонента. smile
Я не знаю, что там за код, но он все равно неполный. Я коечто попытался угадать.
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, unit2, ExtCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Shape1: TShape;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

 TPNode = ^Links;

 TGraph = class
 private
  fRoot: TPNode;
  FSelected: TPNode;
  FNumItems: byte;
  Ffilename: string;
  FCanvas: Tcanvas;
  Fowner:Tcomponent;
  FNotInGraph:tlist;
  FInGraph: tlist;
 public
  Procedure LoadFromFile(s: string);
  Procedure SaveToFile(s: string);
  Function Add(x,y: integer): TPnode;
  Function Extract: TPNode;
  Procedure Connect(what: tpnode;Cost:integer);
  Procedure DrawGraph;
  Procedure ResetChecker;
  Property NumItems: byte read FNumItems write  FNumItems;
  Property Canvas: TCanvas read Fcanvas write  Fcanvas;
  Property Owner: tcomponent read fowner write  fowner;
  Property Root: TPNode read fRoot write  FRoot;
  Property Selected: TPNode read fSelected write  FSelected;
  Constructor Create(Owner:Tcomponent;Canvas:Tcanvas);
  Destructor Free;
 end;
  Links = class(TGraph); 

 TPGraph = class(TGraph);

 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;

 TLink=class
  InNode,ToNode: TPNode;
  Cost: Integer;
  procedure Draw(canvas: TCanvas);
  Constructor Create;
  Destructor free;
 end;


var
  Form1: TForm1;

implementation

{$R *.dfm}

function Tgraph.Add(x, y: integer): TPnode;
var curr:Tnode; temp: tpoint;
begin
 temp.x:=x;    
 temp.y:=y;
 curr:=tnode.Create(@self,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;
 //self.root^.
 self.root^.Links.Add(@temp);       //<-Caanu self.root inaccessible
 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;

end.



Того, что ты дал недостаточно.
PM MAIL   Вверх
Alexeis
Дата 2.12.2005, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



TPNode = ^Links; - излишне так как TLink=class и переменная объекта этого класса и есть указатель на объект фактически TPNode указывает на адрес по которому хранится указатель который в свою очередь указывает на объект типа TLink. Здесь и зарыта собака так что надо переделать код по нормальному.

Это сообщение отредактировал(а) alexeis1 - 2.12.2005, 11:33


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

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

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


Шустрый
*


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

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



Да ты мне код полностию дать можеш!? Я же не экстрасенс.
На мыло мне вышли в конце концов, если это такой секрет.
PM MAIL   Вверх
AS-Web
Дата 5.12.2005, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



alexeis1 Спасибо. Я сам дня три назад тоже smile дошёл.
PM MAIL ICQ   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1299 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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