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

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

Выделить строку в listbox


Страницы:   1 2

кроссман ©   (2010-10-18 19:58:00) 

Как изменить подсветку ячейки в listbox сразу при добавлении записи в нее при выполнениии определенного условия.
Условие
       if (length(edit1.Text)>1) and (ansipos(edit1.Text,stringgrid1.Cells[2,d])>0) then
         ind:=1
       else
         ind:=2;
Изменяю атрибуты
procedure TForm1.ListBox2DrawItem(Control: TWinControl; Index: Integer;
 Rect: TRect; State: TOwnerDrawState);
var
 col: TColor;
 brush: TBrush;
begin
 brush := TBrush.Create;
 with (Control as TListBox).Canvas do
 begin
   // проверим условие назначим цвет
   if ind=1 then
     Col:= clyellow
   else
     Col:= clred;

   // покрасим и обновим текст
   brush.Style:= bsSolid;
   brush.Color:= Col;
   Windows.FillRect(handle, Rect, brush.Handle);
   Brush.Style:= bsClear;
   TextOut(Rect.Left, Rect.Top,
     (Control as TListBox).Items[Index]);
 end;
 brush.Free;
end;
Всегда выдает красный, даже если ind=2. Почему?


Германн   (2010-10-20 03:17:00) [1]

Удалено модератором


Германн   (2010-10-20 03:00:00) [2]

Удалено модератором


Германн   (2010-10-20 01:43:00) [3]


> Leonid Troyanovsky ©


>  // проверим условие назначим цвет
>  col := colors[Odd(GetTickCount)];
>

)))


Leonid Troyanovsky   (2010-10-19 22:58:00) [4]


> Leonid Troyanovsky ©   (19.10.10 22:53) [19]

>  with ListBox1

with ListBox2
Sorry.

--
Regards, LVT.


Leonid Troyanovsky   (2010-10-19 22:53:00) [5]


> кроссман   (18.10.10 22:47) [7]

> Ведь условие проверяется не в самом listboxe (о чем уже
> прочитал) а на стороне


procedure TForm1.ListBox2DrawItem(Control: TWinControl; Index: Integer;
 Rect: TRect; State: TOwnerDrawState);
var
 col: TColor;
begin
with (Control as TListBox), Canvas do
begin
  // определим цвет итема
  Col := TColor(Items.Objects[Index]);

  // покрасим и обновим текст
  brush.Style:= bsSolid;
  brush.Color:= Col;

  FillRect(Rect);
  Brush.Style:= bsClear;
  TextOut(Rect.Left, Rect.Top, Items[Index]);
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
const
 colors: array [Boolean] of TColor = (clRed, clYellow);
var
 col: TColor;
begin
 // проверим условие назначим цвет
 col := colors[Odd(GetTickCount)];
 with ListBox1 do  //добавим итем, запомним его цвет
   Items.AddObject(IntToStr(GetTickCount), TObject(col));
end;

--
Regards, LVT.


Юрий Зотов   (2010-10-19 19:21:00) [6]


> Германн ©   (19.10.10 14:34) [15]
> А при чем тут тот самый листбокс, в котором происходит рисование?

Ни при чем. Он и не обязан быть при чем. А может быть и при чем. Пофиг.

Вот пример - в обработчике рисования пишем:
if <сегодня четное число> then
<рисуем красным>
else
<рисуем синим>

Правильно? Правильно. И при чем тут ЛистБокс?

Ни при чем. Он и не обязан быть при чем. А может быть и при чем. Пофиг.


Германн   (2010-10-19 14:57:00) [7]


> Ввот в чем дело. Выводя перед строкой
> listbox2.Items.Add(stringgrid1.Cells[1,d]);
> имеем ind меняется на 1 и 2
>

Ну и что что какой-то там ind когда-то меняется? Он (ind) ведь никак не привязан к конкретному Item'у листбокса!


кроссман   (2010-10-19 14:44:00) [8]


> При выполнении программы ind меняется на 1 и 2.А вот в ListBox2DrawItem
> он всегда 2.

Ввот в чем дело. Выводя перед строкой
listbox2.Items.Add(stringgrid1.Cells[1,d]);
имеем ind меняется на 1 и 2
А в OnDrawItem всегда  ind=2 (выводил перед проверкой условия)
В общем решил не маяться и уже все поменял на Stringgrid и придумал как решить проблему. Утро вечера мудренее, вчера ни фига в голову не лезло.
Еще раз всем спасибо за участие.


Германн   (2010-10-19 14:34:00) [9]


> Юрий Зотов ©   (19.10.10 10:28) [11]
>
> > Германн ©   (19.10.10 01:38) [9]
>
> Что мешает вставить в обработчик OnDrawItem именно эту строку:
>
> (length(edit1.Text)>1) and (ansipos(edit1.Text,stringgrid1.
> Cells[2,d])>0)
> То есть, вот прямо ее и вставить, "как есть".
>

А при чем тут тот самый листбокс, в котором происходит рисование?
:)


Юрий Зотов   (2010-10-19 11:05:00) [10]


> кроссман   (19.10.10 10:42) [12]


