Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
Практикантроп
4827 / 2719 / 526
Регистрация: 23.09.2011
Сообщений: 5,778
1

Сколько же реально ячеек в StringGrid ?

25.07.2013, 10:58. Показов 791. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Раньше как-то не обращал внимания на особенности адресации внутри массивов; и вот на днях поднял тему про структуру байтовых массивов во временной памяти (ссылка). И вот снова столкнулся с парадоксальной для меня ситуацией... - кладу на форму компонент StringGrid из Боландовского набора. Казалось бы, его структура уже определена размерностью по умолчанию: 5х5 ячеек и по одной фиксированной колонке и строке. Теперь пробую записать произвольное число в несуществующую (.. я так думал) ячейку; и тут же считать из этой ячейки с размещением результата на форме... . Пишет и читает! Причем странности опять-таки связаны с магическим числом 2 в 20 степени, - если номер ячейки превышает это число (0хFFFFF и неважно, колонка это или столбец, или и то и другое), то ошибки не показывает, но вместо записанного числа возвращает пустоту. Если номер ячейки меньше 1048560 (0х100000-0х10), то возвращает правильное число. И только в диапазоне 16-и значений (0xFFFF0...0xFFFFF) вырабатывает исключение (Access Violation). Поверить, что создавая табличку Билдер резервирует в памяти мегабайт, мне сложно. Но ведь записанное число читается верно! Что это - проделки компилятора или какая-то непостижимая для меня мудрость создателей?

Добавлено через 15 минут
Цитата Сообщение от nick42 Посмотреть сообщение
Поверить, что создавая табличку Билдер резервирует в памяти мегабайт, мне сложно.
... но пришлось. Действительно: при записи в околомиллионную ячейку размер программы по мнению Диспетчера задач увеличился на 1 мегабайт, что опять-таки не добавило ясности... - одного байта для адресации начала строки (ячейки) явно недостаточно; кроме того размер увеличился после записи в ячейку, у которой околомиллионный номер И СТОЛБЦА, И СТРОКИ.
1
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.07.2013, 10:58
Ответы с готовыми решениями:

StringGrid Цвет фона пустых ячеек и ячеек с текстом
Доброго дня.. Задачка следующая: Ячейки в StringGrid'e заполняются по блоку из Timer. В...

Возможность вручную писать данные в ячейки StringGrid и заполнение ячеек StringGrid данными из файла после нажатия кнопки
Здравствуйте! Помогите, пожалуйста. Мне необходимо сделать следующее: реализовать возможность...

Выделить программно массив ячеек в datagridview реально?
Выделить программно массив ячеек в datagridview реально, или хотя бы диапазон ячеек? SelectedСells...

StringGrid выравнивание записей в 1 столбе из 6 по левой стороне, реально ?
У меня есть таблица из 6 колонок, мне нужно записи 3 колонки выравнять по левой стороне ячейки,...

2
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32836 / 21173 / 8148
Регистрация: 22.10.2011
Сообщений: 36,433
Записей в блоге: 8
25.07.2013, 11:42 2
В реализации Грида сам черт ногу сломит. Единственное, что ясно - это то, что в ней (в реализации, я имею в виду), используются Sparse Lists, то есть, разреженные списки. Существует также ограничение (файл Grids.pas):
Delphi
1
2
const
  MaxGridSize = MaxInt div 16;
(то есть, 134217727), смысл которого от меня ускользает. Запросто
Delphi
1
2
3
4
5
procedure TForm1.Button1Click(Sender: TObject);
begin
  StringGrid4.Cells[2 * MaxGridSize, 2] := 'test';
  ShowMessage(StringGrid4.Cells[2 * MaxGridSize, 2]);
end;
выдает мне этот же самый 'test'... Единственное, что приходит на ум - это, когда к sparse list-у добавляются еще элементы, и вот их количество выходит за пределы MaxGridSize - тогда должно выбрасываться исключение с текстом SGridTooLarge. То есть, если последовательно заполнять все ячейки грида - то на 134217728-ой должно вылететь исключение.
2
Практикантроп
4827 / 2719 / 526
Регистрация: 23.09.2011
Сообщений: 5,778
25.07.2013, 11:58  [ТС] 3
Действительно; много странностей. Если пытаюсь читать из любой (кроме "запретных") ячейки, то размер программы в памяти не меняется. Увеличивается он лишь при записи в ячейку. И я пока не могу логически увязать размерность сетки и размер увеличения памяти. Вот если записываю в миллионную ячейку миллионного столбца - прирост около мегабайта; а если столбец уменьшаю до 0-го - то прирост вдвое меньше. То-есть в памяти после таких действий создается какая-то матрица, но по какому принципу - непонятно.
1
25.07.2013, 11:58
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.07.2013, 11:58
Помогаю со студенческими работами здесь

Сколько сайтов реально оптимизировать
Люди, поделитесь опытом. Кто сколько сайтов в одиночку реально успевает оптимизировать и продвигать...

ПК за сколько реально возможно продать?
Мат.плата: Asus M5A97 LE R2.0 ЦП: FX 6300 (tm) Six (3,5 Ghz) Видео: MSI Gaming R9 270x 2R DDR5...

Сколько запросов реально поднять?
Сейчас продвигаю сайт по 11 (от 1000 до 4000 поисков) обсолютно разным запросам, конкуренция...

Сколько реально памяти на моей 8600GT?
На моей 8600GT маркировка 256мб, вGPU-Z, Рива Тюнер и ещё в некоторых прогах тоже самое. Но в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru