Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
3-1251200767
DelphiN!
2009-08-25 15:46
2011.01.16
Аналог Copy(как в Делфи) для TSQL


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


2-1287986449
Irisss
2010-10-25 10:00
2011.01.16
Компилятор игнорирует Breakpoint


2-1288091783
Ann007
2010-10-26 15:16
2011.01.16
PageСontrol


15-1285725122
Дмитрий С
2010-09-29 05:52
2011.01.16
Вызвать диалог смены пароля.





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