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

Вниз

Непонятки с отрисовкой картинки в 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.076 c
14-1122788688
geidarka
2005-07-31 09:44
2005.08.21
вопрос по combobox (option) и MySQL


1-1123086872
TerminalHead
2005-08-03 20:34
2005.08.21
SC_HANDLE


1-1122983493
DeVid
2005-08-02 15:51
2005.08.21
Как отловить событие нажатия Ctrl+Alt+<буква>?


14-1122558056
lookin
2005-07-28 17:40
2005.08.21
Человеческая жизнь стоит 1 миллион евро


14-1122443954
Ega23
2005-07-27 09:59
2005.08.21
С днем рождения! 27 июля





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