Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > ОС и железо
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 09.04.2015, 23:18
M1ndAction M1ndAction вне форума
Прохожий
 
Регистрация: 05.09.2010
Сообщения: 13
Репутация: 10
По умолчанию Обойти ограничение на Top в 32767 пикселей

Приветствую!

Как можно обойти проблему максимальных координат элементов в 32767 пикселей? То есть то, что, к примеру, свойство Top элементов управления не может превышать значение в 32767.
В целом, задача следующая. Необходимо выводить данные в табличном виде, много данных Скажем, может быть свыше 2000 строк в таблице. Все эти данные выводятся в таблице, сделанной на базе TStringGrid. В ячейках есть выпадающие списки, радиокнопки. Вот это все, как раз таки, и перестает работать на высотах свыше 32767. Но это все частности, суть, думаю, везде одинаковая.
Насколько я понимаю, необходимо сместить систему координат (примерно, как это происходит при наличии ScrollBar), то есть, чтобы значения, свыше 32767 воспринимались, как меньшие.
В процессе поиска информации по данному вопросу, мне в связи с этим встречалось упоминание процедуры TranslateTransform. Как ее в этом случае можно (и нужно ли вообще) использовать?
Или будут какие другие варианты решения проблемы?
P.S. Проблема эта распространена, часто встречаются обсуждения, но решения я так и не увидел. Другой взгляд на эту проблему (если мне не удалось толком объяснить) можно посмотреть здесь: http://stackoverflow.com/questions/8...767-size-limit и https://social.msdn.microsoft.com/Fo...ntroltop-32767
Ответить с цитированием
  #2  
Старый 09.04.2015, 23:26
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

"магическое" число 32767 (в двоичной 0111111111111111) есть максимальное значение целого знакового двубайтового. Если большая высота "не работает", то скорее всего где-то в винде используется целый двубайтовый тип для указания высоты. Это так просто не обойти, мне кажется.
Можно попробовать сделать свой компонент, который будет выводить данные частями по мере прокрутки и перерисовывать прямо на месте, тогда такие огромные высоты не понадобятся.
Хотя может в каких-то компонентах эта логика уже реализована, не знаю.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 09.04.2015 в 23:29.
Ответить с цитированием
  #3  
Старый 09.04.2015, 23:33
M1ndAction M1ndAction вне форума
Прохожий
 
Регистрация: 05.09.2010
Сообщения: 13
Репутация: 10
По умолчанию

Цитата:
Сообщение от Bargest
"магическое" число 32767 (в двоичной 0111111111111111) есть максимальное значение целого знакового двубайтового. Если большая высота "не работает", то скорее всего где-то в винде используется целый двубайтовый тип для указания высоты. Это так просто не обойти, мне кажется.
Можно попробовать сделать свой компонент, который будет подргужать данные частями по мере прокрутки и обновлять прямо на месте, тогда такие огромные высоты не понадобятся.
Да, совершенно, верно, число непростое Это завязано на сообщениях, где, как раз, этот самый параметр передается как двухбайтовое число, поэтому, все, что больше, обрезается. Это, похоже, еще идет с Windows 9x. Понятно, что в подавляющем большинстве случаев этого достаточно, но бывают и исключения, как раз, как в моей ситуации.
Ответить с цитированием
  #4  
Старый 09.04.2015, 23:39
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Ну я в готовых компонентах не силен, потому подождем ответа от кого-нибудь, кто знает о таких компонентах.
Если не будет ответа, можно сделать как я говорил: сделать grid на 2 строки больше, чем область вывода, по положению ScrollBar'а определять номера строк, которые надо подгрузить из массива, и писать их туда, сдвигая grid на нужный коэффициент вверх/вниз для иллюзии плавной прокрутки. По идеи мерцать при отрисовке не должно, особенно с дабл-буфером, хотя не знаю. Делал нечто подобное, когда писал свой memo с подсветкой синтаксиса, только сдвигал на +/- одну строку не само окно отрисовки, а только координаты начала рисования текста.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #5  
Старый 10.04.2015, 00:07
Аватар для Freeman
Freeman Freeman вне форума
Местный
 
Регистрация: 05.10.2012
Адрес: Санкт-Петербург
Сообщения: 577
Версия Delphi: 6
Репутация: выкл
По умолчанию

Цитата:
Сообщение от M1ndAction
Это завязано на сообщениях, где, как раз, этот самый параметр передается как двухбайтовое число, поэтому, все, что больше, обрезается. Это, похоже, еще идет с Windows 9x.
Как это? Не может этого быть. Именно с Windows 95 WParam имеет размер LongInt, 16-битный WParam остался в Windows 3.x. Название менять не стали.

Так что у вас, скорее всего, где-то в расчетах глюк, или вы сами неверный тип где-то используете.
__________________
Не стоит путать форумы с богадельнями. © Bargest
Ответить с цитированием
  #6  
Старый 10.04.2015, 01:23
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

На МСДН написано, что
Цитата:
Although the width and height of a window are 32-bit values, the lParam parameter contains only the low-order 16 bits of each.
Потому что они пакуют 2 параметра в один 4-байтовый lparam, видимо.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #7  
Старый 10.04.2015, 01:33
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,068
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Посмотри на DevExpress'овский грид. У них полностью кастомная отрисовка и нативная (своя) вставка контролов в ячейки.
Ответить с цитированием
  #8  
Старый 10.04.2015, 02:13
Аватар для Freeman
Freeman Freeman вне форума
Местный
 
Регистрация: 05.10.2012
Адрес: Санкт-Петербург
Сообщения: 577
Версия Delphi: 6
Репутация: выкл
По умолчанию

Цитата:
Сообщение от Bargest
Потому что они пакуют 2 параметра в один 4-байтовый lparam, видимо.
На самом деле при перемещении окна отправляется WM_MOVE, но не суть важно, поскольку там тоже упакованные 16-битные X и Y передаются. Так что да, я был неправ.
__________________
Не стоит путать форумы с богадельнями. © Bargest
Ответить с цитированием
  #9  
Старый 10.04.2015, 09:18
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

WinAPI — зло.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #10  
Старый 10.04.2015, 09:51
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

проблема не в том, что для позиционирования элементов не хватает 16 бит, а в самом подходе. вовсе не обязательно создавать элементы для каждой строки. достаточно только для тех, которые в данный момент видимы на экране. естественно, что их позиция не может превышать размеров экрана.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #11  
Старый 12.04.2015, 10:51
M1ndAction M1ndAction вне форума
Прохожий
 
Регистрация: 05.09.2010
Сообщения: 13
Репутация: 10
По умолчанию

Всем спасибо за ответы. В итоге, вопрос решил не в лоб, а более правильно - когда понял, что иного выхода нет, доработал программу таким образом, что удалось включить прокрутку в самой таблице и, соответственно, уменьшить высоту таблицы в пределах формы. Сразу это делать не стал, так как таблица связана с другими элементами управления, и казалось, что нужны будут слишком глобальные изменения, но на деле все оказалось не так страшно
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 06:31.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter