OpenDialog/ru: Difference between revisions
m (→Пример) |
No edit summary |
||
(7 intermediate revisions by 5 users not shown) | |||
Line 1: | Line 1: | ||
{{DISPLAYTITLE:OpenDialog}} | |||
'''OpenDialog''' — программа, которая является подобием Windows компонента ''Microsoft Common Dialog Control'' или его аналогов в Linux (там их вообще несколько разных присутствует). | |||
Программа имеет 3 режима работы: | Программа имеет 3 режима работы: | ||
*Диалог выбора для открытия файла. | *Диалог выбора для открытия файла. | ||
Line 10: | Line 11: | ||
==Пример== | ==Пример== | ||
Пример подключения диалога открытия файла. Для компиляции в инструкциях ''include'' нужно указать полный путь к папке ''svn''. | Пример подключения диалога открытия файла. Для компиляции в инструкциях ''include'' нужно указать полный путь к папке ''svn''. | ||
< | <syntaxhighlight lang="asm"> | ||
use32 | |||
org 0x0 | org 0x0 | ||
db 'MENUET01' ;идентиф. исполняемого файла всегда 8 байт | db 'MENUET01' ;идентиф. исполняемого файла всегда 8 байт | ||
Line 95: | Line 97: | ||
cmp [OpenDialog_data.status],2 | cmp [OpenDialog_data.status],2 | ||
je @f | je @f | ||
cmp [OpenDialog_data.status],0 ;пользователь нажал Cancel? | |||
je .end_open | |||
;код при удачном открытии диалога | ;код при удачном открытии диалога | ||
;... | ;... | ||
jmp .end_open | |||
@@: | @@: | ||
;код при не удачном открытии диалога | |||
;... | |||
.end_open: | |||
popad | popad | ||
ret | ret | ||
Line 180: | Line 188: | ||
filename_area: | filename_area: | ||
rb 256 | rb 256 | ||
mem:</ | mem: | ||
</syntaxhighlight> | |||
==Структура OpenDialog== | ==Структура OpenDialog== | ||
<asm>OpenDialog_data: | <syntaxhighlight lang="asm"> | ||
OpenDialog_data: | |||
.type dd ? | .type dd ? | ||
.procinfo dd ? ;+4 | .procinfo dd ? ;+4 | ||
Line 201: | Line 211: | ||
.y: | .y: | ||
.y_size dw ? ;+52 | .y_size dw ? ;+52 | ||
.y_start dw ? ;+54</ | .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:Файловые_менеджеры]] | ||
[[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. <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>
.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
|