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

Вниз

Ошибка в коде, который раньше работал.   Найти похожие ветки 

 
RWolf ©   (2009-11-05 10:58) [40]

в Дельфи Bitmap:TBitmap — на самом деле указатель на объект.
Строкой DM1.ImageList1.GetBitmap(32, Bitmap1); ты присваиваешь ему адрес реально существующего объекта, который хранится в ImageList1. Кроме того, этим же объектом пользуется процедура ListBox1DrawItem. Кода ты выполняешь Bitmap.Free, объект уничтожается, и при обращеннии по его адресу из другого места программы имеем глюк.


 
kyn66 ©   (2009-11-05 10:59) [41]


> Обе переменные содержат значение, являющее собой указатель
> на один и тот же объект.


Ну я как и предполагал. Но удалив один указатель, второй-то должен остаться действующим? Как тогда правильно уничтожать такие объекты(применительно к данной ситуации), чтобы они не повисли в памяти?


 
RWolf ©   (2009-11-05 11:05) [42]


> Но удалив один указатель, второй-то должен остаться действующим?

Удаляются не указатели, а объекты, на которые они указывают.

> Как тогда правильно уничтожать такие объекты

.Free, как и любые другие. Просто надо следить за указателями; удалил объект — больше не пользуйся указателями на него.


 
Сергей М. ©   (2009-11-05 11:05) [43]


> тоже объявлена как и у меня переменная Bitmap и после отрисовки
> она уничтожается


При Bitmap.Free уничтожается не переменная, а объект, ранее созданный при вызове конструктора TBitmap.Create, указатель на который записан в переменную Bitmap при присвоении в строке Bitmap := TBitmap.Create.
Сама же лок.переменная Bitmap уничтожается (вместе с ее содержимым, каким бы оно  ни было) при завершении работы метода ListBox1DrawItem (читай - при выполнеии оператора end).
И поскольку содержимое переменной Bitmap нигде никуда не копировалось в ходе работы метода, созданный объект "умер", равно как и единственная существовавшея ссылка на него в переменной Bitmap.
Отныне не существует ни самого объекта, ни ссылок на него.

В твоем же случае ты еще при жизни своего объекта сделал три копиии ссылки на него, после чего убил объект и переменную, с которой были сделаны копии. Но копии-то ссылок остались ! И сразу же после уничтожения объекта они стали указывать в никуда, ибо объекта по адресу, на который о ни по-прежнему указывают, объекта уже нет.


 
Сергей М. ©   (2009-11-05 11:07) [44]


> удалив один указатель, второй-то должен остаться действующим?


Ну что значит "действующим" ?
Да, он продолжает указывать на некий адрес в памяти, по которому раньше жил объект, но по которому этого объекта уже нет, ибо ты уничтожил его своими руками.


 
kyn66 ©   (2009-11-05 11:20) [45]

Очень популярно разъяснено. Понятно, хоть десять переменных привяжи к одному объекту и при уничтожении хотя-бы одной переменной с объектом, все остальные зависнут в воздухе. Я так понял? Так как же мне поступить правильно? Как их уничтожать правильно?


> В твоем же случае ты еще при жизни своего объекта сделал
> три копиии ссылки на него,


Почему 3 ? Вроде 2 должно быть.


 
Сергей М. ©   (2009-11-05 11:29) [46]


> при уничтожении хотя-бы одной переменной с объектом, все
> остальные зависнут в воздухе


Да не переменной, а самого объекта !


> Почему 3 ? Вроде 2 должно быть.


>     st.AddObject("первая запись", Bitmap1); //раз копия
>     st.AddObject("вторая запись", Bitmap1); //два копия
>     st.AddObject("третья запись", Bitmap1); //три копия


 
RWolf ©   (2009-11-05 11:36) [47]

смотри:

Bitmap1 := TBitmap.Create; //создали пустой TBitmap, Bitmap1 — указатель №1 на него
ListBox1.Clear;
for i := 1 to KolLotery do
 begin
   DM1.ImageList1.GetBitmap(32, Bitmap1); //скопировали содержимое объекта из другого TBitmap
   st.AddObject("первая запись", Bitmap1); //запомнили указатель №1 на TBitmap
   st.AddObject("вторая запись", Bitmap1); //запомнили указатель №2
   st.AddObject("третья запись", Bitmap1); //запомнили указатель №3
 end;
ListBox1.Items.AddStrings(st);
st.Free;
Bitmap1.Free; //и прибили объект! всё, указатели невалидны.


 
kyn66 ©   (2009-11-05 11:39) [48]


> Да не переменной, а самого объекта !


Ну я и имел это ввид (переменной с объектом), пардон за неграмотные выражения. Я решил 2 раза потом, что 1-й раз - DM1.ImageList1.GetBitmap(32, Bitmap1);, а второй, когда Bitmap := TBitmap(ListBox1.Items.Objects[Index]); Вот и решил, что у меня фигурируют две независимые переменные, точнее ссылки на объекты. Сергей, сейчас я понял про связь с объектами. Так как разрулить полюбовно ситуацию с уничтожением объекта. Может так и оставить, уничтожив глобальную по закрытии главной формы? А во втором блоке уничтожение убрать?


 
Сергей М. ©   (2009-11-05 11:47) [49]


> kyn66 ©   (05.11.09 11:39) [48]


Да как угодно.
Главное понимать, что в каждый момент времени творится с самим объектом и потенциально существующими ссылками на него.


 
kyn66 ©   (2009-11-05 11:50) [50]

Ок!

2Сергей М.
2RWolf


СПАСИБО за помощь!



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

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

Наверх




Память: 0.56 MB
Время: 0.018 c
2-1257005562
minomorf
2009-10-31 19:12
2009.12.20
Как оргаизовать связку число-строка?


15-1256021069
ocean
2009-10-20 10:44
2009.12.20
Ночной кошмар


2-1257420503
-=SV=-
2009-11-05 14:28
2009.12.20
Возможно ли в заголовке PageControl поставить или добавить кноку?


1-1228909434
Alex_C
2008-12-10 14:43
2009.12.20
Как в DBGrid отловить MouseWheel?


1-1228221387
Yozch1
2008-12-02 15:36
2009.12.20
не работает CTRL-C !!!!