Преодолеть ограничения TImage Control - PullRequest
0 голосов
/ 28 декабря 2011

Я использую элемент управления TImage внутри элемента управления TScrollBox в Delphi 4. Здесь я заполняю данные в элементе управления TImage, соответственно увеличивая высоту.

Моя функциональность основана на событии mousedown, где я использую X, Yпараметры для некоторых проверок с выделением этой записи.

Теперь проблема здесь в том, что X, Y являются параметрами целочисленного типа, и они возвращают значения в диапазоне от -32768 до 32767. У меня возникают проблемы, когда мои записи выходят за пределы 32767рост.Событие Mousedown возвращает значение Y, так как отрицательное значение вызывает проблемы с моей функциональностью.

Существует 2 возможных способа решения этой проблемы:

  1. Любой обходной путь для устранения этой проблемы.

  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 ]

1 голос
/ 28 декабря 2011

Существует третий способ решения. Прекратите использовать Scrollbox и напишите свой собственный элемент управления с его собственными ручками полосы прокрутки, которые могут отображать часть изображения в координатах X, Y, указанных вами. Фактически вы могли бы сделать это, добавив полосы прокрутки к любому простому компоненту на основе TControl, написанному вами; если вы настаиваете на использовании встроенного элемента управления в Delphi, вы на самом деле будете делать что-то слегка нелепое. Написание собственного элемента управления может быть сделано в несколько строк кода, и это правильный ответ, если вы не хотите использовать сторонние элементы управления.

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

Scrollboxes + TImage - ужасное решение с точки зрения производительности, особенно когда вы должны загрузить огромное изображение целиком в память GDI, чтобы содержать изображение. Я удивлен, что изображение размером 32K-пикселя с высотой 1000+ пикселя может даже загружаться в память без серьезных проблем. Ваша текущая идея не только ограничена ограничениями Scrollbox (хорошо объясненными другим человеком, который ответил на этот вопрос), но и возможностями GDI по обработке изображений, которые (для очень больших изображений) не совсем идеальны.

Нравится вам это или нет, либо напишите свое, либо используйте просмотрщик изображений для delphi . На связанной странице визуализатор изображений для Delphi v.1.00.00 от Ahmoy Law выглядит хорошо для меня.

1 голос
/ 28 декабря 2011

Координаты мыши обычно выводятся из сообщения 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, однако это не та функция, которую использует ваш элемент управления, поэтому вы не извлекаете из этого пользу.

...