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

Мнэээ... а программно перегнать в какой-нибудь сжатый формат? Гиф какой-нибудь?
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
- 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 строк начинает вызывать очень долгую перерисовку всей таблицы, что очень заметно на глаз, да и вся таблица начинает откровенно тормозить.
Тем паче, что если таблица будет меняться во времени, то и отрисовывать картинку придётся полностью.
Нужно грамотно определять видимую область таблицы и отрисовывать только её. Один из способов хранения дискретных данных в памяти, это создание списков объектов (строк, ячеек), например: строка1, строка2, строка10, строка11; между строкой 2 и строкой 10 должны быть отображены строки 3, 4, 5, 6, 7, 8 и 9. Так вот, если строка или ячейка не определены, то их можно отрисовывать как строки и ячейки по умолчанию (DefaultRow, DefaultCell). Также мы должны хранить индекс самой верхней видимой строки таблицы и отрисовывать таблицу начиная с этой строки и заканчивать отрисовку последней видимой строкой. Такая последовательность действий даёт постоянную скорость отрисовки таблицы в не зависимости от её размеров. Все это у меня уже реализовано.
И вот тут-то и возникли первые трудности: если в первой видимой строке присутствует ячейка (назовём её B1) принадлежащая строке находящейся выше (например rowspan=3), то мне нужно определить это место, пропустить отрисовку ячеек перекрываемых ячейкой B1, а потом ещё отрисовать её саму.
Единственным выходом я пока вижу это ведение списка, содержащего указатели на строки перекрывающие текущую строку (если ячейка перекрывает 10 строк, то для всех 10-ти строк будет существовать отдельный список содержащий перекрывающую строку).
Боюсь объяснение получилось масло-масленое, но надеюсь что всё-же моя мысль стала более понятной
И ещё напомню суть вопроса, а то он размылся за всеми этими рассуждениями:
Какие есть эффективные способы отрисовки дискретных таблиц с объединёнными ячейками.
Кстати, электронные таблицы в Excel реализованы гораздо грамотнее электронных таблиц 1C используемых в отчётах. Так например отчёт содержащий более 1000 строк начинает вызывать очень долгую перерисовку всей таблицы, что очень заметно на глаз, да и вся таблица начинает откровенно тормозить.