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

Вниз

Выделить строку в listbox   Найти похожие ветки 

 
кроссман   (2010-10-18 19:58) [0]

Как изменить подсветку ячейки в 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-18 20:08) [1]

Забыл после проверки условия сразу идет
       listbox2.Items.Add(stringgrid1.Cells[1,d]);
Может функция изменения атрибутов ячейки не всегда вызывается.


 
Германн ©   (2010-10-18 21:02) [2]


> Почему?

Потому что контрол перерисовывается гораздо чаще, чем ты думаешь.


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

И как же исправить?


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

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


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

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


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


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

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

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

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

--
Regards, LVT.


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

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


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


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

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


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


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

Теоретически можно придумать массу ситуаций, когда "ту самую" проверку в обработчике 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 08:25) [10]

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


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

> Германн ©   (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 10:42) [12]

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


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


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

))) клиника


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


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


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

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

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


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


> Юрий Зотов ©   (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 14:44) [16]


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

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


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


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

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


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


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

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

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

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

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


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


> кроссман   (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.


 
Leonid Troyanovsky ©   (2010-10-19 22:58) [20]


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

>  with ListBox1

with ListBox2
Sorry.

--
Regards, LVT.


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


> Leonid Troyanovsky ©


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

)))


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

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


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

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



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

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

Наверх




Память: 0.53 MB
Время: 0.009 c
15-1286210928
@!!ex
2010-10-04 20:48
2011.01.16
Где купить Штеуд не совместимый компьютер?


2-1287467671
ixen
2010-10-19 09:54
2011.01.16
Подскажите как написать триггер...


15-1285492613
Lamer@fools.ua
2010-09-26 13:16
2011.01.16


2-1287741449
kate158
2010-10-22 13:57
2011.01.16
парсер эксель файлов-хочу вытащить дату!


3-1251200767
DelphiN!
2009-08-25 15:46
2011.01.16
Аналог Copy(как в Делфи) для TSQL