Difference between revisions of "OpenDialog/ru"

From KolibriOS wiki
Jump to navigation Jump to search
m
Line 50: Line 50:
 
align 4
 
align 4
 
draw_window:
 
draw_window:
  mcall 12,1 ;начало прорисовки окна
+
mcall 12,1 ;начало прорисовки окна
  
  xor eax,eax
+
xor eax,eax
  mov ebx,80*65536+250
+
mov ebx,80*65536+250
  mov ecx,80*65536+150
+
mov ecx,80*65536+150
  mov edx,[sc.work]
+
mov edx,[sc.work]
  or  edx,0x33000000
+
or  edx,0x33000000
  mov edi,hed
+
mov edi,hed
  mcall ;вывод окна на экран, при повторном вызове игнорируется
+
mcall ;вывод окна на экран, при повторном вызове игнорируется
  
  mov ebx,10*65536+50
+
mov ebx,10*65536+50
  mov ecx,30*65536+20
+
mov ecx,30*65536+20
  mov edx,2 ;id для кнопки
+
mov edx,2 ;id для кнопки
  mov esi,[sc.work_button] ;системный цвет кнопки
+
mov esi,[sc.work_button] ;системный цвет кнопки
  mcall 8 ;кнопка
+
mcall 8 ;кнопка
  
  mov ebx,15*65536+35
+
mov ebx,15*65536+35
  mov ecx,[sc.work_button_text] ;системный цвет текста на кнопке
+
mov ecx,[sc.work_button_text] ;системный цвет текста на кнопке
  or  ecx,0x80000000
+
or  ecx,0x80000000
  mov edx,txt_open
+
mov edx,txt_open
  mcall 4 ;подпись кнопки
+
mcall 4 ;подпись кнопки
 
    
 
    
  mcall 12,2 ;конец прорисовки окна
+
mcall 12,2 ;конец прорисовки окна
  ret
+
ret
  
 
align 4
 
align 4
Line 104: Line 104:
 
align 4
 
align 4
 
OpenDialog_data:
 
OpenDialog_data:
.type dd 0 ;0 - открыть, 1 - сохранить, 2 - выбрать дтректорию
+
.type dd 0 ;0 - открыть, 1 - сохранить, 2 - выбрать директорию
.procinfo dd procinfo ;+4
+
.procinfo dd procinfo ;+4
.com_area_name dd communication_area_name ;+8
+
.com_area_name dd communication_area_name ;+8
.com_area dd 0 ;+12
+
.com_area dd 0 ;+12
.opendir_path dd plugin_path ;+16
+
.opendir_path dd plugin_path ;+16
.dir_default_path dd openfile_path ;+20
+
.dir_default_path dd default_dir ;+20
 
.start_path dd file_name ;+24 путь к диалогу открытия файлов
 
.start_path dd file_name ;+24 путь к диалогу открытия файлов
.draw_window dd draw_window ;+28
+
.draw_window dd draw_window ;+28
.status dd 0 ;+32
+
.status dd 0 ;+32
.openfile_path dd openfile_path ;+36 путь к открываемому файлу
+
.openfile_path dd openfile_path ;+36 путь к открываемому файлу
.filename_area dd filename_area ;+40
+
.filename_area dd filename_area ;+40
 
.filter_area dd Filter
 
.filter_area dd Filter
 
.x:
 
.x:
Line 122: Line 122:
 
.y_size dw 320 ;+52 ; Window y size
 
.y_size dw 320 ;+52 ; Window y size
 
.y_start dw 10 ;+54 ; Window Y position
 
.y_start dw 10 ;+54 ; Window Y position
 +
 +
default_dir db '/rd/1',0 ;директория по умолчанию
  
 
communication_area_name:
 
communication_area_name:
Line 179: Line 181:
 
rb 256
 
rb 256
 
mem:</asm>
 
mem:</asm>
 +
 +
==Структура OpenDialog==
 +
<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</asm>
 +
 +
* '''.type''' - тип диалога, если: 0 - открыть, 1 - сохранить, 2 - выбрать директорию.
 +
* '''.opendir_path''' - директория, которая открывается при запуске диалога.
 +
* '''.dir_default_path''' - директория, которая открывается по умолчанию если ''.openfile_path'' пустой.
 +
* '''.start_path''' - путь по которому будет открываться окно диалога (в системе это папка ''/rd/1/File managers/'').
  
 
==Разработчик==
 
==Разработчик==

Revision as of 09:42, 25 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 ;маска ожидаемых событий 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 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:</asm>

Структура OpenDialog

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

  • .type - тип диалога, если: 0 - открыть, 1 - сохранить, 2 - выбрать директорию.
  • .opendir_path - директория, которая открывается при запуске диалога.
  • .dir_default_path - директория, которая открывается по умолчанию если .openfile_path пустой.
  • .start_path - путь по которому будет открываться окно диалога (в системе это папка /rd/1/File managers/).

Разработчик

Mario