Форум: "Начинающим";
Текущий архив: 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