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

Вниз

Непонятки с отрисовкой картинки в Listbox   Найти похожие ветки 

 
kyn66 ©   (2005-07-28 17:41) [0]

Уважаемые мастера, хочу в 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;


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


 
Leonid Troyanovsky ©   (2005-07-28 18:01) [1]


> kyn66 ©   (28.07.05 17:41)  

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


А если так:

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

--
Regards, LVT.


 
kyn66 ©   (2005-07-29 09:08) [2]

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


 
Leonid Troyanovsky ©   (2005-07-29 09:28) [3]


> 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 10:39) [4]

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


 
Leonid Troyanovsky ©   (2005-07-29 11:33) [5]


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


Items.Count.

--
Regards, LVT.


 
kyn66 ©   (2005-07-29 13:10) [6]

>> 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 делать, токак вот ка - пока не придумаю, вот и консультируюсь ;-)


 
ЮЮ ©   (2005-07-29 13:32) [7]

после  

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-08-01 12:52) [8]

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



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

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

Наверх




Память: 0.49 MB
Время: 0.059 c
4-1120111340
Mishenka
2005-06-30 10:02
2005.08.21
Работа с двумя CDRom ами


9-1114885954
Игорь Л.
2005-04-30 22:32
2005.08.21
Класс в Delphi


14-1122542787
Al_jus
2005-07-28 13:26
2005.08.21
Вопрос


4-1119601538
webpauk
2005-06-24 12:25
2005.08.21
Изменение иконки


14-1122565999
vrem
2005-07-28 19:53
2005.08.21
Архивирование убивает связь!