Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема с укаателем на TImage ...


TUserClass ©   (2008-05-23 12:34:00) 

Всем добрая пятница...

Не наградите ли вы меня в столь чедесный день, уважаемые знатоки, ответом на вопрос?

Есть класс типа:

TCuteButton = class
   public
     X, Y, Height, Width : integer;
     constructor Create (Parent : TComponent; im_OnMouseEnter, im_OnMouseDown, im_Standby : TImage; Caption : string);
... (и т.д.)
   private
     MainImage : TImage;
     Text : TLabel;
     im_OnMouseEnter, im_OnMouseDown, im_Standby : ^TImage;
     procedure OnMouseEnter (Sender : TObject);
... (и т.д.)
 end;
Вот часть конструктора:

constructor TCuteButton.Create (Parent : TComponent; im_OnMouseEnter, im_OnMouseDown, im_Standby : TImage; Caption : string);
begin
 inherited Create;
 X := 0;
 Y := 0;

 Self.im_OnMouseEnter := @im_OnMouseEnter;
 Self.im_OnMouseDown := @im_OnMouseDown;
 Self.im_Standby := @im_Standby;

 MainImage := TImage.Create(Parent);
 MainImage.AutoSize := true;
 MainImage.Picture.Assign(Self.im_Standby^.Picture);

... (и т.д.)

 Text := TLabel.Create (Parent);
 Text.Caption := Caption;
 Text.OnMouseEnter := Self.OnMouseEnter;

... (и т.д.)
end;


И вот собственно проблема в этой функции которая вешается на Text.OnMouseEnter:

procedure TCuteButton.OnMouseEnter (Sender : TObject);
begin
 MainImage.Picture.Assign(Self.im_OnMouseEnter^.Picture);
end;


Т.е. при наведении мыши на Text, который TLabel, должна меняЦа картинка на MainImage, но вместо этого вылетает ексцептион с собщением:

"Access violation at address ..."

Почему указатель ведет себя так плохо ? Ведь в конструкторе вот это

 MainImage.Picture.Assign(Self.im_Standby^.Picture);

срабатывает.

:(  Помогите чем можете ...


TUserClass   (2008-05-23 13:01:00) [1]


> ЮЮ ©   (23.05.08 12:56) [13]
> ...
> Только TImage, ИМХО, многовато. Достаточно TBitmap.


Да согласен, просто кащунственное воровство памяти ... Но главное принцип работы - потом может поменяем на битмапы ...

Всем спасибо за участие ... :)


TUserClass   (2008-05-23 12:57:00) [2]


> Palladin ©   (23.05.08 12:54) [10]  


ААААААААААА ...... спасибо, ты меня реально спас ... :)


Palladin   (2008-05-23 12:56:00) [3]

а память под объекты распределяется ТОЛЬКО вызовом их конструктора и уж ни как не присваиванием какого-то значения идентификатору.


ЮЮ   (2008-05-23 12:56:00) [4]

> , то под эти 3 переменные (im_OnMouseEnter, im_OnMouseDown,
> im_Standby) не будет выделяЦа память равная кол-ву выделяемой
> памяти для объекта класса TImage ???


Будет. По 4 байта на каждую.
Только TImage, ИМХО, многовато. Достаточно TBitmap.


TUserClass   (2008-05-23 12:55:00) [5]


> ЮЮ ©   (23.05.08 12:53) [9]


Они (компоненты TImage) уже созданы - тупо лежат на форме с самого начала, с загруженными в них витмапами ... :)


Palladin   (2008-05-23 12:54:00) [6]


> то под эти 3 переменные (im_OnMouseEnter, im_OnMouseDown,
>  im_Standby) не будет выделяЦа память равная кол-ву выделяемой
> памяти для объекта класса TImage ???

НЕБУДЕТ, с какой стати она будет выделятся? ведь это УЖЕ указатели, ты всего лишь скопируешь одно и тоже 32битное значение, адрес в памяти, по которому РЕАЛЬНО, расположен только ОДИН объект.


ЮЮ   (2008-05-23 12:53:00) [7]

> три указателя на то, откуда брать то, что выводить на это
> самое «поле вывода» :)


А эти то — почемуто компоненты TImage, которые должны бвть созданы к моменту создания первого экземрляра TCuteButton.

поставь бряк в конструкторе TCuteButton и посмотри с какими параметрами он вызывается


TUserClass   (2008-05-23 12:52:00) [8]


> Palladin ©   (23.05.08 12:49) [7]

:) - просто экономия памяти


> Palladin ©   (23.05.08 12:48) [6]


т.е. если я напишу так в описании класса ...

im_OnMouseEnter, im_OnMouseDown, im_Standby : TImage;// без "^"

а в конструкторе напишу так ...

Self.im_OnMouseEnter := im_OnMouseEnter;
Self.im_OnMouseDown := im_OnMouseDown;
Self.im_Standby := im_Standby;


, то под эти 3 переменные (im_OnMouseEnter, im_OnMouseDown, im_Standby) не будет выделяЦа память равная кол-ву выделяемой памяти для объекта класса TImage ???


Palladin   (2008-05-23 12:49:00) [9]


>  вообще с указателями первый раз связался

а зачем тогда связался? кто тебя совратил на их использование?


Palladin   (2008-05-23 12:48:00) [10]

a:=b;


TUserClass   (2008-05-23 12:47:00) [11]


> Palladin ©   (23.05.08 12:46) [4]


мммммммм.....а мона поподробнее? ... вообще с указателями первый раз связался, поэтому туплю ... :)


Palladin   (2008-05-23 12:46:00) [12]


> TUserClass   (23.05.08 12:43) [3]

знаешь, блины тут нипричем, есть такая операция присвоения идентификаторам значений других идентификаторов


TUserClass   (2008-05-23 12:43:00) [13]

Блин...мне не надо создавать 3 объекта типа TImage, мне нужен один в качестве, так сказать, "поля вывода" и три указателя на то, откуда брать то, что выводить на это самое "поле вывода" :)


Palladin   (2008-05-23 12:40:00) [14]


> Ведь в конструкторе вот это
>
>  MainImage.Picture.Assign(Self.im_Standby^.Picture);
>
> срабатывает.

потому что в конструкторе указатель @im_Standby очень даже валидный, но после выполнения конструктора он абсолютно теряет смысл


Palladin   (2008-05-23 12:38:00) [15]

книжки бы, чтоли почитал, идентификатор объекта уже указатель, зачем тебе указать на указатель? это раз. два, зачем тебе указатели на стек? :)


Наверх

Титульная страница Поиск, карта сайта Написать письмо