Difference between revisions of "OpenDialog/ru"
(New page: Программа является подобием Windows компонента ''Microsoft Common Dialog Control'' или его аналогов в Linux (там их вообще не...) |
|||
(15 intermediate revisions by 5 users not shown) | |||
Line 1: | Line 1: | ||
− | + | {{DISPLAYTITLE:OpenDialog}} | |
+ | '''OpenDialog''' — программа, которая является подобием Windows компонента ''Microsoft Common Dialog Control'' или его аналогов в Linux (там их вообще несколько разных присутствует). | ||
Программа имеет 3 режима работы: | Программа имеет 3 режима работы: | ||
*Диалог выбора для открытия файла. | *Диалог выбора для открытия файла. | ||
Line 7: | Line 8: | ||
*Диалог выбора директории. | *Диалог выбора директории. | ||
[[Image:OpenD3.png]] | [[Image:OpenD3.png]] | ||
− | <br>Программа сама физически не открывает на чтение или запись - она предназначена для взаимодействия с пользователем. Результат работы - готовый, полный путь передаваемый через "расшаренную" именованную область памяти к программе использующей OpenDialog. | + | <br>Программа сама физически не открывает на чтение или запись - она предназначена для взаимодействия с пользователем. Результат работы - готовый, полный путь передаваемый через "расшаренную" именованную область памяти к программе использующей '''OpenDialog'''. Для использования OpenDialog была создана библиотека '''proc_lib.obj'''. |
− | == | + | ==Пример== |
+ | Пример подключения диалога открытия файла. Для компиляции в инструкциях ''include'' нужно указать полный путь к папке ''svn''. | ||
+ | <syntaxhighlight lang="asm"> | ||
+ | use32 | ||
+ | org 0x0 | ||
+ | db 'MENUET01' ;идентиф. исполняемого файла всегда 8 байт | ||
+ | dd 0x1 | ||
+ | dd start | ||
+ | dd i_end ; размер приложения | ||
+ | dd mem | ||
+ | dd stacktop | ||
+ | dd 0x0 | ||
+ | dd sys_path | ||
+ | |||
+ | include 'svn/programs/macros.inc' ;подключаем необходимые стандартные макросы | ||
+ | include 'svn/programs/develop/libraries/box_lib/load_lib.mac' ;макрос для загрузки библиотек | ||
+ | include 'svn/programs/proc32.inc' ;что-бы работали макросы stdcall | ||
+ | |||
+ | @use_library | ||
+ | |||
+ | align 4 | ||
+ | start: ;начало программы | ||
+ | load_libraries l_libs_start,load_lib_end ;загрузка библиотек(и) | ||
+ | mcall 48,3,sc,sizeof.system_colors ;получить системные цвета | ||
+ | mcall 40,0x25 ;маска ожидаемых событий | ||
+ | stdcall [OpenDialog_Init],OpenDialog_data ;подготовка диалога | ||
+ | |||
+ | align 4 | ||
+ | red_win: | ||
+ | call draw_window | ||
+ | |||
+ | align 4 | ||
+ | still: ;главный цикл | ||
+ | mcall 10 | ||
+ | |||
+ | cmp al,0x1 ;изменилось положение окна ? | ||
+ | jz red_win | ||
+ | cmp al,0x3 ;нажали кнопку ? | ||
+ | jz button | ||
+ | jmp still | ||
+ | |||
+ | align 4 | ||
+ | draw_window: | ||
+ | mcall 12,1 ;начало прорисовки окна | ||
+ | |||
+ | xor eax,eax | ||
+ | mov ebx,80*65536+250 | ||
+ | mov ecx,80*65536+150 | ||
+ | mov edx,[sc.work] | ||
+ | or edx,0x33000000 | ||
+ | mov edi,hed | ||
+ | mcall ;вывод окна на экран, при повторном вызове игнорируется | ||
+ | |||
+ | mov ebx,10*65536+50 | ||
+ | mov ecx,30*65536+20 | ||
+ | mov edx,2 ;id для кнопки | ||
+ | mov esi,[sc.work_button] ;системный цвет кнопки | ||
+ | mcall 8 ;кнопка | ||
+ | |||
+ | mov ebx,15*65536+35 | ||
+ | mov ecx,[sc.work_button_text] ;системный цвет текста на кнопке | ||
+ | or ecx,0x80000000 | ||
+ | mov edx,txt_open | ||
+ | mcall 4 ;подпись кнопки | ||
+ | |||
+ | mcall 12,2 ;конец прорисовки окна | ||
+ | ret | ||
+ | |||
+ | align 4 | ||
+ | button: | ||
+ | mcall 17 ;получить код нажатой кнопки | ||
+ | cmp ah,2 | ||
+ | jne @f | ||
+ | call but_open_dlg | ||
+ | @@: | ||
+ | cmp ah,1 | ||
+ | jne still | ||
+ | .exit: | ||
+ | mcall -1 ;выход из программы | ||
+ | |||
+ | align 4 | ||
+ | but_open_dlg: | ||
+ | pushad | ||
+ | copy_path open_dialog_name,communication_area_default_path,file_name,0 | ||
+ | mov [OpenDialog_data.type],0 | ||
+ | stdcall [OpenDialog_Start],OpenDialog_data | ||
+ | cmp [OpenDialog_data.status],2 | ||
+ | je @f | ||
+ | cmp [OpenDialog_data.status],0 ;пользователь нажал Cancel? | ||
+ | je .end_open | ||
+ | ;код при удачном открытии диалога | ||
+ | ;... | ||
+ | jmp .end_open | ||
+ | @@: | ||
+ | ;код при не удачном открытии диалога | ||
+ | ;... | ||
+ | .end_open: | ||
+ | popad | ||
+ | ret | ||
+ | |||
+ | ;дынные для диалога открытия файлов | ||
+ | align 4 | ||
+ | OpenDialog_data: | ||
+ | .type dd 0 ;0 - открыть, 1 - сохранить, 2 - выбрать директорию | ||
+ | .procinfo dd procinfo ;+4 | ||
+ | .com_area_name dd communication_area_name ;+8 | ||
+ | .com_area dd 0 ;+12 | ||
+ | .opendir_path dd plugin_path ;+16 | ||
+ | .dir_default_path dd default_dir ;+20 | ||
+ | .start_path dd file_name ;+24 путь к диалогу открытия файлов | ||
+ | .draw_window dd draw_window ;+28 | ||
+ | .status dd 0 ;+32 | ||
+ | .openfile_path dd openfile_path ;+36 путь к открываемому файлу | ||
+ | .filename_area dd filename_area ;+40 | ||
+ | .filter_area dd Filter | ||
+ | .x: | ||
+ | .x_size dw 420 ;+48 ; Window X size | ||
+ | .x_start dw 10 ;+50 ; Window X position | ||
+ | .y: | ||
+ | .y_size dw 320 ;+52 ; Window y size | ||
+ | .y_start dw 10 ;+54 ; Window Y position | ||
+ | |||
+ | default_dir db '/rd/1',0 ;директория по умолчанию | ||
+ | |||
+ | communication_area_name: | ||
+ | db 'FFFFFFFF_open_dialog',0 | ||
+ | open_dialog_name: | ||
+ | db 'opendial',0 | ||
+ | communication_area_default_path: | ||
+ | db '/rd/1/File managers/',0 | ||
+ | |||
+ | Filter: | ||
+ | dd Filter.end - Filter.1 | ||
+ | .1: | ||
+ | db 'ASM',0 | ||
+ | db 'INC',0 | ||
+ | db 'TXT',0 | ||
+ | .end: | ||
+ | db 0 | ||
+ | |||
+ | align 4 | ||
+ | proclib_import: ;описание экспортируемых функций | ||
+ | OpenDialog_Init dd aOpenDialog_Init | ||
+ | OpenDialog_Start dd aOpenDialog_Start | ||
+ | dd 0,0 | ||
+ | aOpenDialog_Init db 'OpenDialog_init',0 | ||
+ | aOpenDialog_Start db 'OpenDialog_start',0 | ||
+ | |||
+ | head_f_i: | ||
+ | head_f_l db 'Системная ошибка',0 | ||
+ | err_message_found_lib0 db 'Не найдена библиотека ',39,'proc_lib.obj',39,0 | ||
+ | err_message_import0 db 'Ошибка при импорте библиотеки ',39,'proc_lib.obj',39,0 | ||
+ | |||
+ | system_dir0 db '/sys/lib/' | ||
+ | lib0_name db 'proc_lib.obj',0 | ||
+ | |||
+ | ;library structures | ||
+ | l_libs_start: | ||
+ | lib0 l_libs lib0_name, sys_path, file_name, system_dir0, err_message_found_lib0, head_f_l, proclib_import,err_message_import0, head_f_i | ||
+ | load_lib_end: | ||
+ | |||
+ | hed db 'пример использования ',39,'OpenDialog',39,0 | ||
+ | txt_open db 'Открыть',0 | ||
+ | sc system_colors ;структура с системными цветами | ||
+ | |||
+ | i_end: ;конец кода | ||
+ | rb 1024 | ||
+ | procinfo process_information | ||
+ | stacktop: | ||
+ | sys_path: | ||
+ | rb 4096 | ||
+ | file_name: | ||
+ | rb 4096 | ||
+ | plugin_path: | ||
+ | rb 4096 | ||
+ | openfile_path: | ||
+ | rb 4096 | ||
+ | filename_area: | ||
+ | rb 256 | ||
+ | mem: | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ==Структура OpenDialog== | ||
+ | <syntaxhighlight lang="asm"> | ||
+ | OpenDialog_data: | ||
+ | .type dd ? | ||
+ | .procinfo dd ? ;+4 | ||
+ | .com_area_name dd ? ;+8 | ||
+ | .com_area dd ? ;+12 | ||
+ | .opendir_path dd ? ;+16 | ||
+ | .dir_default_path dd ? ;+20 | ||
+ | .start_path dd ? ;+24 | ||
+ | .draw_window dd ? ;+28 | ||
+ | .status dd ? ;+32 | ||
+ | .openfile_path dd ? ;+36 | ||
+ | .filename_area dd ? ;+40 | ||
+ | .filter_area dd ? | ||
+ | .x: | ||
+ | .x_size dw ? ;+48 | ||
+ | .x_start dw ? ;+50 | ||
+ | .y: | ||
+ | .y_size dw ? ;+52 | ||
+ | .y_start dw ? ;+54 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | *<code>.type</code> - тип диалога, если: | ||
+ | **'''0''' - открыть, | ||
+ | **'''1''' - сохранить, | ||
+ | **'''2''' - выбрать директорию. | ||
+ | *<code>.opendir_path</code> - директория, которая открывается при запуске диалога. | ||
+ | *<code>.dir_default_path</code> - директория, которая открывается по умолчанию (если путь в ''.openfile_path'' пустой). | ||
+ | *<code>.start_path</code> - путь к opendial (по-умолчанию это /sys/File managers/opendial). | ||
+ | *<code>.draw_window</code> - указатель на функцию рисования окна программы, которая вызвала диалог | ||
+ | *<code>.status</code> - результат работы диалога (0 - пользователь нажал ''Cancel'', 1 - пользователь нажал ''Open'', 2 - диалог не смог открыться) | ||
+ | *<code>.openfile_path</code> - путь к открываемому файлу, получаемый в результате работы с окном диалога. | ||
+ | *<code>.filter_area</code> - указатель на данные расширений отображаемых (отфильтрованных) файлов. | ||
+ | *<code>.x_size</code> - ширина окна диалога. | ||
+ | *<code>.y_size</code> - высота окна диалога. | ||
+ | |||
+ | ==Автор== | ||
'''Mario''' | '''Mario''' | ||
+ | |||
+ | =Если сложна= | ||
+ | Для программ, где сложно добавить Open_Dial можно использовать костыль: программу /sys/lod | ||
+ | |||
+ | Подробнее: http://board.kolibrios.org/viewtopic.php?t=2486 | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | {{Файловые_менеджеры}} | ||
+ | |||
+ | [[Category:Приложения]] | ||
+ | [[Category:Файловые_менеджеры]] | ||
+ | [[Category:Программы на ассемблере]] |
Latest revision as of 15:31, 10 September 2023
OpenDialog — программа, которая является подобием Windows компонента Microsoft Common Dialog Control или его аналогов в Linux (там их вообще несколько разных присутствует). Программа имеет 3 режима работы:
- Диалог выбора для открытия файла.
- Диалог выбора для сохранения файла.
- Диалог выбора директории.
Программа сама физически не открывает на чтение или запись - она предназначена для взаимодействия с пользователем. Результат работы - готовый, полный путь передаваемый через "расшаренную" именованную область памяти к программе использующей OpenDialog. Для использования OpenDialog была создана библиотека proc_lib.obj.
Пример
Пример подключения диалога открытия файла. Для компиляции в инструкциях include нужно указать полный путь к папке svn.
use32
org 0x0
db 'MENUET01' ;идентиф. исполняемого файла всегда 8 байт
dd 0x1
dd start
dd i_end ; размер приложения
dd mem
dd stacktop
dd 0x0
dd sys_path
include 'svn/programs/macros.inc' ;подключаем необходимые стандартные макросы
include 'svn/programs/develop/libraries/box_lib/load_lib.mac' ;макрос для загрузки библиотек
include 'svn/programs/proc32.inc' ;что-бы работали макросы stdcall
@use_library
align 4
start: ;начало программы
load_libraries l_libs_start,load_lib_end ;загрузка библиотек(и)
mcall 48,3,sc,sizeof.system_colors ;получить системные цвета
mcall 40,0x25 ;маска ожидаемых событий
stdcall [OpenDialog_Init],OpenDialog_data ;подготовка диалога
align 4
red_win:
call draw_window
align 4
still: ;главный цикл
mcall 10
cmp al,0x1 ;изменилось положение окна ?
jz red_win
cmp al,0x3 ;нажали кнопку ?
jz button
jmp still
align 4
draw_window:
mcall 12,1 ;начало прорисовки окна
xor eax,eax
mov ebx,80*65536+250
mov ecx,80*65536+150
mov edx,[sc.work]
or edx,0x33000000
mov edi,hed
mcall ;вывод окна на экран, при повторном вызове игнорируется
mov ebx,10*65536+50
mov ecx,30*65536+20
mov edx,2 ;id для кнопки
mov esi,[sc.work_button] ;системный цвет кнопки
mcall 8 ;кнопка
mov ebx,15*65536+35
mov ecx,[sc.work_button_text] ;системный цвет текста на кнопке
or ecx,0x80000000
mov edx,txt_open
mcall 4 ;подпись кнопки
mcall 12,2 ;конец прорисовки окна
ret
align 4
button:
mcall 17 ;получить код нажатой кнопки
cmp ah,2
jne @f
call but_open_dlg
@@:
cmp ah,1
jne still
.exit:
mcall -1 ;выход из программы
align 4
but_open_dlg:
pushad
copy_path open_dialog_name,communication_area_default_path,file_name,0
mov [OpenDialog_data.type],0
stdcall [OpenDialog_Start],OpenDialog_data
cmp [OpenDialog_data.status],2
je @f
cmp [OpenDialog_data.status],0 ;пользователь нажал Cancel?
je .end_open
;код при удачном открытии диалога
;...
jmp .end_open
@@:
;код при не удачном открытии диалога
;...
.end_open:
popad
ret
;дынные для диалога открытия файлов
align 4
OpenDialog_data:
.type dd 0 ;0 - открыть, 1 - сохранить, 2 - выбрать директорию
.procinfo dd procinfo ;+4
.com_area_name dd communication_area_name ;+8
.com_area dd 0 ;+12
.opendir_path dd plugin_path ;+16
.dir_default_path dd default_dir ;+20
.start_path dd file_name ;+24 путь к диалогу открытия файлов
.draw_window dd draw_window ;+28
.status dd 0 ;+32
.openfile_path dd openfile_path ;+36 путь к открываемому файлу
.filename_area dd filename_area ;+40
.filter_area dd Filter
.x:
.x_size dw 420 ;+48 ; Window X size
.x_start dw 10 ;+50 ; Window X position
.y:
.y_size dw 320 ;+52 ; Window y size
.y_start dw 10 ;+54 ; Window Y position
default_dir db '/rd/1',0 ;директория по умолчанию
communication_area_name:
db 'FFFFFFFF_open_dialog',0
open_dialog_name:
db 'opendial',0
communication_area_default_path:
db '/rd/1/File managers/',0
Filter:
dd Filter.end - Filter.1
.1:
db 'ASM',0
db 'INC',0
db 'TXT',0
.end:
db 0
align 4
proclib_import: ;описание экспортируемых функций
OpenDialog_Init dd aOpenDialog_Init
OpenDialog_Start dd aOpenDialog_Start
dd 0,0
aOpenDialog_Init db 'OpenDialog_init',0
aOpenDialog_Start db 'OpenDialog_start',0
head_f_i:
head_f_l db 'Системная ошибка',0
err_message_found_lib0 db 'Не найдена библиотека ',39,'proc_lib.obj',39,0
err_message_import0 db 'Ошибка при импорте библиотеки ',39,'proc_lib.obj',39,0
system_dir0 db '/sys/lib/'
lib0_name db 'proc_lib.obj',0
;library structures
l_libs_start:
lib0 l_libs lib0_name, sys_path, file_name, system_dir0, err_message_found_lib0, head_f_l, proclib_import,err_message_import0, head_f_i
load_lib_end:
hed db 'пример использования ',39,'OpenDialog',39,0
txt_open db 'Открыть',0
sc system_colors ;структура с системными цветами
i_end: ;конец кода
rb 1024
procinfo process_information
stacktop:
sys_path:
rb 4096
file_name:
rb 4096
plugin_path:
rb 4096
openfile_path:
rb 4096
filename_area:
rb 256
mem:
Структура OpenDialog
OpenDialog_data:
.type dd ?
.procinfo dd ? ;+4
.com_area_name dd ? ;+8
.com_area dd ? ;+12
.opendir_path dd ? ;+16
.dir_default_path dd ? ;+20
.start_path dd ? ;+24
.draw_window dd ? ;+28
.status dd ? ;+32
.openfile_path dd ? ;+36
.filename_area dd ? ;+40
.filter_area dd ?
.x:
.x_size dw ? ;+48
.x_start dw ? ;+50
.y:
.y_size dw ? ;+52
.y_start dw ? ;+54
.type
- тип диалога, если:- 0 - открыть,
- 1 - сохранить,
- 2 - выбрать директорию.
.opendir_path
- директория, которая открывается при запуске диалога..dir_default_path
- директория, которая открывается по умолчанию (если путь в .openfile_path пустой)..start_path
- путь к opendial (по-умолчанию это /sys/File managers/opendial)..draw_window
- указатель на функцию рисования окна программы, которая вызвала диалог.status
- результат работы диалога (0 - пользователь нажал Cancel, 1 - пользователь нажал Open, 2 - диалог не смог открыться).openfile_path
- путь к открываемому файлу, получаемый в результате работы с окном диалога..filter_area
- указатель на данные расширений отображаемых (отфильтрованных) файлов..x_size
- ширина окна диалога..y_size
- высота окна диалога.
Автор
Mario
Если сложна
Для программ, где сложно добавить Open_Dial можно использовать костыль: программу /sys/lod
Подробнее: http://board.kolibrios.org/viewtopic.php?t=2486
|