|
Вопрос # 2 606/ вопрос открыт / |
|
дравствуйте, эксперты!
Вопрос такой. Моя программа накапливает периодически появляющиеся данные (количество этих данных за сеанс работы может быть произвольным).
Данные эти необходимо предоставлять пользователю в реальном времени (причем разница по времени между поступлением данных1 и данных2 может быть ~ 100 мс или более часа) и в табличном виде.
Примерно как на рисунке
И еще, чтобы программа выделяла красным цветом (можно и другой способ обратить внимание пользователя) определенную строчку.
Вопрос такой: на каком компоненте удобнее и правильнее всего была бы реализация отоборажения информации в моем случае? Было бы неплохо увидеть еще и кусочек кода в качестве примера.
К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)
 |
Вопрос задал: 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 (статус: Студент), 7 апреля 2009, 18:50 [#2]:
Приходилось в своей жизни писать программу анализа трафика АТС. На входе бинарные данные событий, на выходе текстовый файл звонков. Данные появлялись не самостоятельно, но могли прибавляться к имеющимся. Всё бы ничего, да заставили сделать показуху записей.
Делал как предложил уважаемый min@y™: ListView со свойством ViewStyle=vsReport. К OwnerData=True приходится обязательно переходить, когда количество записей переваливает за тысячу, ибо тормоза неимоверные. Заполнение записи производится по событию OnData.
Также приходилось выделять определеные записи цветом для чего ставил OwnerDraw=True. А вот по какому событию рисовал не помню, самое противное их там куча.
"Digital Networked Knight"
|
|
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™ (статус: Доктор наук), 7 апреля 2009, 19:49 [#4]:
Я спросил, как хранятся ВСЕ принятые данные (весь принятый массивищще)?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
anbaresi (статус: Посетитель), 8 апреля 2009, 14:09 [#5]:
Нет не весь массивище. Принимается как бы пакет данных, состоящий из четырех значений, эти значения присваиваются переменным, производятся арифм действия с этими переменными и выводятся результаты пользователю на обозрение. Следующий пакет (опять же состоящий из четырех значений) и новые значения присваиваются тем же переменным и т.д.
Мне кажется, что StringGrid мне больше подходит. Пока только немного не ясно как окрашивать отдельные строки (или текст отдельных строк) и неизвестно будут ли у StringGrid тормоза как у ListView при большом количестве отображаемых данных?
|
|
Вадим К (статус: Академик), 8 апреля 2009, 14:38 [#6]:
У ListView нет тормозов. Можно хоть миллион строк добавить. Просто надо уметь добавлять. Читайте мою статью о виртуальном ListView
Галочка "подтверждения прочтения" - вселенское зло.
|
|
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 (статус: Студент), 8 апреля 2009, 19:16 [#8]:
Ложки нет!
"Digital Networked Knight"
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|