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

Вниз

Проблема с укаателем на TImage ...   Найти похожие ветки 

 
TUserClass   (2008-05-23 12:34) [0]

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

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

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

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);

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

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


 
Palladin ©   (2008-05-23 12:38) [1]

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


 
Palladin ©   (2008-05-23 12:40) [2]


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

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


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

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


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


> TUserClass   (23.05.08 12:43) [3]

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


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


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


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


 
Palladin ©   (2008-05-23 12:48) [6]

a:=b;


 
Palladin ©   (2008-05-23 12:49) [7]


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

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


 
TUserClass   (2008-05-23 12:52) [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 ???


 
ЮЮ ©   (2008-05-23 12:53) [9]

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


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

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


 
Palladin ©   (2008-05-23 12:54) [10]


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

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


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


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


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


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

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


 
ЮЮ ©   (2008-05-23 12:56) [13]

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


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


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


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


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


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


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


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

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



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

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

Наверх




Память: 0.5 MB
Время: 0.017 c
2-1211275674
fenixgold
2008-05-20 13:27
2008.06.15
Как правильно создать динамически ComboBox и удалить


15-1210050602
TUser
2008-05-06 09:10
2008.06.15
Новая память


2-1211473325
StiTch
2008-05-22 20:22
2008.06.15
Помогите с пунктами


2-1211463437
StiTch
2008-05-22 17:37
2008.06.15
ComboBox


11-1190057676
Егор_Г
2007-09-17 23:34
2008.06.15
Установка MCK на Lazarus+FPC 2.2.0