Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.12.21;
Скачать: CL | DM;

Вниз

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

 
***mikle***   (2008-11-11 16:28) [0]

Здравствуйте!
Помогите пожалуйста понять почему такое происходит...
Создаю 2 класса: родительский-TMap (ссылку на рисунок формы и ссылку на дочерний объект) и дочерний-TCell (содрежит ссылку на родительский).
После этого пытаюсь изменить свойство рисунка - в этот момент сбивается указатель в дочернем объекте на родительский..
Вот сам код:


unit Unit1;

interface

uses
 Windows, SysUtils, Variants, Classes, Graphics, Controls, Forms, ExtCtrls;

type
  TForm1 = class(TForm)
   Image1: TImage;
   procedure FormCreate(Sender: TObject);
  private
   { Private declarations }
  public
   { Public declarations }
  end;
 
  PMap=^TMap;
 
  TCell=CLASS(TObject)
   map:PMap;
  end;
TMap=CLASS(TObject)
   image:TImage;
 cell:TCell;
  PROCEDURE CreateCell;
  PROCEDURE AttachImage(im:TImage);
  PROCEDURE ResizeImage;
END;

var
 Form1: TForm1;
 Map:TMap;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
Map:=TMap.Create;
  Map.AttachImage(Form1.Image1);
  Map.CreateCell;
  Map.ResizeImage;
end;

{ TMap }

procedure TMap.AttachImage(im: TImage);
begin
self.image:=im;
end;

procedure TMap.CreateCell;
begin
self.cell:=TCell.Create;
  self.cell.map:=@self;
end;

procedure TMap.ResizeImage;
begin
  self.image.Height:=100;   //ССЫЛКА СБИВАЕТСЯ ЗДЕСЬ
  self.image.Width:=100;
end;

end.


До выполнения указанного действи дебагер показывал это:
Map                 (image:$95365C; cell:$953BA0)
Map.cell            (map:$12FE14)
Map.cell.map^   (image:$95365C; cell:$953BA0)
self                  (image:$95365C; cell:$953BA0)
self.cell.map^    (image:$95365C; cell:$953BA0)
После него это:
Map                 (image:$95365C; cell:$953BA0)
Map.cell            (map:$12FE14)
Map.cell.map^   (image:$4438B00; cell:$FDEB6BE8)
self                  (image:$95365C; cell:$953BA0)
self.cell.map^    (image:$4438B00; cell:$FDEB6BE8)

После выполнения второго действия  значени Map.cell.map^  опять изменяется.

Сам просто бьюсь лбом об стену уже пол дня... подскажите пожалуйста!


 
Сергей М. ©   (2008-11-11 16:35) [1]

type
 TMap = class; //предобъявление класса TCell

 TCell=class
..
  map:TMap;
..
 end;

// в том же разделе type (!!) окончательное объявление ранее предобъявленного класса TMap

 TMap=class
..
  cell:TCell;
..
 end;


 
Amoeba ©   (2008-11-11 16:39) [2]

Для начала убери нафиг такое:

> PMap=^TMap;

и впредь больше не создавай указателей на указатель. Переменная или поле типа объектного типа уже и так является указателем.


 
Сергей М. ©   (2008-11-11 16:44) [3]

и self"ы убери везде - в данном контексте он 5-е колесо у телеги


 
***mikle***   (2008-11-11 16:53) [4]

Большое спасибо!
я просто не знал что с классами преобъявление другое... в пасе всю жись делал так...

PMap=^Map;
Map=object
end;


вот и получилось.. видимо не внимательно читал хелп :)
кста, ещё почему не посмотрел - привык что в обероне так же предопределяются процедуры (через ^). Кстати - там же (в Обероне) можно тип не предопределять, а сразу сделать рекурсивные указатели - компилятор это понимает, потому в дельфях немного не привычно))


 
Amoeba ©   (2008-11-11 16:57) [5]

Автору вопроса рекомендую:
http://www.delphikingdom.com/lyceum/



Страницы: 1 вся ветка

Текущий архив: 2008.12.21;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.02 c
2-1226327058
Andrey_ka
2008-11-10 17:24
2008.12.21
работа с памятью


2-1226567217
Tugodum
2008-11-13 12:06
2008.12.21
невидимая форма


15-1224082835
**Renegat**
2008-10-15 19:00
2008.12.21
Delfi сделать вирус


15-1224052782
AlekseyB
2008-10-15 10:39
2008.12.21
Вирус autorun.inf


15-1224811427
brother
2008-10-24 05:23
2008.12.21
Что происходит на форуме? (Желание по-быстрому)