На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Обязательно выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.

Этот раздел предназначен для вопросов, посвященных разработке компонентов, а также для тестирования собственных бесплатных компонентов с открытым исходным кодом.

Здесь запрещается:
1. Размещать ссылки на какие-либо коммерческие компоненты, реализующие требуемую функциональность.
2. Обсуждать и тестировать коммерческие компоненты или компоненты с закрытым кодом.
3. Давать ссылки на сайты с исходным кодом компонентов. Все тестируемые исходные коды должы быть размещены на сайте ИСХОДНИКИ.RU.
Модераторы: Rouse_, DimaBr
  
> Компонент ATImageBox (TScrollBox+TImage)
    Выделил из своего компонента код, содержащий TScrollBox + TImage + обвязку.
    Получился компонент ATImageBox:

    http://atorg.net.ru/files/ATImageBox.zip (290 Кб)

    user posted image


    Набор фич виден по демо. В общем-то, почти те же фичи, что и в компоненте "Image Controls" который обсуждают тут, только без "наворотов" вроде OpenGL, resampling и т.д. Только самое нужное. Зато код маленький.

    Позже выложу на torry.net.
    Сообщение отредактировано: AlexeyT -

    Прикреплённый файлПрикреплённый файлATImageBox.zip (73 Кбайт, скачиваний: 1570)
      Без исходников компонент не относится к тематике раздела по программированию.
        Smike
        OK, сейчас выложу исходники.
        Update: выложил.
        Сообщение отредактировано: AlexeyT -
          Посмотрел. При использовании масштабирования такой симбиоз не годится... Изображение перемасштабируются каждый раз при скроллинге, что приводит к чудовищным тормозам на больших изображениях.

          Я тоже начинал с Image + ScrollBox, но пришел к выводу, что это громоздко, неудобно и неуниверсально.

          Кроме этого в коде видел обработку колеса мыши и клавиатуры. Только это все не работает, если перевести фокус например на кнопку и даже если потом кликнуть на компоненте. Вывод – нет обработки получения фокуса.

          Если выставить флаг "сохранять позицию при масштабировании", наблюдается большое мерцание, когда появляются скроллбары.
            Smike
            Цитата Smike @
            Посмотрел. При использовании масштабирования такой симбиоз не годится... Изображение перемасштабируются каждый раз при скроллинге, что приводит к чудовищным тормозам на больших изображениях.


            На больших - это на каких? У меня есть 1600*1200 - вроде масштабируется мгновенно.
            Вот есть 7200*7200 - на нем да, тормозит.

            Цитата Smike @
            Кроме этого в коде видел обработку колеса мыши и клавиатуры. Только это все не работает, если перевести фокус например на кнопку и даже если потом кликнуть на компоненте. Вывод – нет обработки получения фокуса.


            Да, надо обрабатывать OnClick. Поправил.
            Теперь фокусируется, клавиши/колесо работают.

            Цитата Smike @
            Если выставить флаг "сохранять позицию при масштабировании", наблюдается большое мерцание, когда появляются скроллбары.


            Это надо будет поправить.
              Цитата AlexeyT @
              На больших - это на каких? У меня есть 1600*1200 - вроде масштабируется мгновенно.
              Вот есть 7200*7200 - на нем да, тормозит.

              2976*1952
                Smike
                А что предлагаете делать для такого случая? Как масштабировать.
                  Цитата AlexeyT @
                  А что предлагаете делать для такого случая? Как масштабировать.

                  В таком гибридном компоненте трудно что-то сделать. Разве что придумать какую-то хитрую отрисовку TImage. А именно отрисовывать в TImage только видимую на данный момент область компонента.

                  Тему перенес в специальный раздел. В соответствии с правилами данного раздела прошу прикрепить исходники компонента в первом сообщении. Если не помещается, можно без исполняемого файла.
                    интересует след вопрос а куда убралась канва как теперь рисовать на компоненте ?
                      Цитата AlexeyT @
                      Да, надо обрабатывать OnClick. Поправил.
                      Теперь фокусируется, клавиши/колесо работают.

                      А исправленный код есть?
                        psp посмотри этот вариант, помоему в нем работает то что нужно тебе ...
                        Прикреплённый файлПрикреплённый файлATImageBox_2007.10.21.zip (77.92 Кбайт, скачиваний: 2219)
                          Цитата andrew.virus @
                          psp посмотри этот вариант, помоему в нем работает то что нужно тебе ...

                          Что то этот файл не скачивается ..хотел опять скачать..
                            psp все нормально работает, а какая у тебя проблема возникла ...
                              Цитата andrew.virus @
                              psp все нормально работает, а какая у тебя проблема возникла ...

                              Не распаковывается нормально...
                                psp пишет, что внутри файл ... просмотри ее как папку и будет чудо ... ;)
                                  Хочу использовать ваш компонент (уж больно мне понравилось то, что я увидел в демке), однако есть проблемка. Начну с начала.
                                  Я пишу программу, подобную на графический редактор. Подобную, потому что она для узких целей - с ней можно рисовать схемы оригами.
                                  Вобщем появилась у меня идея реализовать инструмент "Рука", как во многих редакторах.
                                  Обрабатывал события мыши у Image, размещённым в ScrollBox.
                                  Привожу часть кода, т.к. кода много.
                                  ExpandedWrap disabled
                                    procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
                                      Shift: TShiftstate; X, Y: integer);
                                    begin
                                      last_x := x;
                                      last_y := y;
                                    end;
                                     
                                    procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftstate;
                                      X, Y: integer);
                                    begin
                                      ScrollBox1.ScrollBy(X-Last_x,Y-Last_y);
                                    end;

                                  Однако это приводит к тому, что изображение можно переместить как угодно, мне же нужно, чтобы оно "закреплялось" на границах, чтобы его нельзя было дальше перемещать. Пробовал добавлять в обработчик MouseMove:
                                  ExpandedWrap disabled
                                      if ((Image1.Left>=0) and (X>Last_X)) then
                                        begin
                                          Image1.Left := 0;
                                          Last_X := X;
                                          exit;
                                        end;
                                        if ((Image1.Top>=0) and (Y>Last_Y)) then
                                        begin
                                          Image1.Top := 0;
                                          Last_Y := Y;
                                          exit;
                                        end;

                                  Проблема решилась (слева и сверху, снизу и справа похожее сделал), но при перемещении, если достигнуты края, изображение стало "подрагивать". Нашёл эту тему как решение. Установил компонент, но теперь другая проблема: изображение не перемещается после установки ImageDrag в true (по умолчанию отключено, т.к. я рисую на изображении и перемещение мне без выбранного инструмента ни к чему).
                                  Компоненту Box.Image присваиваю события мыши (Down, Move, Up). При создании формы устанавливаю значения box.Image.Width, box.Image.Height, box.Image.Picture.Bitmap.Width, box.Image.Picture.Bitmap.Height, и произвожу заливку. В принципе больше ничего такого страшного не произвожу, как мне кажется. Но после выбора инструмента перемещения само перемещение не происходит. Даже курсор не изменяется.
                                  Помогите мне, пожалуйста, как сладить с этой проблемой. Или может быть, получится обойтись без компонента? Быть может вы подскажете мне, неопытному, что следует писать в MouseDown, Move и Up, чтобы получилось так, как у вас, без "передрагиваний", так чтобы изображение чётко останавливалось при достижении границ?

                                  Пытался искать на форуме решение этой проблемы, и нашёл только эту тему, как более актуальную. Прошу прощение за поднятие старой темы.
                                  Буду признателен даже за совет или намёк...
                                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                  0 пользователей:


                                  Рейтинг@Mail.ru
                                  [ Script execution time: 0,0402 ]   [ 17 queries used ]   [ Generated: 28.03.24, 20:00 GMT ]