Форум: "Начинающим";
Текущий архив: 2008.06.15;
Скачать: [xml.tar.bz2];
ВнизПроблема с укаателем на 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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.006 c