Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1226172216
DOjD
2008-11-08 22:23
2008.12.21
DbGrid и полоса прокрутки!


15-1224495616
DillerXX
2008-10-20 13:40
2008.12.21
Поговорим о синих человечках?


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


2-1225841336
Семен Кевларвестов
2008-11-05 02:28
2008.12.21
Не срабатывает кейсоинсенситивность в tDataSet.Locate


15-1224668736
DonVik
2008-10-22 13:45
2008.12.21
Сеть и ее проблемы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский