OpenDialog

From KolibriOS wiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

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

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

OpenD1.png

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

OpenD2.png

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

OpenD3.png
Программа сама физически не открывает на чтение или запись - она предназначена для взаимодействия с пользователем. Результат работы - готовый, полный путь передаваемый через "расшаренную" именованную область памяти к программе использующей 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