Преодолеть ограничения TImage Control
Я использую элемент управления TImage внутри элемента управления TScrollBox в Delphi 4. Здесь я заполняю данные в элементе управления TImage, соответственно увеличивая высоту.
Моя функциональность основана на событии mousedown, где я использую параметры X, Y, чтобы сделать некоторые проверки с выделением этой записи.
Теперь проблема здесь в том, что X, Y являются параметрами целочисленного типа, и они возвращают значения в диапазоне от -32768 до 32767. Я сталкиваюсь с проблемами, когда мои записи превышают 32767 высоту. Событие Mousedown возвращает значение Y, так как отрицательное значение вызывает проблемы с моей функциональностью.
Есть 2 возможных способа решения этой проблемы,
Любой способ обойти эту проблему.
Использование другого встроенного компонента Delphi 4 в качестве замены.
Я знаю один грязный подход (может быть, это тоже не правильно, но работает на данный момент), как упомянуто ниже, но я ищу лучшее решение.
if Y < 0 then
begin
Y := Y + 65536;
end
else
begin
if ScrollBox1.VertScrollBar.Position > 32767 then
Y := Y + 65536;
end;
Пожалуйста, посоветуйте лучшее решение этой проблемы
2 ответа
Есть третий способ ее решения. Прекратите использовать Scrollbox и напишите свой собственный элемент управления с его собственными ручками полосы прокрутки, которые могут отображать часть изображения в координатах X,Y, указанных вами. Фактически вы могли бы сделать это, добавив полосы прокрутки к любому простому компоненту на основе TControl, написанному вами; если вы будете настаивать на использовании встроенного элемента управления в Delphi, вы на самом деле будете делать что-то нелепое. Написание собственного элемента управления может быть сделано в несколько строк кода, и это правильный ответ, если вы не хотите использовать сторонние элементы управления.
Вторая альтернатива, а на самом деле решение, которое выбрали бы 99% разработчиков Delphi, - это переключение на сторонний элемент управления для просмотра изображений, который уже обладает этой функциональностью. Очевидно, нет смысла изобретать велосипед. Похоже, ваш вопрос предусматривает, что вы не можете добавить сторонний контроль.
Scrollboxes + TImage - ужасное решение с точки зрения производительности, особенно когда вы должны полностью загрузить огромное изображение в память GDI, чтобы содержать изображение. Я удивлен, что изображение размером 32K-пикселя с высотой 1000+ пикселя может даже загружаться в память без серьезных проблем. Ваша текущая идея не только ограничена ограничениями Scrollbox (хорошо объясненными другим человеком, который ответил на этот вопрос), но и возможностями GDI по обработке изображений, которые (для очень больших изображений) не совсем идеальны.
Нравится вам это или нет, либо напишите свое, либо воспользуйтесь средством просмотра изображений для delphi. На связанной странице визуализатор изображений для Delphi v.1.00.00 от Ahmoy Law выглядит хорошо для меня.
Координаты мыши обычно получаются из сообщения WMMouseMove, определение записи для этого сообщения следующее:
type TLMMouse = record
Msg: Cardinal;
Keys: PtrInt;
case Integer of
0: (XPos: SmallInt;
YPos: SmallInt;);
1: (Pos: TSmallPoint;);
2: (Dummy: LPARAM;
Result: LRESULT;);
end;
Поскольку сообщения мыши упаковывают координаты в 2 строчных буквы, проблема не решается.
Обратите внимание, что GetCursorPos предоставляет запись TPoint с двумя Int32, однако это не та функция, которую использует ваш элемент управления, поэтому вы не извлекаете из этого пользу.