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

Вниз

Закрасить фон   Найти похожие ветки 

 
serg777 ©   (2007-06-04 23:06) [0]

Здравствуйте. Пишу простое ping приложение. Результат пинга вывожу в ListBox. Необходимо чтобы при отсутствии ответа от хоста фон строчки (или шрифт) становился другим цветом. Если не в ЛистБоксе, то в каком компоненте можно закрашивать строчки поотдельности. Спасибо.


 
DVM ©   (2007-06-04 23:13) [1]

OnDrawItem()


 
serg777 ©   (2007-06-04 23:33) [2]

to DVM: Спасибо за быстрый ответ, но я всего 5 часов как знаком с delphi. Если не сложно можно поподробнее как этой штукой пользоваться.


 
DVM ©   (2007-06-04 23:49) [3]

procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
 Rect: TRect; State: TOwnerDrawState);
begin
 if Odd(Index) then
   ListBox1.Canvas.Brush.color := clRed
 else
   ListBox1.Canvas.Brush.color := clGreen;
 ListBox1.Canvas.FillRect(Rect);
 ListBox1.Canvas.Font.Color := clWhite;
 ListBox1.Canvas.TextOut(Rect.Left, Rect.Top, ListBox1.Items[Index]);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 ListBox1.Style := lbOwnerDrawFixed;
end;


 
Германн ©   (2007-06-05 01:54) [4]


> Если не в ЛистБоксе, то в каком компоненте можно закрашивать
> строчки поотдельности.

Для тех, кто не знаком с delphi более 5 часов, а также не знаком с основами работы Windows есть и компоненты. Искать у Torry. http://www.torry.net
Но не плакаться потом, что за сии компоненты нужно платить "живые" деньги.
   Когда молочные братья остановились перед москательной
   лавкой, Балаганов шепнул Остапу:
    -- Вам не стыдно?
    -- Чего? -- спросил Остап.
    -- Того, что вы собираетесь платить за краску живыми
   деньгами?
    -- Ах, вы об этом, - сказал Остап. - Признаюсь, немного
   стыдно. Глупое положение, конечно. Но что ж делать? Не бежать
   же в исполком и просить там красок на проведение "Дня
   жаворонка". Они-то дадут, но ведь мы потеряем целый день.


 
serg777 ©   (2007-06-05 15:32) [5]

to DVM: используя Ваш пример происходит перерисовка всего листбокса. А можно ли сделать так чтобы прорисовывалась (закрашивалась) только последняя добавленная строка.


 
clickmaker ©   (2007-06-05 15:34) [6]


> прорисовывалась (закрашивалась) только последняя

if (Index = ListBox.Items.Count - 1) then


 
homm ©   (2007-06-05 15:37) [7]

> Пишу простое ping приложение.

Читать как «На другом форме я уже спросил как делать пинги, теперь мне нужна помошь от вас».


 
DVM ©   (2007-06-05 15:37) [8]


> to DVM: используя Ваш пример происходит перерисовка всего
> листбокса.

Происходит перерисовка того, что надо перерисовать листбоксу. Он сам вызывает эту процедуру для каждого своего элемента когда ему требуется его отрисовать.

Если тебе надо подсвечивать цветом только последний, то отрисовка будет такая

procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
begin
if Index =  listbox1.Items.Count - 1 then
  begin
    ListBox1.Canvas.Brush.color := clRed;
    ListBox1.Canvas.Font.Color := clWhite;
  end
else
  begin
    ListBox1.Canvas.Brush.color := clWindow;
    ListBox1.Canvas.Font.Color := clWindowText;
  end;
ListBox1.Canvas.FillRect(Rect);
ListBox1.Canvas.TextOut(Rect.Left, Rect.Top, ListBox1.Items[Index]);
end;


 
serg777 ©   (2007-06-05 16:28) [9]


> последняя добавленная строка.


 
homm ©   (2007-06-05 16:37) [10]

> > последняя добавленная строка.

