![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с укаателем на 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]книжки бы, чтоли почитал, идентификатор объекта уже указатель, зачем тебе указать на указатель? это раз. два, зачем тебе указатели на стек? :)