|
|
|
Просмотр постоянно обновляемой таблицы логов
|
|||
|---|---|---|---|
|
#18+
Коллеги, такой вопрос. Нужно вести лог с большим количеством записываемых данных и отображать их визуально в гриде, в идеале планируется использовать CRDBGrid для фильтрации и поиска. Одна проблема: данные в логе могут отображаться довольно часто, что как раз и усложняет дело. Если грид обновлять по горячей клавише, то до такого обновления не известно, появились ли новые записи. А если обновлять постоянно (к примеру при добавлении новой записи в таблицу или по таймеру) - навигация по гриду станет практически невозможной, потому что курсор постоянно будет улетать на последнюю запись. Хотелось бы, чтобы текущие отображаемые записи не менялись (не скроллились) при добавлении новых записей в конец лога, если же среди отображаемых записей присутствует последняя запись в таблице - лог должен скроллиться к последней записи (собственно, как это работает по умолчанию с гридами). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2020, 15:54 |
|
||
|
Просмотр постоянно обновляемой таблицы логов
|
|||
|---|---|---|---|
|
#18+
Используй простой TStringGrid. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2020, 16:03 |
|
||
|
Просмотр постоянно обновляемой таблицы логов
|
|||
|---|---|---|---|
|
#18+
Это же фактически написать свой DBGrid с нуля ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2020, 16:22 |
|
||
|
Просмотр постоянно обновляемой таблицы логов
|
|||
|---|---|---|---|
|
#18+
vdix, StringGrid и DBGrid - разные и нефиг DBGrid эмулировать ибо DBGrid и скорость не совместимы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2020, 16:32 |
|
||
|
Просмотр постоянно обновляемой таблицы логов
|
|||
|---|---|---|---|
|
#18+
vdixЭто же фактически написать свой DBGrid с нуля Нет, с нуля придётся только написать систему для рассылки новых записей лога. А сами гриды совершено одинаковые. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2020, 16:35 |
|
||
|
Просмотр постоянно обновляемой таблицы логов
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov А сами гриды совершено одинаковые. cell[0,100] вместо вызова Next 100 раз - это "немного" по разному. ;) А то что в DBGrid редактировать можно только текущую выделенную запись вообще делает невозможным работу юзера с активным логом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2020, 16:38 |
|
||
|
Просмотр постоянно обновляемой таблицы логов
|
|||
|---|---|---|---|
|
#18+
Да там соStringGrid тоже будет заморочек. К примеру если в таблице лога будет 100к записей (а то и 1кк и больше), StringGrid в памяти будет занимать немало. И если в DBGrid можно делать "top 1000" чтобы отображать только 1000 последних записей, то в StringGrid аналогичная функция фактически будет означать полный рефреш грида при каждом добавлении строки / обновлении датасета, ведь есть же ещё фильтрация (типа where logmessage like '%test%'). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2020, 17:01 |
|
||
|
Просмотр постоянно обновляемой таблицы логов
|
|||
|---|---|---|---|
|
#18+
vdix И если в DBGrid можно делать "top 1000" чтобы отображать только 1000 последних записей, то в StringGrid аналогичная функция фактически будет означать полный рефреш грида при каждом добавлении строки / обновлении датасета ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2020, 17:18 |
|
||
|
Просмотр постоянно обновляемой таблицы логов
|
|||
|---|---|---|---|
|
#18+
vdixК примеру если в таблице лога будет 100к записей (а то и 1кк и больше), StringGrid в памяти будет занимать немало. Ну давай посчитаем. Если строка лога 50 символов, то 1кк строк займут 50 мегабайт. Да, немало, но у меня страничка дискорда в браузере занимает на порядок больше. В чём проблема? Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2020, 17:21 |
|
||
|
Просмотр постоянно обновляемой таблицы логов
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, И кто бы мне ответил, зачем юзеру видеть одновременно 100к-1кк записей лога? Это такая игра в "веселый скроллинг"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2020, 17:23 |
|
||
|
Просмотр постоянно обновляемой таблицы логов
|
|||
|---|---|---|---|
|
#18+
Достаточно знать количество записей и текущую отображаемую позицию. Отображать - в "виртуальном" режиме, только то, что грид "хочет показать", для этого вовсе не надо тянуть все данные - нужны только отображаемые. Тупо используем TVirtualStringTree. Или хоть даже TDBGrid с идентификаторами в датасете, данные в "виртуальных" полях отображать по событию OnGetText, с промежуточным кэшированием. Сортировку и фильтрацию - естественно, средствами сервера (или что там у ТС), тупо получаем поток id's. ... Непонятно, что делать с "набИгабщем" в рилтайме потоком данных лога, неудобно же. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2020, 17:26 |
|
||
|
Просмотр постоянно обновляемой таблицы логов
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, не всё так просто. Если бы в лог заносилось 50 символов... А мне вот для отладки туда нужно заносить JSON и XML, это около 1-3 кб. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2020, 17:28 |
|
||
|
Просмотр постоянно обновляемой таблицы логов
|
|||
|---|---|---|---|
|
#18+
ъъъъъНепонятно, что делать с "набИгабщем" в рилтайме потоком данных лога, неудобно же. Посмотри любой голливудский фильм про хацкеров. Там всюду по шесть консолек на экране и в каждом - "набигаиций" поток лога от ping 127.0.0.1. И ничего, справляются с хаком пентагона. Думаешь, у аффтара пользователи глупее?.. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2020, 17:30 |
|
||
|
Просмотр постоянно обновляемой таблицы логов
|
|||
|---|---|---|---|
|
#18+
vdixне всё так просто. Если бы в лог заносилось 50 символов... А мне вот для отладки туда нужно заносить JSON и XML, это около 1-3 кб. Тогда идеальным вариантом для тебя будет TDrawGrid и кольцевой буфер. У первого переменная высота ячеек позволяет показать текст любого размера, у второго добавление новой строки и удаление старой - O(1). Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2020, 17:48 |
|
||
|
Просмотр постоянно обновляемой таблицы логов
|
|||
|---|---|---|---|
|
#18+
rgreatcell[0,100] вместо вызова Next 100 раз - это "немного" по разному. ;) А то что в DBGrid редактировать можно только текущую выделенную запись вообще делает невозможным работу юзера с активным логом. Memory DataSet (например TMemTableEh от EhLib) позволяет обращаться к любой записи без навигации, более того менять в этой записи данные, добавлять новые. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2020, 17:50 |
|
||
|
Просмотр постоянно обновляемой таблицы логов
|
|||
|---|---|---|---|
|
#18+
ъъъъъ Непонятно, что делать с "набИгабщем" в рилтайме потоком данных лога, неудобно же. Да кнопочку Autoscroll как в ProcMon'e. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2020, 17:56 |
|
||
|
Просмотр постоянно обновляемой таблицы логов
|
|||
|---|---|---|---|
|
#18+
istrebitel, Это отлично. Но это уже совсем нестандартный dataset. Кстати, а как в этом случае Grid Узнает что поменялась не текущая запись? Или там при доступе к Value по номеру идет скрытая навигация стандартными методами TDataSet? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2020, 17:57 |
|
||
|
Просмотр постоянно обновляемой таблицы логов
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov Помимо прочего, это сильно фрагментацию памяти уменьшает (если критично). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2020, 18:02 |
|
||
|
Просмотр постоянно обновляемой таблицы логов
|
|||
|---|---|---|---|
|
#18+
rgreat Кстати, а как в этом случае Grid Узнает что поменялась не текущая запись? Или там при доступе к Value по номеру идет скрытая навигация стандартными методами TDataSet? Через рассылку deDataSetChange, к датасету можно привязать сколь угодно гридов и при изменении данных в любом они обновятся во всех остальных. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Доступ к данным каждый грид реализует по своему. В MemTableEh есть несколько способов Для быстрого получения значения из конкретной записи без активизации события об изменении в MemTableEh, можно использовать несколько способов: - Использовать методы DisableControls, EnableControls для деактивизации событий об изменениях в DataSet’е. Недостаток этого способа в том, что EnableControls вызывает событие об изменении DataSet’а, что приведет к перерисовке визуальных компонент подключенных к DataSet’у. - Использовать методы InstantReadEnter, InstantReadLeave для перехода в режим InstantRead. InstantReadEnter входит в режим просмотра записей и переходит на запись в DataSet’е, определенную параметром RowNum. После этого можно читать значения записи. Каждому вызову метода InstantReadEnter, должен соответствовать вызов InstantReadLeave для выхода из режима чтения записей. В режиме InstantRead нельзя менять значения полей записи. Методы InstantReadEnter, InstantReadLeave не посылают события об изменении позиции записи внешним компонентам. - Использовать свойства для доступа к внутренним объектам хранения данных. Внутренние объекты позволяют иметь доступ к значениям записей как к массиву данных по индексу. Кроме того, можно обратится ко всем записям внутреннего массива данных без учета локального фильтра. Для доступа к внутренним структурам данных используйте следующие свойства объекта TMemTableEh: RecordsView: TRecordsViewEh Ссылка на отфильтрованный список записей. RecordsView.Rec[Index: Integer]: TMemoryRecordEh Доступ к конкретной записи в массиве отфильтрованных значений. RecordsView.Count: Integer Количество записей в отфильтрованном списке. В режиме TreeView учитываются только раскрытые ветви. RecordsView.MemTableData.RecordsList[Index: Integer]: TMemoryRecordEh Доступ к конкретной записи в массиве всех записей. RecordsView.MemTableData.RecordsList.Count Количество записей в списке всех записей. RecordsView.MemTableData.RecordsList[Index: Integer].DataValues[const FieldNames: string; DataValueVersion: TDataValueVersionEh]: Variant Доступ к значению поля или полей в записи с номером Index. Кроме того в любом датасете можно побегать по записям без рассылки сообщений. 22114014 Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Этот метод сами гриды используют в процессе отрисовки себя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2020, 18:22 |
|
||
|
Просмотр постоянно обновляемой таблицы логов
|
|||
|---|---|---|---|
|
#18+
rgreat Dimitry Sibiryakov, И кто бы мне ответил, зачем юзеру видеть одновременно 100к-1кк записей лога? Это такая игра в "веселый скроллинг"? а тебе никто ничего не ответит - не до тебя и твоих забот им ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2020, 19:29 |
|
||
|
Просмотр постоянно обновляемой таблицы логов
|
|||
|---|---|---|---|
|
#18+
vdix, Пиши лог в файл. Дешево и сердито. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2020, 19:55 |
|
||
|
Просмотр постоянно обновляемой таблицы логов
|
|||
|---|---|---|---|
|
#18+
CxGrid подойдёт. Большие Blob поля подтаскивай по мере надобности отдельными процедурами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2020, 20:46 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=40010240&tid=2037915]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
186ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
33ms |
get tp. blocked users: |
1ms |
| others: | 240ms |
| total: | 498ms |

| 0 / 0 |
