![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ошибка в коде, который раньше работал. [D7, XP]
kyn66 © (2009-11-03 13:14:00)Уважаемые мастера. Помогите найти ошибку в коде, взятом из рабочей программы:
1) Наполняем stданными
procedure FormSt;
Var
st : TStringList;
Bitmap1 : TBitmap;
begin
st := TStringList.Create;
Bitmap1 := TBitmap.Create;
ListBox1.Clear;
for i := 1 to KolLotery do
begin
DM1.ImageList1.GetBitmap(32, Bitmap1);
st.AddObject('первая запись', Bitmap1);
st.AddObject('вторая запись', Bitmap1);
st.AddObject('третья запись', Bitmap1);
end;
ListBox1.Items.AddStrings(st);
st.Free;
Bitmap1.Free;
end;
2) Отрисовываем ListBox с пиктограммами
procedure TMainFrm.ListBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
Var
Offset : Integer;
Bitmap : TBitmap;
begin
Offset := 0;
with TCustomListBox(Control).Canvas do
begin
FillRect(Rect);
Bitmap := TBitmap(ListBox1.Items.Objects[Index]);
if Bitmap <> nil then
begin
Bitmap.Transparent :=True;
BrushCopy(Bounds(Rect.Left + 2, Rect.Top + 2, Bitmap.Width, Bitmap.Height),
Bitmap, Bounds(0, 0, Bitmap.Width, Bitmap.Height), clWhite);
Offset := Bitmap.Width + 8;
end;
TextOut(Rect.Left + Offset, Rect.Top, Listbox1.Items[Index]);
end;{With}
end;
Ошибка вылетает на "жирной" строке
Сергей М. (2009-11-03 13:31:00) [41]
> убивал по Distroy формы. Вот и вся разница
Т.е. убивал объект ты заведомо позже самого последнего обращения к нему.
А теперь ты сначала убил, а потом измываешься над трупом.
Вот и вся разница)
Игорь Шевченко (2009-11-03 13:30:00) [42]Упс. Ты вообще соображаешь, что пишешь ? Марш за книжки
Dennis I. Komarov (2009-11-03 13:30:00) [43]
> Ошибка стандартнонепонятнаяоткудавзятая Access Violation.
очень даже всегда понятная: Был "Вася" и нет его...
Anatoly Podgoretsky (2009-11-03 13:30:00) [44]> kyn66 (03.11.2009 13:14:00) [0]
Так и пишет "вылетаю на "жирной" строке"
Игорь Шевченко (2009-11-03 13:30:00) [45]
> if Bitmap <> nil then
if Bitmap is TBitmap
Сергей М. (2009-11-03 13:29:00) [46]
> используется там Binmap, без цифирей.
И что ?
Цифирь эта - всего лишь цифирь в идентификаторе лок.переменной.
Которая в строчке
Bitmap := TBitmap(ListBox1.Items.Objects[Index]);
получает значение, равное копии указателя на объект, который ты собственноручно убил в 1-й процедуре.
kyn66 (2009-11-03 13:29:00) [47]
> Демо © (03.11.09 13:22) [1]
> > Ошибка вылетает на "жирной" строкеЧто за ошибка? И что
> поменялось в окружении?
Да собственно особо ничего. Раньше этот код работал в отдельной форме и объявлял я Bitmapв Interface формы, а убивал по Distroy формы. Вот и вся разница.
kyn66 (2009-11-03 13:26:00) [48]Ошибка стандартнонепонятнаяоткудавзятая Access Violation.
> Ты ж Bitmap1 собственноручно убиваешь
Так я же его убиваю Bitmap1, который используется в первой процедуре и нужен только для наполнения stданными. А ошибка вылетает во второй процедуре и используется там Binmap, без цифирей.
Сергей М. (2009-11-03 13:23:00) [49]
> который раньше работал
Он и раньше не мог работать.
Ты ж Bitmap1 собственноручно убиваешь
см.Bitmap1.Free
а потом обращаешься к трупу за свойством Transparent
)
Демо (2009-11-03 13:22:00) [50]
> Ошибка вылетает на "жирной" строке
Что за ошибка? И что поменялось в окружении?