Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.02.11;
Скачать: [xml.tar.bz2];

Вниз

У 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.041 c
15-1168961336
isasa
2007-01-16 18:28
2007.02.11
Беспроводная сеть в офисе(обычные 100 Мбит/с).


15-1169551904
xayam
2007-01-23 14:31
2007.02.11
еще раз про CSS


15-1169395280
optimizer
2007-01-21 19:01
2007.02.11
Помогите оптимизировать.


15-1169222636
Riply
2007-01-19 19:03
2007.02.11
Поиск в ".mht" - файлах.


2-1169834817
aht
2007-01-26 21:06
2007.02.11
Поиск в StringGrid





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