Дайте-ка я телепатну.
Наверное хочет сказать что «последняя добавленная строка» <> «последняя строка».


 
G_M_S ©   (2007-06-05 17:08) [11]


> Если не в ЛистБоксе, то в каком компоненте можно закрашивать
> строчки поотдельности

TRichEdit. Позволяет произвольные куски текста писать на произвольном фоне (произвольным шрифтом) :))) Нужен пример? 10WMZ


 
serg777 ©   (2007-06-05 17:22) [12]


> Дайте-ка я телепатну.Наверное хочет сказать что «последняя
> добавленная строка» <> «последняя строка».

Нужно чтобы закрашивание применялось только к последней добавленной строчке, при этом все что было выше не изменялось, а  сейчас при прорисовке поледней строки меняется фон у всех строк.


 
homm ©   (2007-06-05 17:34) [13]

> Нужно чтобы закрашивание применялось только к последней
> добавленной строчке, при этом все что было выше не изменялось,
> а  сейчас при прорисовке поледней строки меняется фон у
> всех строк.

Проверить сейчас не могу, но на глаз код из [8] делает именно то, что ты говоришь, с учетом того, что он закрашиват просто «последнюю» строку, а не «последюю добавленную»


 
serg777 ©   (2007-06-05 17:41) [14]

Я написал вот так. После пинга очередного хоста закрашивается полностью лист бокс цветом последней строки. А мне очень хотелось бы чтобы предыдущие цвета не стирались...


procedure TForm1.ListBox2DrawItem(Control: TWinControl; Index: Integer;
 Rect: TRect; State: TOwnerDrawState);
begin
if IdIcmpClient1.ReplyStatus.FromIpAddress <> "0.0.0.0" then
 begin
 ListBox2.Canvas.Brush.color := clGreen;
 ListBox2.Canvas.FillRect(Rect);
 ListBox2.Canvas.Font.Color := clWhite;
 ListBox2.Canvas.TextOut(Rect.Left, Rect.Top, ListBox2.Items[Index]);
 end;
if IdIcmpClient1.ReplyStatus.FromIpAddress = "0.0.0.0" then
 begin
 ListBox2.Canvas.Brush.color := clRed;
 ListBox2.Canvas.FillRect(Rect);
 ListBox2.Canvas.Font.Color := clWhite;
 ListBox2.Canvas.TextOut(Rect.Left, Rect.Top, ListBox2.Items[Index]);
 end;

end;


 
homm ©   (2007-06-05 18:08) [15]

> Я написал вот так.

Это твои проблемы теперь. Тебе показали как правильно.
См [8].


 
G_M_S ©   (2007-06-05 18:10) [16]


>  ListBox2.Canvas.FillRect(Rect);

Вполне вероятно, что в Rect находится Rect всего листбокса, а вовсе не последней записи. Или еще какая-нибудь фигня в этом же духе. Насколько мне не изменяет память, номарльно отрисовать другим цветом на компоненте, изначально таких фокусов не предусматривающем, достаточно проблематично.

Зачем мучаешься? Смотри в сторону TRichEdit. Он позволяет раскрашивать строки как тебе вздумается, причем вполне "официально". Во всяких там факах даже примерчики встречаются.


 
homm ©   (2007-06-05 19:20) [17]

> Вполне вероятно, что в Rect находится Rect всего листбокса,
> а вовсе не последней записи.

Да ты его код не видешь что-ли? Он не проверяет индекс рисуемого элемента, только состояние «пингатора», естественно у него все будет одинакого. А Rectимеет значение именно текущего элемента.


 
homm ©   (2007-06-05 19:22) [18]

> Насколько мне не изменяет память, номарльно отрисовать другим
> цветом на компоненте, изначально таких фокусов не предусматривающем,
> достаточно проблематично.

Все придусмотрено См. DrawItem


> Зачем мучаешься? Смотри в сторону TRichEdit.

Для чего? Что-бы еше больше мучатся, делая поведение элемента не таким, для чего он был предназначен? Извращенец?


 
G_M_S ©   (2007-06-06 09:48) [19]


