OpenDialog/ru: Difference between revisions

From KolibriOS wiki
Jump to navigation Jump to search
(New page: Программа является подобием Windows компонента ''Microsoft Common Dialog Control'' или его аналогов в Linux (там их вообще не...)
 
No edit summary
 
(15 intermediate revisions by 5 users not shown)
Line 1: Line 1:
Программа является подобием Windows компонента ''Microsoft Common Dialog Control'' или его аналогов в Linux (там их вообще несколько разных присутствует).
{{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 режима работы:

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

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