Эффективное программирование в KOLIBRI OS

Assembler programming questions
  • 446 ревизия - сегодняшняя ;)
  • Я пока не могу залить на свой сайт компонент без бага, т.к. просто не могу зайти по ftp
  • Ребята, пожалуйста не ссортись. Марат, скачай обновленный компонент с моего сайта, баг пофиксен.
  • <Lrz>
    Спасибо.
  • Heavyiron
    >Обнаружил еще один глюк в editbox (446). Если выделить всю строку мышью справа налево, то она не удаляется del-ом

    Обновил компонент, исправлено.

    Mario79
    >Выделенная мышью строка при повторном щелчке мышью не очищается.
    >А зачем удалил Shift+мышь? ИМХО большие возможности это плюс.
    Выделять можно мышкой, причем удерживая любую клавишу. Т.е. если раньше было так - пока не будешь держать shift не выделишь, а сейчас это не имеет никакого значения. Обновления доступны на svn и на моем сайте.

    Огромная просьба протестировать компонент на рельной машине, под эмулем у меня все ок, но вот на рельной машине я наблюдал некоторые баги, возможно стоит эмуль скорректировать с текущей версией ядра.
    Жду ваших замечаний и предложений.
  • Итак возникли проблемы с интеграцией новой версией едитбокса:
    Т.к. в алгоритм были внесены существенные изменения, то они повлекли новые данные, которые необходимо инициализировать в секции кода вашей программы.
    mouse_flag: dd 0x0 используется для хранения указателя на активный бокс, если там не 0 обрабатывается только бокс , чей указатель находится в этой переменной.
    structure_of_potock: rb 1024 ;1 кб для получения общей структуры
    Т.к. сейчас я получаю гболальные координаты, то эта структура нужна для того что бы можно было узнать координаты окна. можно выделить 100 байт (но в документации для совместимости просят указывать 1 кб.)
  • <Lrz>
    Новый глюк в последней версии - как только щелкаешь мышью по компоненту, он теряет фокус и его уже никак не вернуть. Если действовать исключительно клавиатурой все нормально.
  • Проверил на новом эмуляторе, такого бага не обнаружил, напиши по подробнее. Ты уже экспериментируешь над KFM ?
    В моем примере такую ошибку я не наблюдал. Могу высказать предположение, что потеря фокуса связана с тем, что не правильно (не верно) выдается координаты после отработки функции
    ;----------------------------------------------------------
    ;--- получаем координаты окна, заносятся в структуру structure_of_potock
    ;----------------------------------------------------------
    mov eax,9
    mov ebx,structure_of_potock
    or ecx,-1
    int 0x40
    Хотя все очень странно.....
  • [offtop]
    ребята, а не проще поставить тот же Mantis или Bugzilla???
    А то ветку загадили: "нашел баг" - "пофиксено", "нашел еще" - "пофиксено", "и еще" - "уже исправил"...
    А ведь тема называлась "Эффективное программирование в KOLIBRI OS".
    Насколько я знаю на ваш сервер можно поставить любую срань...
    Ну это так ИМХО и сорри за офттоп
    [/offtop]
  • Изначально тема задумывалась, как создание методов, алгоритмов, и рекомендаций по написанию эффективного кода на ассемблере для Колибри. Однако первые мои опыты были не очень удачным примером того как нужно программировать, скорее они были как не нужно программировать. Еще один недостаток, который я заметил у многих программ, это перерисовка всего окна при смене или изменении небольшого объекта в окне. В своих работах, я, по возможности отхожу от этого, конечно неимоверно усложняется код, но зато нет ничего лишнего и ни что не напрягает глаз...
    Со времененм, да бы не ткрывать другую ветку, в этой были размещены ссылки на мои работы. Конечно, сейчас, это больше напоминает свалку: "нашел" , "исправил" .....
    Если будет другая альтернатива, то я обязательно воспользуюсь ей.
  • <Lrz>
    Чтобы было от чего оттолкнуться - у меня реализовано так:
    ;-------------------------------------------------------------
    editbox_copy_name:
    mcall 66, 1, 0
    jmp .red
    .red_1:
    call draw_window
    .red:
    call draw_editbox_copy_name
    .still:
    mcall 10
    cmp eax,1
    je .red_1
    cmp eax,2
    je .key_copy
    cmp eax,3
    je .button_copy
    mouse_edit_boxes copy_editboxes,copy_editboxes_end
    jmp .still
    ;-------------------------------------------------------------
    .button_copy:
    mov eax,17
    int 0x40
    test ah,ah
    jz .still
    cmp ah,160
    je .exit_with_copy
    cmp ah,161
    je .exit_without_copy
    cmp ah,1
    jne .still
    mcall -1
    .exit_with_copy:
    mov [max_progress_value],1
    call copy_file_1
    cmp [move_file_flag],0
    je @f
    call del_file
    test eax,eax
    jz @f
    call start_error_window_thread
    @@:
    call proc_read_left_folder
    call proc_read_right_folder
    .exit_without_copy:
    mcall 66, 1, 1
    mov [move_file_flag],0
    jmp red
    ;-------------------------------------------------------------
    .key_copy:
    mov eax,2
    int 0x40
    cmp ah,13
    je .exit_with_copy
    cmp ah,27
    je .exit_without_copy
    key_edit_boxes copy_editboxes,copy_editboxes_end
    jmp .still
    ;-------------------------------------------------------------
    draw_editbox_copy_name:
    mov ecx,[window_high]
    mov ebx,[window_width]
    shr ecx,1
    shr ebx,1
    sub ecx,30
    sub ebx,87
    shl ecx,16
    shl ebx,16
    mov cx,60
    mov bx,174
    mcall 13, , ,0x6060ff ;0xff
    pusha
    shr ebx,16
    add ebx,10
    shr ecx,16
    add ecx,17
    mov eax,copy_editboxes
    mov dword [eax+4],ebx
    mov dword [eax+8],ecx
    draw_edit_boxes copy_editboxes,copy_editboxes_end
    popa
    pusha
    add ebx,70 shl 16
    add ecx,37 shl 16
    mov cx,15
    mov bx,40
    mov esi,0xffffff
    mov edx,0x40000000+160
    mov eax,8
    int 0x40
    add ebx,50 shl 16
    inc edx
    int 0x40
    popa

    push ebx ecx
    add ebx,70 shl 16
    add ecx,37 shl 16
    mov bx,40
    mov cx,15
    mov edx,0
    push ebx ecx
    sub ecx,1 shl 16
    sub ebx,1 shl 16
    mov bx,42
    mov cx,17
    int 0x40
    add ebx,50 shl 16
    int 0x40
    pop ecx ebx
    mov edx,0xff7700
    int 0x40
    mov edx,0xaa00
    add ebx,50 shl 16
    int 0x40
    pop ecx ebx

    shr ecx,16
    mov bx,cx
    add ebx,60 shl 16+5
    cmp [move_file_flag],0
    je .copy
    mov edx,move_type_1
    jmp @f
    .copy:
    mov edx,copy_type_1
    @@:
    mcall 4, ,0x90ffffff
    add ebx,18 shl 16+36
    mov edx,type_yes
    int 0x40
    add ebx,56 shl 16
    mov edx,type_no
    int 0x40
    ret
    ;-------------------------------------------------------------
  • Выскажу предположение:
    1 версия. У тебя код мышки обрабатывает основной поток программы т.е. как я понял ты создаешь новый поток и в него выводишь уже сообщение и editbox. А мышку ты обрабатываешь старым потоком. Т.е. у тебя два потока основной и второй где прорисовывается eidtbox. Как следствие тебе нужно сделать так чтобы второй поток обрабатывал код мышки.
    2 версия у тебя при вызове 9 функции, которую я привет по адресам dword [structure_of_potock +34] и dword [structure_of_potock +38] расположены координаты основного потока. Если ты вызываешь обработчики мышки в уже сформированном потоке.
    Если это так то это уже баг сис функции или фитча.
    Если тебе не сложно вышли мне на мыло полностью код KFM, я разберусь вчем дело.
  • <Lrz>
    Поток у меня один.
    Второй поток запускается только для сообщения об ошибке файловой системы.
  • Так .... без пол литра не обойтись... у меня есть отладочный код, с момощью него можно выявить что находится в eax, и по адресам dword [structure_of_potock +34] и dword [structure_of_potock+38].
    Но лучше дай мне посмотреть исходный код KFM мое мыло 200_u_200{at}mail.ru
  • Who is online

    Users browsing this forum: No registered users and 15 guests