> Все придусмотрено См. DrawItem

Не предусмотрено идеологией VCL. Там, где ИДЕОЛОГИЧЕСКИ приемлемо менять (например, OnDrawCell в некоторых гридах) - туда параметрами процедуры передаются цвет фона и шрифт. Ессно можно и текст куда попало вывести, и раскрасить - кто мешает пробежаться по листбоксу, вычислить границы отдельных строчек и рисовать туда все, что вздумается?


> Для чего? Что-бы еше больше мучатся, делая поведение элемента
> не таким, для чего он был предназначен?

Если мне не изменяет память, TRichEdit как раз и предназначем для вывода текста. Причем поскольку поддерживается RTF, то вывод текста можно осуществлять разными шрифтами, цветом и т.п. Более того: не надо писать никаких OnDraw! Достаточно выделить строчку и писать значения для параметров отображения в соотв. свойства (см. TRichEdit.SelAttributes)

ЗЫ: Кста, сам я люблю юзеров побаловать цветными логами работы, а потому и пишу все в TRichEdit.


 
DVM ©   (2007-06-06 10:47) [20]


> Не предусмотрено идеологией VCL. Там, где ИДЕОЛОГИЧЕСКИ
> приемлемо менять (например, OnDrawCell в некоторых гридах)
> - туда параметрами процедуры передаются цвет фона и шрифт.
>  

Не вижу ничего идущего в разрез с идеологией VCL.


> Если мне не изменяет память, TRichEdit как раз и предназначем
> для вывода текста.

Это само собой. Только вот что-то мне кажется, что он гораздо больше потребляет ресурсов, чем обычный ListBox со стилем OwnerDraw ибо должен хранить информацию о цвете сам для каждой строки, в тоже время ListBox будет хранить лишь сами строки.

Если логи будут большим, то ListBox и ListView - самые быстрые.


 
G_M_S ©   (2007-06-06 15:20) [21]


>  ибо должен хранить информацию о цвете сам для каждой строки

Все гораздо проще: если выставить свойство plaintext в False он всего лишь будет хранить текст в формате RTF, там форматирование текста производится чем-то типа тэгов. Соответственно он сам при перерисовке в СВОЕМ родном обработчике рисует текст так, как надо. Если считаешь, что умеешь писать обработчики лучше авторов компонент - без проблем. Я предпочитаю использовать готовый.


> Если логи будут большим, то ListBox и ListView - самые быстрые.
Это со всеми ихними Items.Count и пр. лабудой? При том что сам текст храниться в таком же TStrings? Да еще плюс некий собственный обработчик перерисовки? Сомневаюсь. Точно сказать не могу, но сомневаюсь, что быстрее. Тем более, что явных тормозов при добавлении/прокрутке пока у TRichEdit не видел.


 
serg777 ©   (2007-06-07 13:19) [22]

Списибо ВСЕМ. Особенно [19]. Заменил на RichEdit. Все просто отлично!


 
homm ©   (2007-06-07 14:07) [23]

> Списибо ВСЕМ. Особенно [19]. Заменил на RichEdit. Все просто
> отлично!

Ну и зря :(


 
G_M_S ©   (2007-06-07 16:13) [24]


> Ну и зря

не зря. Все время приблуды мелкие сетевые пишу, лог удобнее всего вести таки в RichEdit



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

Форум: "Начинающим";
Текущий архив: 2007.07.01;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.005 c
2-1181222942
webpauk
2007-06-07 17:29
2007.07.01
Array of TmyRec


1-1178104837
BAHbKA
2007-05-02 15:20
2007.07.01
Проблема поиска известных файлов


1-1178106337
DelphiLexx
2007-05-02 15:45
2007.07.01
Передать процедуру класса в Обычную функцию


11-1164371812
Don
2006-11-24 15:36
2007.07.01
опечатки в KOL_Unicode.inc


2-1181320090
Bullfrog
2007-06-08 20:28
2007.07.01
Создание, редактирование отчета





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