Главная страница
    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-1209900866
REA
2008-05-04 15:34
2008.06.15
Ищем Grid


15-1210019900
Германн
2008-05-06 00:38
2008.06.15
Что такое JET 4.0


11-1181403581
Robt
2007-06-09 19:39
2008.06.15
ListView


2-1211216137
Константин
2008-05-19 20:55
2008.06.15
Обращение к параметру в SQL запрос по имени


15-1209596280
PEAKTOP
2008-05-01 02:58
2008.06.15
Delphi 7/Project/Options = AV. Может кто знает ?





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