Главная страница
    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.063 c
2-1226300937
cyborg
2008-11-10 10:08
2008.12.21
Что за ошибка "Отказано в доступе"?


2-1226415188
Maksim
2008-11-11 17:53
2008.12.21
Изменение размера шрифта в поле Memo


1-1204636982
misha_gr
2008-03-04 16:23
2008.12.21
Синхронизировать скроллинг двух TRichEdit


15-1224067825
Аскар
2008-10-15 14:50
2008.12.21
Какие есть разновидности у C++?


2-1226407448
Новичок00
2008-11-11 15:44
2008.12.21
Документация по Jedi VCL





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский