Как нарисовать HTML Table средствами Delphi

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

Зверски извращенное решение: где-то когда-то была программа (специально для людей, сидящих с модемов), которая сохраняла хтмл-файл как bmp, чтобы можно было его оффлайн просматривать. Можно работать по такому же принципу: "сфотографировать" эту таблицу и гонять картинку туда-сюда
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Аватара пользователя
SergeyS
Сообщения: 196
Зарегистрирован: 21 ноя 2006, 17:12
Откуда: Хакасия, Абакан
Контактная информация:

Использовал я подобное решение как-то, и всё было бы хорошо если не одно "но": когда размер таблицы стал ОЧЕНЬ большим, соответственно стала ОЧЕНЬ большой и картинка (а это как вы понимаете был bmp) и памяти на компьютере стало ОЧЕНЬ мало :(
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

Мнэээ... а программно перегнать в какой-нибудь сжатый формат? Гиф какой-нибудь?
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Аватара пользователя
SergeyS
Сообщения: 196
Зарегистрирован: 21 ноя 2006, 17:12
Откуда: Хакасия, Абакан
Контактная информация:

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

Нужно грамотно определять видимую область таблицы и отрисовывать только её. Один из способов хранения дискретных данных в памяти, это создание списков объектов (строк, ячеек), например: строка1, строка2, строка10, строка11; между строкой 2 и строкой 10 должны быть отображены строки 3, 4, 5, 6, 7, 8 и 9. Так вот, если строка или ячейка не определены, то их можно отрисовывать как строки и ячейки по умолчанию (DefaultRow, DefaultCell). Также мы должны хранить индекс самой верхней видимой строки таблицы и отрисовывать таблицу начиная с этой строки и заканчивать отрисовку последней видимой строкой. Такая последовательность действий даёт постоянную скорость отрисовки таблицы в не зависимости от её размеров. Все это у меня уже реализовано.

И вот тут-то и возникли первые трудности: если в первой видимой строке присутствует ячейка (назовём её B1) принадлежащая строке находящейся выше (например rowspan=3), то мне нужно определить это место, пропустить отрисовку ячеек перекрываемых ячейкой B1, а потом ещё отрисовать её саму.
Единственным выходом я пока вижу это ведение списка, содержащего указатели на строки перекрывающие текущую строку (если ячейка перекрывает 10 строк, то для всех 10-ти строк будет существовать отдельный список содержащий перекрывающую строку).

Боюсь объяснение получилось масло-масленое, но надеюсь что всё-же моя мысль стала более понятной

И ещё напомню суть вопроса, а то он размылся за всеми этими рассуждениями:
Какие есть эффективные способы отрисовки дискретных таблиц с объединёнными ячейками.

Кстати, электронные таблицы в Excel реализованы гораздо грамотнее электронных таблиц 1C используемых в отчётах. Так например отчёт содержащий более 1000 строк начинает вызывать очень долгую перерисовку всей таблицы, что очень заметно на глаз, да и вся таблица начинает откровенно тормозить.
Ответить