Форум: "Начинающим";
Текущий архив: 2008.12.21;
Скачать: [xml.tar.bz2];
Внизсбивается указатель Найти похожие ветки
← →
***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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.049 c