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

Вниз

У ListBox глючит событие ListBox1DrawItem ???   Найти похожие ветки 

 
kyn66 ©   (2007-01-23 15:54) [0]

Добрый день! Чем большепрограммируешь, тем больше выявляется вопросов и непоняток. Вот сейчас у ListBox валит постоянно Access Violation в ситуации следующей:

Var
 st : TStringList;
 Bitmap1 : TBitmap;
 Bitmap2 : TBitmap;
begin
 Bitmap1 := TBitmap.Create;
 Bitmap2 := TBitmap.Create;
 st := TStringList.Create;
....
st.AddObject(MemTab.FieldByName("OSName").Value, Bitmap1);
st.AddObject(DM1.OsTbl.FieldByName("OSIndName").Value,Bitmap2);
...
 if st.Count <> 0 then
  begin
     RepMsgFrm := TRepMsgFrm.Create(Application);
     RepMsgFrm.ListBox1.Items.AddStrings(st);
     RepMsgFrm.ShowModal;
     st.Free;
     RepMsgFrm.Close;
     RepMsgFrm.Free;
     Close;
     Exit;
  end;
....

procedure TRepMsgFrm.ListBox1DrawItem(Control: TWinControl; Index: Integer;
 Rect: TRect; State: TOwnerDrawState);
Var
 Bitmap : TBitmap;
 Offset : Integer;
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}
 Bitmap.Destroy;
end;
...


Вопрос: почему в событии DrawItem , зная , что у ListBox1 3 итема, при втором прохождении вылетает Access Violation? При трассировке обнаруживается, что Index остается неизменным и равен 0 ???
Вылетает после этой строки:

Bitmap := TBitmap(ListBox1.Items.Objects[Index]);
    if Bitmap <> nil then
...


 
MBo ©   (2007-01-23 16:13) [1]

>при втором прохождении вылетает Access Violation?
дык
Bitmap.Destroy;


 
TRUNK ©   (2007-01-23 16:16) [2]

Из-за Bitmap.Destroy уже при второй перерисовке рисовать будет нечего.
P.S. Для уничтожения обьектов вместо Destroy рекомендуется использовать Free.


 
Kyn66 ©   (2007-01-23 16:26) [3]

А как тогда правильно и где его объявлять и освобождать?


 
TRUNK ©   (2007-01-23 16:43) [4]


> А как тогда правильно и где его объявлять .....?


const
 BitmapCount = x;

var
 Bitmaps: array[0..BitmapCount-1] of TBitmap;

procedure TForm1.Form1Create(Sender: TObject);
begin
//..................
for i := 0 to BitmapCount-1 do
 Bitmaps[i] := TBitmap.Create;
//..................
end;



> А как тогда правильно и где его .... освобождать?


procedure TForm1.Form1Destroy(Sender: TObject);
begin
//..................
for i := 0 to BitmapCount-1 do
 Bitmaps[i].Free;
//..................
end;


 
Kyn66 ©   (2007-01-23 18:45) [5]

Оригинальное решение.Однако а как я узнаю какому Bitmap-у я буду присваивать объект из ListBoxa?
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}


 
Плохиш ©   (2007-01-23 18:50) [6]


> Kyn66 ©   (23.01.07 18:45) [5]
> Оригинальное решение.

В чём оригинальность?

> Однако а как я узнаю какому Bitmap-у я буду присваивать
> объект из ListBoxa?

Сранно, вроде все буквы/слова знакомые, а смысл вопроса ускользает. Ты - программер и присваивай адрес объекта той переменной, которой тебе и надо для дальнейшей обработки.


 
Плохиш ©   (2007-01-23 18:51) [7]


> Сранно

Классно по клавише не попал :-)


 
Kyn66 ©   (2007-01-23 18:51) [8]

На onCreate формы я сделал

Var Bitmap : TBitmap;

Затем на событии ListBox1DrawItem

Bitmap := TBitmap(ListBox1.Items.Objects[Index]);

затем на Destroy формы

Bitmap.Free;


И все работает.


 
Kyn66 ©   (2007-01-23 18:54) [9]

Воти получается , объявив один Bitmap , с ним и работаем. Поработали - уничтожили


 
Джо ©   (2007-01-23 18:55) [10]

> [8] Kyn66 ©   (23.01.07 18:51)
> На onCreate формы я сделал
>
> Var Bitmap : TBitmap;
>
> Затем на событии ListBox1DrawItem
>
> Bitmap := TBitmap(ListBox1.Items.Objects[Index]);
>
> затем на Destroy формы
>
> Bitmap.Free;
>
>
> И все работает.

Просто удивительно. А откуда в Objects вообще ссылки на битмапы берутся и где оные создаются?


 
Плохиш ©   (2007-01-23 18:56) [11]


> Kyn66 ©   (23.01.07 18:51) [8]
> На onCreate формы я сделал
>
> Var Bitmap : TBitmap;
>
> Затем на событии ListBox1DrawItem
>
> Bitmap := TBitmap(ListBox1.Items.Objects[Index]);
>
> затем на Destroy формы
>
> Bitmap.Free;
>
>
> И все работает.

Наивный чукотский мальчик.
Хотя в данном случае медицина, думается, бессильна.


 
Kyn66 ©   (2007-01-23 18:59) [12]


> Просто удивительно. А откуда в Objects вообще ссылки на
> битмапы берутся и где оные создаются?


А для этого нужно подняться вверх к моему вопросу и посмотреть выложенный код.


> Наивный чукотский мальчик. Хотя в данном случае медицина,
>  думается, бессильна.

А конкретнее мона в чем наивность заключается?


 
Плохиш ©   (2007-01-23 19:01) [13]


> А конкретнее мона в чем наивность заключается?

Выделено жирным шрифтом. Если, не дай сатана, будешь дальше программить не читая теории поймёшь, если успеешь до встречи с благодарными пользователями...


 
Kyn66 ©   (2007-01-23 19:04) [14]

В данном случае я выразил не удивление свое, а констатацию факта, применив такой метод.


 
Джо ©   (2007-01-23 19:33) [15]

Прекрасно. Вот смотри. Каждый раз, когда какая-то строка в Листбоксе перерисовывается, вызывается обработчик OnDrawItem. Повторю — для каждой строки и каждый раз, когда перерисовывается. Вопрос на засыпку — зачем ты в этом обработчике уничтожаешь экз. своих битмапов?



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

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

Наверх




Память: 0.51 MB
Время: 0.059 c
2-1169640790
Light-blr
2007-01-24 15:13
2007.02.11
Можно ли из одного юнита взять константу другого?


15-1169296134
boriskb
2007-01-20 15:28
2007.02.11
Вот в наше время!


15-1169024822
lookin
2007-01-17 12:07
2007.02.11
ICQ с телефона


15-1169554558
1234564
2007-01-23 15:15
2007.02.11
Посоветуйте обучалку по ХТМЛ


1-1166606694
fishka
2006-12-20 12:24
2007.02.11
IdTelnet и Read