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

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

Непонятки с отрисовкой картинки в Listbox [D6, WinXP]


kyn66 ©   (2005-07-28 17:41:00) 

Уважаемые мастера, хочу в Listbox по некоторым условиям отрисовывать итемсы то содной, то с другой картинкой. Код следующий:

procedure TRepMsgFrm.ListBox1DrawItem(Control: TWinControl; Index: Integer;
 Rect: TRect; State: TOwnerDrawState);
begin
 with TCustomListBox(Control) do
  begin
    Canvas.FillRect(Rect);
    Canvas.TextOut(Rect.Left + 2 + ImageList.Height, Rect.Top + 3, Items[Index]);
    Rect.Bottom := Rect.Top + ImageList.Height; // перерисовывать только
    Rect.Right := Rect.Left + ImageList.Width; // часть , на которой картинка
    Rect.Top := Rect.Top + 2;
    ImageList.Draw(Canvas, Rect.Left, Rect.Top, NomPic);
  end;{With}
end;

procedure TRepMsgFrm.Button1Click(Sender: TObject);
begin
 NomPic := 0;
 ListBox1.Items.Add('Строка 1');
end;

procedure TRepMsgFrm.Button2Click(Sender: TObject);
begin
 NomPic := 1;
 ListBox1.Items.Add('Строка 2');
end;


При клине на бутоне, картинки все меняются на ту, которая была последней. Почему они не запоминаются?


kyn66   (2005-08-01 12:52:00) [1]

>>ЮЮ
Вот это вроде то, что нужно. Маленькое дополнение.... А если я сперва строки для ListBox готовлю во временной переменной типа TStrings, могу я предавать в нее объекты, а потом все перенести в Listbox, ничего не потеряется?


ЮЮ   (2005-07-29 13:32:00) [2]

после  

NomPic := 1;
ListBox1.Items.Add('Строка 2');
обработчик
ListBox1DrawItem вызывается для отрисовки обоих итемов, а так как NomPic теперь = 1, то и рисунок будет одинаковый.

Если рисунок скоррелирован с инднксом, типа четные - первый, нечетные - второй, то ListBox1DrawItem следует анализировать параметр Index, например
 nomPic := index mod 2, причем nomPic - просто локальная переменная в ListBox1DrawItem.

Если же "nomPic" определен где-то до момента нажатия на кнопку, скажем для примера в picEdit (TEdit на форме), то

procedure TRepMsgFrm.Button1Click(Sender: TObject);
var
nomPic: integer;
begin
nomPic := StrToIntDef(picEdit.Text, 0)
ListBox1.Items.AddObject('Строка 1', TObject(nomPic));
end;

и теперь для каждого Index в ListBox1DrawItem можно извлечь сохраненный "nomPic":

procedure TRepMsgFrm.ListBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
var
nomPic: integer;
begin
 nomPic := Integer(ListBox1.Items.Objects[Index]);


kyn66   (2005-07-29 13:10:00) [3]

>> Items.Count.
Я не про то..

>>Например, сделать NomPic массивом, по количеству итемов.
>>Ну, и вписать туда нужные индексы картинок.
А это не тоже самое?

...
NomPic := 0
ImageList.Draw(Canvas, Rect.Left, Rect.Top, NomPic);
NomPic := 1
ImageList.Draw(Canvas, Rect.Left, Rect.Top, NomPic);
NomPic := 0
ImageList.Draw(Canvas, Rect.Left, Rect.Top, NomPic);
..


>>Кроме того, у ListBox.Items есть свойство Objects,
>>в котором можно сохранять четырехбайтовые значения,
>>т.е. Objects[i]:= TObject(idx), и в нужных местах
>>вызывать: idx := Longint(Objects[i]).

Тут действительно нуно как-то через AddObject делать, токак вот ка - пока не придумаю, вот и консультируюсь ;-)


Leonid Troyanovsky   (2005-07-29 11:33:00) [4]


> kyn66 ©   (29.07.05 10:39) [4]
> А как я узнаю кол-во итемсов? Оно могет быть разным


Items.Count.

--
Regards, LVT.


kyn66   (2005-07-29 10:39:00) [5]

А как я узнаю кол-во итемсов? Оно могет быть разным


Leonid Troyanovsky   (2005-07-29 09:28:00) [6]


> kyn66 ©   (29.07.05 09:08) [2]
> А каким образом тогда мне регулировать, какую картинку подгружать
> в итемс, на данном этапе это NomPic регулируется.


Например, сделать NomPic массивом, по количеству итемов.
Ну, и вписать туда нужные индексы картинок.
Кроме того, у ListBox.Items есть свойство Objects,
в котором можно сохранять четырехбайтовые значения,
т.е. Objects[i]:= TObject(idx), и в нужных местах
вызывать: idx := Longint(Objects[i]).

--
Regards, LVT.


kyn66   (2005-07-29 09:08:00) [7]

А каким образом тогда мне регулировать, какую картинку подгружать в итемс, на данном этапе это NomPicрегулируется.


Leonid Troyanovsky   (2005-07-28 18:01:00) [8]


> kyn66 ©   (28.07.05 17:41)  

>     ImageList.Draw(Canvas, Rect.Left, Rect.Top, NomPic);


А если так:

ImageList.Draw(Canvas, Rect.Left, Rect.Top, Index) ?

--
Regards, LVT.


Наверх

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