> Как понял во время выполнения  OnDrawItem происходит обработка
> ТОЛЬКО что есть в листбоксе и никуда на форму прога вылезать не хочет.
Неверно Вы поняли. Обработчик OnDrawItem - это метод ФОРМЫ (а не ListBox'а), поэтому в нем доступно ВСЕ, что есть на форме (а также все, что есть в модуле этой формы, а также все, что есть в секциях interface других используемых модулей).

> Время поджимает, поэтому пытаюсь что-то намутить через stringgrid.

Дело Ваше, но если Вы считаете, что "намутить что-то" через одно известное место - это проще и быстрее, чем вставить одну элементарную строчку, то согласиться с Вами довольно сложно.


Palladin   (2010-10-19 11:00:00) [11]


>  да я голову сломаю как что-либо в этой строке махнуть

))) клиника


кроссман   (2010-10-19 10:42:00) [12]

Как понял во время выполнения  OnDrawItem происходит обработка ТОЛЬКО что есть в листбоксе и никуда на форму прога вылезать не хочет.
Юрий, спасибо за строку, но вставлять что мне не понятно не рискну (я же не прогер, а так лузер), вдруг эту прогу потребуется поправить лет через 5, да я голову сломаю как что-либо в этой строке махнуть.
Время поджимает, поэтому пытаюсь что-то намутить через stringgrid.


Юрий Зотов   (2010-10-19 10:28:00) [13]

> Германн ©   (19.10.10 01:38) [9]

Что мешает вставить в обработчик OnDrawItem именно эту строку:
(length(edit1.Text)>1) and (ansipos(edit1.Text,stringgrid1.Cells[2,d])>0)
То есть, вот прямо ее и вставить, "как есть".


> кроссман   (19.10.10 08:25) [10]

Сразу после изменения ind вставьте строку:
ListBox2.Invalidate; // Это запрос перерисовки ListBox2
или
ListBox2.Repaint; //  Это немедленная перерисовка ListBox2

Соответственно, такая строка приведет к срабатыванию обработчика ListBox2.OnDrawItem - и что Вы в нем напишете, то и произойдет. Причем совершенно ничто не мешает проверить в нем любые условия, не надо выдумывать несуществующие проблемы.


кроссман   (2010-10-19 08:25:00) [14]

Мдя, засада. Решил вывести результаты в мемо.
При выполнении программы ind меняется на 1 и 2.
А вот в ListBox2DrawItem он всегда 2.
Попробовал кинуть на форму checkbox и менял у нее значения на true и false,
таже хрень в 1-ом случае она меняется во 2-ом нет.
Это аллес! Я в полном тупике.
Германн, вы меня окончательно запутали. Я же не спец.


Германн   (2010-10-19 01:38:00) [15]


> Разве что-то мешает?

Теоретически можно придумать массу ситуаций, когда "ту самую" проверку в обработчике ListBox2DrawItem выполнить либо нельзя, либо очень трудоёмко.


> кроссман   (18.10.10 22:47) [7]

Для правильного решения задачи важно понять главное. Контрол прорисовывается тогда, когда Windows считает это нужным. От твоих действий по добавлению строк в листбокс это мало зависит. Значит чтобы прорисовать элементы контрола так как это нужно тебе, нужно чтобы в обработчике OnDrawxxx всегдаможно было бы точно определить как его рисовать. Т.е. если при прорисовке нельзя проверить
(length(edit1.Text)>1) and (ansipos(edit1.Text,stringgrid1.Cells[2,d])>0)
, то при этой проверке "на стороне" нужно "пометить" этот элемент так, чтобы после (потом) всегда можно было бы отличить помеченный элемент от не помеченного.


Юрий Зотов   (2010-10-19 00:38:00) [16]


> кроссман   (18.10.10 22:47) [7]
> И в обработчике ListBox2DrawItem это условие прописать нельзя.

Почему нельзя? Разве что-то мешает?


кроссман   (2010-10-18 22:47:00) [17]

Как раз есть проблема с выделением строки другим цветом.
Ведь условие проверяется не в самом listboxe (о чем уже прочитал) а на стороне
(length(edit1.Text)>1) and (ansipos(edit1.Text,stringgrid1.Cells[2,d])>0)
И в обработчике ListBox2DrawItem это условие прописать нельзя.


Leonid Troyanovsky   (2010-10-18 21:39:00) [18]


> кроссман   (18.10.10 21:34) [5]

> Не думал что будет такая проблема с выделением строки.

Нет проблем с выделением строки.

А ты сам себя в
> кроссман   (18.10.10 19:58)
хорошо понимаешь?

--
Regards, LVT.


кроссман   (2010-10-18 21:34:00) [19]

То есть вместо изменения некого индекса (ind) надо запоминать результат в Items.Objects. Правда к вечеру уже не соображу что там запоминать.
Не думал что будет такая проблема с выделением строки.


Германн   (2010-10-18 21:22:00) [20]

Либо делать настоящую проверку выполнения некоего условия в самом ListBox2DrawItem, либо сделав такую проверку где-то еще запоминать результаты в самой ячейке (Items.Objects) и в ListBox2DrawItem проверять это значение для каждого Item.


Страницы:   1 2

Наверх

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