Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Ошибка в коде, который раньше работал. [D7, XP]


Страницы:   1 2 3

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]


> Ошибка вылетает на "жирной" строке


Что за ошибка? И что поменялось в окружении?


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо