Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1209669444
AlexDan
2008-05-01 23:17
2008.06.15
Какие есть вообще СУБД


4-1191494697
antoxa2005
2007-10-04 14:44
2008.06.15
Подскажите, а как считать то, что программа отправила на Com порт


2-1211546124
StiTch
2008-05-23 16:35
2008.06.15
Мемо


15-1209886588
Ega23
2008-05-04 11:36
2008.06.15
Вэкап-файлы (те которые с ~)


15-1206711198
Дмитрий С
2008-03-28 16:33
2008.06.15
vkontakte





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