powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Просмотр постоянно обновляемой таблицы логов
23 сообщений из 23, страница 1 из 1
Просмотр постоянно обновляемой таблицы логов
    #40010181
vdix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Коллеги, такой вопрос. Нужно вести лог с большим количеством записываемых данных и отображать их визуально в гриде, в идеале планируется использовать CRDBGrid для фильтрации и поиска. Одна проблема: данные в логе могут отображаться довольно часто, что как раз и усложняет дело. Если грид обновлять по горячей клавише, то до такого обновления не известно, появились ли новые записи. А если обновлять постоянно (к примеру при добавлении новой записи в таблицу или по таймеру) - навигация по гриду станет практически невозможной, потому что курсор постоянно будет улетать на последнюю запись. Хотелось бы, чтобы текущие отображаемые записи не менялись (не скроллились) при добавлении новых записей в конец лога, если же среди отображаемых записей присутствует последняя запись в таблице - лог должен скроллиться к последней записи (собственно, как это работает по умолчанию с гридами).
...
Рейтинг: 0 / 0
Просмотр постоянно обновляемой таблицы логов
    #40010187
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Используй простой TStringGrid.
...
Рейтинг: 0 / 0
Просмотр постоянно обновляемой таблицы логов
    #40010193
vdix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это же фактически написать свой DBGrid с нуля
...
Рейтинг: 0 / 0
Просмотр постоянно обновляемой таблицы логов
    #40010202
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vdix,

StringGrid и DBGrid - разные и нефиг DBGrid эмулировать ибо DBGrid и скорость не совместимы.
...
Рейтинг: 0 / 0
Просмотр постоянно обновляемой таблицы логов
    #40010206
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vdixЭто же фактически написать свой DBGrid с нуля

Нет, с нуля придётся только написать систему для рассылки новых записей лога. А сами гриды
совершено одинаковые.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Просмотр постоянно обновляемой таблицы логов
    #40010209
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
А сами гриды
совершено одинаковые.

cell[0,100] вместо вызова Next 100 раз - это "немного" по разному. ;)

А то что в DBGrid редактировать можно только текущую выделенную запись вообще делает невозможным работу юзера с активным логом.
...
Рейтинг: 0 / 0
Просмотр постоянно обновляемой таблицы логов
    #40010224
vdix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да там соStringGrid тоже будет заморочек. К примеру если в таблице лога будет 100к записей (а то и 1кк и больше), StringGrid в памяти будет занимать немало. И если в DBGrid можно делать "top 1000" чтобы отображать только 1000 последних записей, то в StringGrid аналогичная функция фактически будет означать полный рефреш грида при каждом добавлении строки / обновлении датасета, ведь есть же ещё фильтрация (типа where logmessage like '%test%').
...
Рейтинг: 0 / 0
Просмотр постоянно обновляемой таблицы логов
    #40010232
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vdix
И если в DBGrid можно делать "top 1000" чтобы отображать только 1000 последних записей, то в StringGrid аналогичная функция фактически будет означать полный рефреш грида при каждом добавлении строки / обновлении датасета
А ты так не делай. Примени мозг и сделай по другому.
...
Рейтинг: 0 / 0
Просмотр постоянно обновляемой таблицы логов
    #40010234
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vdixК примеру если в таблице лога будет 100к записей (а то и 1кк и больше), StringGrid в
памяти будет занимать немало.

Ну давай посчитаем. Если строка лога 50 символов, то 1кк строк займут 50 мегабайт. Да,
немало, но у меня страничка дискорда в браузере занимает на порядок больше. В чём проблема?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Просмотр постоянно обновляемой таблицы логов
    #40010237
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

И кто бы мне ответил, зачем юзеру видеть одновременно 100к-1кк записей лога?

Это такая игра в "веселый скроллинг"?
...
Рейтинг: 0 / 0
Просмотр постоянно обновляемой таблицы логов
    #40010238
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Достаточно знать количество записей и текущую отображаемую позицию.
Отображать - в "виртуальном" режиме, только то, что грид "хочет показать", для этого вовсе не надо тянуть все данные - нужны только отображаемые.
Тупо используем TVirtualStringTree.
Или хоть даже TDBGrid с идентификаторами в датасете, данные в "виртуальных" полях отображать по событию OnGetText, с промежуточным кэшированием. Сортировку и фильтрацию - естественно, средствами сервера (или что там у ТС), тупо получаем поток id's.
...
Непонятно, что делать с "набИгабщем"
в рилтайме потоком данных лога, неудобно же.
...
Рейтинг: 0 / 0
Просмотр постоянно обновляемой таблицы логов
    #40010240
vdix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov, не всё так просто. Если бы в лог заносилось 50 символов... А мне вот для отладки туда нужно заносить JSON и XML, это около 1-3 кб.
...
Рейтинг: 0 / 0
Просмотр постоянно обновляемой таблицы логов
    #40010242
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъНепонятно, что делать с "набИгабщем"
в рилтайме потоком данных лога, неудобно же.

