OpenDialog/ru: Difference between revisions

From KolibriOS wiki
Jump to navigation Jump to search
No edit summary
(подключение через proc_lib.obj)
Line 7: Line 7:
*Диалог выбора директории.
*Диалог выбора директории.
[[Image:OpenD3.png]]
[[Image:OpenD3.png]]
<br>Программа сама физически не открывает на чтение или запись - она предназначена для взаимодействия с пользователем. Результат работы - готовый, полный путь передаваемый через "расшаренную" именованную область памяти к программе использующей OpenDialog.
<br>Программа сама физически не открывает на чтение или запись - она предназначена для взаимодействия с пользователем. Результат работы - готовый, полный путь передаваемый через "расшаренную" именованную область памяти к программе использующей '''OpenDialog'''. Для использования OpenDialog была создана библиотека '''proc_lib.obj'''.
==Пример==
==Пример==
Пример подключения диалога открытия файла. Для компиляции в инструкциях ''include'' нужно указать полный путь к папке ''svn''.
Пример подключения диалога открытия файла. Для компиляции в инструкциях ''include'' нужно указать полный путь к папке ''svn''.
<asm>use32
<asm>use32
  org 0x0
org 0x0
  db 'MENUET01' ;идентиф. исполняемого файла всегда 8 байт
db 'MENUET01' ;идентиф. исполняемого файла всегда 8 байт
  dd 0x1
dd 0x1
  dd start
dd start
  dd i_end ; размер приложения
dd i_end ; размер приложения
  dd mem
dd mem
  dd stacktop
dd stacktop
  dd 0x0
dd 0x0
  dd cur_path
dd sys_path


include 'svn/programs/macros.inc' ;подключаем необходимые стандартные макросы
include 'svn/programs/macros.inc' ;подключаем необходимые стандартные макросы
include 'svn/programs/develop/libraries/box_lib/asm/trunk/opendial.mac' ;макросы диалога открытия файлов
include 'svn/programs/develop/libraries/box_lib/load_lib.mac' ;макрос для загрузки библиотек
include 'svn/programs/develop/libraries/box_lib/load_lib.mac' ;отсюда используем макрос 'copy_path'
include 'svn/programs/proc32.inc' ;что-бы работали макросы stdcall
use_OpenDialog
 
@use_library ;библиотеки не подключаем, но это нужно для использования макроса 'copy_path'
@use_library


align 4
align 4
start: ;начало программы
start: ;начало программы
load_libraries l_libs_start,load_lib_end
mcall 48,3,sc,sizeof.system_colors ;получить системные цвета
mcall 48,3,sc,sizeof.system_colors ;получить системные цвета
mcall 40,0x25 ;маска ожидаемых событий
mcall 40,0x25 ;маска ожидаемых событий
mcall 68,11 ;что-бы работали функции выделения/освобождения памяти
mcall 68,11 ;что-бы работали функции выделения/освобождения памяти
init_OpenDialog OpenDialog_data
stdcall [OpenDialog_Init],OpenDialog_data


align 4
align 4
Line 40: Line 41:
align 4
align 4
still: ;главный цикл
still: ;главный цикл
  mcall 10
mcall 10


  cmp al,0x1 ;изменилось положение окна ?
cmp al,0x1 ;изменилось положение окна ?
  jz red_win
jz red_win
  cmp al,0x3 ;нажали кнопку ?
cmp al,0x3 ;нажали кнопку ?
  jz button
jz button
  jmp still
jmp still


align 4
align 4
Line 77: Line 78:
align 4
align 4
button:
button:
  mcall 17 ;получить код нажатой кнопки
mcall 17 ;получить код нажатой кнопки
  cmp ah,2
cmp ah,2
  jne @f
jne @f
    call but_open_dlg
call but_open_dlg
  @@:
@@:
  cmp ah,1
cmp ah,1
  jne still
jne still
.exit:
.exit:
  mcall -1 ;выход из программы
mcall -1 ;выход из программы


align 4
align 4
Line 92: Line 93:
copy_path open_dialog_name,communication_area_default_path,file_name,0
copy_path open_dialog_name,communication_area_default_path,file_name,0
mov [OpenDialog_data.type],0
mov [OpenDialog_data.type],0
start_OpenDialog OpenDialog_data
stdcall [OpenDialog_Start],OpenDialog_data
cmp [OpenDialog_data.status],2
cmp [OpenDialog_data.status],2
je @f
je @f
Line 116: Line 117:
.filename_area dd filename_area ;+40
.filename_area dd filename_area ;+40
.filter_area dd Filter
.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


communication_area_name:
communication_area_name:
Line 132: Line 139:
.end:
.end:
db 0
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
hed db 'пример использования ',39,'OpenDialog',39,0
Line 141: Line 169:
procinfo process_information
procinfo process_information
stacktop:
stacktop:
cur_path:
sys_path:
rb 4096
rb 4096
file_name:
file_name:
Line 152: Line 180:
rb 256
rb 256
mem:</asm>
mem:</asm>
==Разработчик==
==Разработчик==
'''Mario'''
'''Mario'''

Revision as of 11:07, 24 August 2010

Программа является подобием Windows компонента Microsoft Common Dialog Control или его аналогов в Linux (там их вообще несколько разных присутствует). Программа имеет 3 режима работы:

  • Диалог выбора для открытия файла.

OpenD1.png

  • Диалог выбора для сохранения файла.

OpenD2.png

  • Диалог выбора директории.

OpenD3.png
Программа сама физически не открывает на чтение или запись - она предназначена для взаимодействия с пользователем. Результат работы - готовый, полный путь передаваемый через "расшаренную" именованную область памяти к программе использующей OpenDialog. Для использования OpenDialog была создана библиотека proc_lib.obj.

Пример

Пример подключения диалога открытия файла. Для компиляции в инструкциях include нужно указать полный путь к папке svn. <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 ;маска ожидаемых событий mcall 68,11 ;что-бы работали функции выделения/освобождения памяти 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 ;код при удачном открытии диалога ;... @@: 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 openfile_path ;+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

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:</asm>

Разработчик

Mario