Форум: "Начинающим";
Текущий архив: 2011.01.16;
Скачать: [xml.tar.bz2];
ВнизВыделить строку в 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;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.005 c