Посмотри любой голливудский фильм про хацкеров. Там всюду по шесть консолек на экране и в
каждом - "набигаиций" поток лога от ping 127.0.0.1. И ничего, справляются с хаком
пентагона. Думаешь, у аффтара пользователи глупее?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Просмотр постоянно обновляемой таблицы логов
    #40010257
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vdixне всё так просто. Если бы в лог заносилось 50 символов... А мне вот для отладки туда
нужно заносить JSON и XML, это около 1-3 кб.
Тогда идеальным вариантом для тебя будет TDrawGrid и кольцевой буфер. У первого
переменная высота ячеек позволяет показать текст любого размера, у второго добавление
новой строки и удаление старой - O(1).
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Просмотр постоянно обновляемой таблицы логов
    #40010259
istrebitel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rgreatcell[0,100] вместо вызова Next 100 раз - это "немного" по разному. ;)

А то что в DBGrid редактировать можно только текущую выделенную запись вообще делает невозможным работу юзера с активным логом.
Memory DataSet (например TMemTableEh от EhLib) позволяет обращаться к любой записи без навигации,
более того менять в этой записи данные, добавлять новые.
...
Рейтинг: 0 / 0
Просмотр постоянно обновляемой таблицы логов
    #40010261
istrebitel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ъъъъъ

Непонятно, что делать с "набИгабщем"
в рилтайме потоком данных лога, неудобно же.

Да кнопочку Autoscroll как в ProcMon'e.
...
Рейтинг: 0 / 0
Просмотр постоянно обновляемой таблицы логов
    #40010262
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
istrebitel,

Это отлично. Но это уже совсем нестандартный dataset.

Кстати, а как в этом случае Grid Узнает что поменялась не текущая запись?

Или там при доступе к Value по номеру идет скрытая навигация стандартными методами TDataSet?
...
Рейтинг: 0 / 0
Просмотр постоянно обновляемой таблицы логов
    #40010263
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Тогда идеальным вариантом для тебя будет TDrawGrid[/quote] Помнится, в похожей задаче я так и делал - один TDrawGrid для разных типов логов.
Помимо прочего, это сильно фрагментацию памяти уменьшает (если критично).
...
Рейтинг: 0 / 0
Просмотр постоянно обновляемой таблицы логов
    #40010267
istrebitel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rgreat

Кстати, а как в этом случае Grid Узнает что поменялась не текущая запись?

Или там при доступе к Value по номеру идет скрытая навигация стандартными методами TDataSet?

Через рассылку deDataSetChange, к датасету можно привязать сколь угодно гридов и при изменении данных в любом они обновятся во всех остальных.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
main.TForm1.DataSource1DataChange($17A7A20,nil)
Data.DB.TDataSource.DataEvent(???,???)
Data.DB.TDataSet.DataEvent(deDataSetChange,0)
MemTableEh.TCustomMemTableEh.DataEvent(deDataSetChange,0)
Data.DB.TDataSet.Resync([])
MemTableEh.TCustomMemTableEh.Resync([])
MemTableEh.TCustomMemTableEh.ViewDataEvent($1806458,3,rlnRecAddedEh)
MemTableDataEh.TRecordsViewEh.Notify($1806458,3,rlnRecAddedEh)
MemTableDataEh.TRecordsViewEh.DataEvent($1806458,3,rlnRecAddedEh)
MemTableDataEh.TMemTableDataEh.Notify($1806458,3,rlnRecAddedEh)
MemTableDataEh.TRecordsListEh.Notify($1806458,3,rlnRecAddedEh)
MemTableDataEh.TRecordsListEh.AddInsertRecord($1806458,-1,True,False)
MemTableDataEh.TRecordsListEh.AddRecord($1806458)
MemTableDataEh.TRecordsViewEh.AddRecord($1806458)
main.TForm1.Button1Click($1765950)



Доступ к данным каждый грид реализует по своему. В 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.
TMyDataLink = class(TDataLink)

 end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FMyDataLink := TMyDataLink.Create;
  FMyDataLink.DataSource := DataSource1;
end;

procedure TForm1.ToolButton1Click(Sender: TObject);
begin
  FMyDataLink.ActiveRecord := FMyDataLink.ActiveRecord + 1;
end;


Этот метод сами гриды используют в процессе отрисовки себя.
...
Рейтинг: 0 / 0
Просмотр постоянно обновляемой таблицы логов
    #40010294
MaratIsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
Dimitry Sibiryakov,

И кто бы мне ответил, зачем юзеру видеть одновременно 100к-1кк записей лога?

Это такая игра в "веселый скроллинг"?


а тебе никто ничего не ответит - не до тебя и твоих забот им
...
Рейтинг: 0 / 0
Просмотр постоянно обновляемой таблицы логов
    #40010305
Фотография Maxim Rusov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vdix,

Пиши лог в файл. Дешево и сердито.
...
Рейтинг: 0 / 0
Просмотр постоянно обновляемой таблицы логов
    #40010329
Mixrud
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
CxGrid подойдёт.
Большие Blob поля подтаскивай по мере надобности отдельными процедурами.
...
Рейтинг: 0 / 0
Просмотр постоянно обновляемой таблицы логов
    #40010411
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
это уже совсем нестандартный dataset
cds в клоны умеет
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Просмотр постоянно обновляемой таблицы логов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]