KMLIB (Kolibri Macro Library) v0.08 (22 ДЕКАБРЯ 2012)

Discussing libraries simplifying applications development
  • Mario, спасибо
    И мы уже давно не пешки,
    Мы пули, мы орлы, и решки!
    Война ютит бинарный код,
    Умри, или иди вперед!
  • Image

    Делаю SCROLLBAR и у меня появилась проблема. Не могу никак сделать перемещение ползунка. То есть оно получилось, в результате долгих мучений, но не совсем правильно. Может кто поделится алгоритмом работы scrollbar'а. Возможно я что-то не правильно делаю. Вернее, я алгоритм реализовал неправильно наверно.

    Если надо потестить, прикрепил бинарник.
    Attachments
    SB.KEX (1.51 KiB)
    Downloaded 333 times
  • Врядли это можно считать полноценным ответом, но аглоритмы полосы прокрутки есть в исходниках таких программ как Tinypad, Table, Eolite, KFM...
  • connect wrote:Врядли это можно считать полноценным ответом, но аглоритмы полосы прокрутки есть в исходниках таких программ как Tinypad, Table, Eolite, KFM...
    1. Я уже неоднократно писал, что чужие исходники для меня тёмный лес (особенно без комментарий).
    2. В Tinypad, скроллинг работает не совсем праваильно, и мне бы не хотелось бы заранее писать неправильно, в том случае, если я конечно разберусь в его исходниках.
    3. Table и Eolite написаны на наСильниках, на которых я не умею программировать. Сложноваты будут.
    4 Исходников KFM у меня нет, и на SVN тоже.

    Неужели так сложно написать 5 - 10 строчек с алгоритмом? Или это секрет?

    P.S. Пожалуйста помогите! :(
  • В скроллинге самые главные 3 параметра это:
    - Максимальный размер документа
    - Какая часть документа влазит в экран
    - Позиция бегунка
    Вот описание этих параметров из box_lib.obj со страницы http://wiki.kolibrios.org/wiki/Box_lib_scrollbar/ru :
    # sb_max_area - область максимальная, актуально когда не влазит в отображаемую область, т.е. случай активности компонента (весь максимальный размер документа)
    # sb_cur_area - область отображаемая (какая часть документа влазит в экран)
    # sb_position - позиция бегунка изменяемая от 0 до значения (sb_max_area-sb_cur_area)
    Все алгоритмы по работе со скроллингом сводятся к правильной обработке этих параметров и правильном отображении скроллинга на экране в зависимости от значений этих параметров. Остальные параметры не столь важны для программиста использующего твой компонент, они имеют для него второстепенное значение (цвет, положение, размер, ... и т.д.) . Детального алгоритма у меня нет т. к. я скроллинги не делал. Для каждого события (нажатие на мышку или клавиатуру) должен быть свой алгоритм ли функция.
    Attachments
    результат теста: мышей я смог сдвинуть ползунок скроллинга ниже кнопки
    test_scroll.png (3.41 KiB)
    результат теста: мышей я смог сдвинуть ползунок скроллинга ниже кнопки Viewed 8868 times
  • IgorA wrote:результат теста: мышей я смог сдвинуть ползунок скроллинга ниже кнопки
    Знаю, scrollbar ещё не доделан. Я заглушку пока поставил только на кнопки. На ползунок пока не ставил, так как смысла нет, потому что он всё равно работает неправильно, и наверняка его надо будет переделывать.

    На счёт параметров я знаю, но алгоритма перемещения scroller'а мне они не раскрывают. Именно поэтому, мне и нужен более детальный алгоритм, чтобы было с чем сравнивать. И если что-то неправильно, то поменять на правильно. Может я вообще неправильно алгоритм организовал в своём scrollbar'е, что скорее всего.

    Но всё равно, спасибо.
  • Результаты поиска "scroll" по src, sdk, svn ("с" результаты опущены)

    kolibri_0.7.7.0_src\lib\box_lib\scrollbar.mac
    kolibri_0.7.7.0_src\programs\fs\kfm\scroll.inc
    kolibri_0.7.7.0_sdk\INFOBOX\VSCROLL8.asm
    ---
    svn\programs\develop\libraries\box_lib\trunk\scrollbar.mac
    svn\programs\develop\libraries\box_lib\trunk\doc\scrollbar\scrollbar.htm
    svn\programs\develop\libraries\libGUI\examples\src\ASM\SCROLL_BAR.ASM
    svn\programs\develop\libraries\libGUI\examples\src\ASM\SCROLLED_WINDOW.ASM
    ---
    ещё у Зубкова которого я взял по ссылке откуда-то с этого форума, scroll'ы описываются
  • lev wrote:Результаты поиска "scroll" по src, sdk, svn ("с" результаты опущены)

    kolibri_0.7.7.0_src\lib\box_lib\scrollbar.mac
    kolibri_0.7.7.0_src\programs\fs\kfm\scroll.inc
    kolibri_0.7.7.0_sdk\INFOBOX\VSCROLL8.asm
    ---
    svn\programs\develop\libraries\box_lib\trunk\scrollbar.mac
    svn\programs\develop\libraries\box_lib\trunk\doc\scrollbar\scrollbar.htm
    svn\programs\develop\libraries\libGUI\examples\src\ASM\SCROLL_BAR.ASM
    svn\programs\develop\libraries\libGUI\examples\src\ASM\SCROLLED_WINDOW.ASM
    ---
    Я просил алгоритм, а не код. Не знал что там есть. Врятли поможет, но спасибо.
    lev wrote: ещё у Зубкова которого я взял по ссылке откуда-то с этого форума, scroll'ы описываются
    Не нашёл. Хоть номер главы написал бы.
  • Rock_maniak_forever
    Для начала я еще раз проясню свою позицию - я не считаю целесообразным написание собственного кода, если есть доступный рабочий пример чужого кода. Однако раз так хочется разбрасывать свои и грабли, то дело хозяйское.

    В простейшем виде скроллбар получает два события: события мыши (нажатие и отпускание кнопки - соответственно наличие или отсутствие флагов отвечающих за эти кнопки) и событие перерасчета позиции при внешнем воздействии (клавиатура например или изменение размера отображаемых данных). Как уже писал ранее Игорь имеется три главных параметра с которыми оперирует код, на самом деле их четыре:
    1) размер полной рабочей области (в условных единицах - строки или пиксели, смотря что выводится)
    2) размер отображаемой части (в условных единицах - строки или пиксели, смотря что выводится)
    3) размер занимаемый скроллбаром (в пикселах, за вычетом боковых кнопок)
    4) размер занимаемый бегунком скроолбара (в пикселах)

    обозначим параметры как: a, b, c, d

    Исходя из вышеперечисленного имеем формулы:

    c = a/K
    d = b/K

    где:
    a - размер полной рабочей области
    b - размер отображаемой части
    c - размер занимаемый скроллбаром
    d - размер занимаемый бегунком скроолбара
    K - коэффициент соответствия

    Изначально известны две величины a и с - все остальное пляшется исходя из них.

    На практике формулы несколько усложняется, поскольку в текущем виде она будет обрабатывать позицию мыши слишком жестко и у пользователя будет создаваться ощущение рассинхронизации. Нужно еще учитывать, что пользователь захватив бегунок тащит его в одну или другую сторону и бегунок (пока не отпущена кнопка мыши или не закончилась область скроллбара) относительно курсора мыши должен идти строго синхронно, для этого приходится немного поизвращаться с кодом. К примеру в KFM как раз присутствует вариант когда есть рассинхронизация, этот же код но доработанный на 40-50% перекочевал в библиотеку Box_Lib и там уже недоработка с рассинхронизацией устранена.

    Теперь представляем сколько времени и сил уходит на реализацию правильного скроллбара - вылизывать код придется основательно. Единственно почему я не взял код из Tinypad в свое время это его высокая интеграция в приложение. В KFM оно тоже было вшито сильно, но тот код хотя бы был мой - хотя два месяца на выдирание и отладку были не самыми простыми и приятными.
  • Mario
    Спасибо за полезную инфу, пригодится. :D
    Mario wrote:Rock_maniak_forever
    Для начала я еще раз проясню свою позицию - я не считаю целесообразным написание собственного кода, если есть доступный рабочий пример чужого кода.
    Теперь я проясню свою позицию:
    ==========================
    1. Чужой код, для меня тёмный лес. Четно говоря, мне это, уже надоело повторять.
    2. Если даже я и буду разбирать чужой код, и вдруг что нибудь пойму, то на понимание всего кода у меня уйдёт куда больше времени, чем у вас на выдирание и отладку. Да и код, в чужой программе, может быть написан не полностью.
    3. На scrollbar, который я написал недавно, у меня ушла всего неделя, с отладкой (но без оптимизации) и без знания алгоритма работы. Там только ползунок неправильно работает. Сначала пришлось смотреть работу scrollbar'а в давно всеми забытом Menuet'е (как потом оказалось, там он работает неправильно), а потом смотрел в Must Die (смотрел изменение scrollbar'а, при разных условиях). Часть алгоритма, взял: из Menuet'а, часть из Must Die и часть сам придумал. Да и scrollbar не простой, как в Tinypad или KFM. Да, люблю красивый фейс в проге, и без этого никак. А если бы я знал алгоритм заранее, то у меня бы ушло всего от 2-4 дней на его написание, со всеми вытекающими.
    4. Мне не доставляет радости, ковыряться в чужом коде. Особенно, когда его не понимаешь.
    5. Велосипед изобретать не хочется.
    6. Время жалко на понимание и изобретение того, что уже придумано до меня.
    7. На ошибках учатся.

    Тем самым, мне проще, приятнее и быстрее написать программу (макрос) самому. Конечно, если я точно знаю алгоритм.

    Ну допустим, перепишу я этот код, а знать как он работает, не буду. А если я этого не буду знать, то я не смогу правильно написать программу (макрос), ну или как-то её, или тот код,усовершенствовать или оптимизировать. Поэтому, мне архи-нужен и архи-важен алгоритм работы программы, а не код. И чем точнее и понятнее он будет описан, тем быстрее я напишу программу (макрос), и тем качественнее она будет работать.
    Mario wrote:Однако раз так хочется разбрасывать свои и грабли, то дело хозяйское.
    Вот я и спрашиваю, чтобы их не разбрасывать, и на них не натыкаться.
    Mario wrote: .........................................................................................................................................
    .........................................................................................................................................
    .........................................................................................................................................
    На практике формулы несколько усложняется, поскольку в текущем виде она будет обрабатывать позицию мыши слишком жестко и у пользователя будет создаваться ощущение рассинхронизации. Нужно еще учитывать, что пользователь захватив бегунок тащит его в одну или другую сторону и бегунок (пока не отпущена кнопка мыши или не закончилась область скроллбара) относительно курсора мыши должен идти строго синхронно, для этого приходится немного поизвращаться с кодом. К примеру в KFM как раз присутствует вариант когда есть рассинхронизация, этот же код но доработанный на 40-50% перекочевал в библиотеку Box_Lib и там уже недоработка с рассинхронизацией устранена.
    Я не в праве требовать от вас писать мне целую диссертацию, ибо понимаю, что ваше время бесценно и принадлежит только вам. Но если вы решите уделить мне ваше драгоценное время, чтобы помочь мне разрешить мою проблему, то хотелось бы побольше узнать о таинственном перемещении ползунка, которое так не даёт мне покоя. :D
    Last edited by Rock_maniak_forever on Sun Dec 19, 2010 9:12 pm, edited 1 time in total.
  • Rock_maniak_forever
    Без обид, но пункты 4, 5, 6 противоречат друг другу по сути.
  • ChE wrote:Rock_maniak_forever
    Без обид, но пункты 4, 5, 6 противоречат друг другу по сути.
    И чем же...

    1. Зная инструкцию сборки велосипеда (алгоритм программы), то можно довольно быстро собрать свой велосипед из имеющихся деталей (инструкций). И даже смогу модифицировать под себя. При этом, буду знать, что у велосипеда колёса круглые, а не квадратные, и велосипед катится, а не прыгает, ну и так далее...
    2. Чем ковыряться в имеющемся велосипеде, разбирать и проверять каждую деталь или механизм (код) в работе, а потом собирать свой со всеми неполадками, не доработками, кривыми деталями, кривым рулём и кривыми колёсами. Или изобретать свой велосипед вообще полностью. Мне на это как раз и жалко времени.
    3. Не хочу чужой, кривой велосипед копировать. На который мне тоже жалко времени.
  • Rock_maniak_forever
    1) тебе надо организовать обработку случая захвата бегунка - это зачастую не всегда очевидно когда только задумываешься над реализацией.
    2) отлавливать момент когда бегунок захвачен, в примере простейшего скроллбара в этот момент бегунок прыгает и центрируется относительно текущего положения курсора мыши, для полноценного скроллбара этого естественно не должно происходить.

    OFFTOP: скроллбар это не велосипед, а скорее цепной механизм - можно его и самому изобретать, но пророй лучше изобретать раму и колеса, чем это.

    И без обид - если тебе не хочется, неприятно и неинтересно разбираться с чужим кодом, то вероятно другим также может быть интересно с твоим кодом, тем самым обрекаешь себя на ограниченный ресурс собственных сил. Именно чтобы не разбираться с чужим кодом и придумали динамически подключаемые библиотеки имеющие достаточно четко реализованный интерфейс. Я понимаю что это надо осознать просто - мне потребовалось 3-4 года и если бы я писал KFM сейчас он был бы другим.

    Кстати в Tinypad реализация скроллбара полноценная, но как я уже сказал слишком глубоко вшитая в приложение, иначе автор бы сам вынес этот код в подключаемую библиотеку.
  • Rock_maniak_forever
    Думаю, не нужно 3 экзешника фасма в архив включать. У каждого, уверен, есть свой - у кого под винду, у кого под линукс, у кого под кос.
  • Who is online

    Users browsing this forum: No registered users and 5 guests