| 
| 
 | Вопрос # 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" |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |