Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 2 606

/ вопрос открыт /

дравствуйте, эксперты!
Вопрос такой. Моя программа накапливает периодически появляющиеся данные (количество этих данных за сеанс работы может быть произвольным).
Данные эти необходимо предоставлять пользователю в реальном времени (причем разница по времени между поступлением данных1 и данных2 может быть ~ 100 мс или более часа) и в табличном виде.
Примерно как на рисунке

И еще, чтобы программа выделяла красным цветом (можно и другой способ обратить внимание пользователя) определенную строчку.
Вопрос такой: на каком компоненте удобнее и правильнее всего была бы реализация отоборажения информации в моем случае? Было бы неплохо увидеть еще и кусочек кода в качестве примера.

К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)

anbaresi Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: anbaresi (статус: Посетитель)
Вопрос отправлен: 7 апреля 2009, 10:56
Состояние вопроса: открыт, ответов: 2.

Ответ #1. Отвечает эксперт: Тов. Женька

Здравствуйте, anbaresi!
Зависит от вида представления информации, т.е. текстовый файл, файл БД и т.п. В случае с файлом БД можно настроить событие DBGrid (DrawDataCell, DrawColumnCell) таким образом, что при определенном значении строка или ячейка может окрашиваться в определенный цвет.
На счет куска кода поищите в интернете "разноцветный DBGrid".

Ответ отправил: Тов. Женька (статус: 3-ий класс)
Время отправки: 7 апреля 2009, 11:12
Оценка за ответ: 4

Ответ #2. Отвечает эксперт: min@y™

Как данные хранятся?
Если они постоянно накапливаются и висят в памяти, можно использовать TListView в виртуальном режиме (OwnerData:= True) в табличном виде (ViewStyle:= vsReport).
Также можно использовать TDrawGrid.

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 7 апреля 2009, 11:23
Оценка за ответ: 4


Мини-форум вопроса

Всего сообщений: 8; последнее сообщение — 8 апреля 2009, 19:16; участников в обсуждении: 5.
Тов. Женька

Тов. Женька (статус: 3-ий класс), 7 апреля 2009, 11:15 [#1]:

Вот для примера изменение шрифта определенной строки (взято в DRKB):

procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect; Field: TField; State: TGridDrawState);
begin
// If the record's CustNo is 4711 draw the entire row with a
// line through it. (set the font style to strike out)
if (Sender as TDBGrid).DataSource.DataSet.FieldByName('CustNo').AsString =
'4711' then
with (Sender as TDBGrid).Canvas do
begin
FillRect(Rect);
// Set the font style to StrikeOut
Font.Style := Font.Style + [fsStrikeOut];
// Draw the cell right aligned for floats + offset
if (Field.DataType = ftFloat) then
TextOut(Rect.Right - TextWidth(Field.AsString) - 3,
Rect.Top + 3, Field.AsString)
// Otherwise draw the cell left aligned + offset
else
TextOut(Rect.Left + 2, Rect.Top + 3, Field.AsString);
end;
end;
DNK

DNK (статус: Студент), 7 апреля 2009, 18:50 [#2]:

Приходилось в своей жизни писать программу анализа трафика АТС. На входе бинарные данные событий, на выходе текстовый файл звонков. Данные появлялись не самостоятельно, но могли прибавляться к имеющимся. Всё бы ничего, да заставили сделать показуху записей.
Делал как предложил уважаемый min@y™: ListView со свойством ViewStyle=vsReport. К OwnerData=True приходится обязательно переходить, когда количество записей переваливает за тысячу, ибо тормоза неимоверные. Заполнение записи производится по событию OnData.
Также приходилось выделять определеные записи цветом для чего ставил OwnerDraw=True. А вот по какому событию рисовал не помню, самое противное их там куча.
"Digital Networked Knight"
anbaresi

anbaresi (статус: Посетитель), 7 апреля 2009, 19:38 [#3]:

данные хранятся так: поступило значение и присвоилось переменной А, второе значение - переменной В, третье - С, четвертое (последнее) - D

А :=25
В :=40
С :=56
D :=29

A, B, C и D представляют собой как бы пакет "Данные1", следующий такой пакет "Данные2" содержит уже новые значения A, B, C и D/
Последнее четвертое значение - D говорит о том, что пора данные выводить.
Я еще забыл, что данные надо сохранить в файл txt, а лучше xls.
min@y™

min@y™ (статус: Доктор наук), 7 апреля 2009, 19:49 [#4]:

Я спросил, как хранятся ВСЕ принятые данные (весь принятый массивищще)?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
anbaresi

anbaresi (статус: Посетитель), 8 апреля 2009, 14:09 [#5]:

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

Мне кажется, что StringGrid мне больше подходит. Пока только немного не ясно как окрашивать отдельные строки (или текст отдельных строк) и неизвестно будут ли у StringGrid тормоза как у ListView при большом количестве отображаемых данных?
Вадим К

Вадим К (статус: Академик), 8 апреля 2009, 14:38 [#6]:

У ListView нет тормозов. Можно хоть миллион строк добавить. Просто надо уметь добавлять. Читайте мою статью о виртуальном ListView
Галочка "подтверждения прочтения" - вселенское зло.
min@y™

min@y™ (статус: Доктор наук), 8 апреля 2009, 14:51 [#7]:

Цитата:


Нет не весь массивище.


Короче, если нужно отображать все принятые данные, то их надо где-то хранить. Т.е. не последний "пакет", а все принятые пакеты. Если ты применишь StringGrid, то все данные будут храниться в нём, что при больших объёмах не есть гут (тормоза возможны). Поэтому, я предлагаю сделать так.

type
  TRec = packed record
    A, B, C, D: Byte; // или Word, Integer, Cardinal - какая нужна разрядность
  end;
 
  TRecBuffer = array of TRec; // Массивищще

Данные хранятся в памяти, а перерисовка происходит по мере необходимости (см. мой ответ).
Увеличивать длину массива нужно не на 1, а сразу, скажем, на 10...100, чтобы не тратить много времени на циклическое перераспределение памяти.

Также, вместо массива, можно использовать TList или TStringList. Короче, суть одна: хранить данные в памяти, а не в визуальном компоненте, и выводить по мере надобности. При этом будет их удобно сохранять.

По поводу Excel - см. класс TXlsReadWriteII.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
DNK

DNK (статус: Студент), 8 апреля 2009, 19:16 [#8]:

Ложки нет! :)
"Digital Networked Knight"

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 7 апреля 2020, 14:53
Выполнено за 0.03 сек.
Рейтинг@Mail.ru