Board.KolibriOS.org
http://board.kolibrios.org/

InputBox
http://board.kolibrios.org/viewtopic.php?f=24&t=3767
Страница 1 из 1

Автор:  0CodErr [ Пт сен 28, 2018 6:03 pm ]
Заголовок сообщения:  InputBox

Начал делать компонент InputBox.
Прототип функции такой(UASM\Pascal\C):
Код:
InputBox Proto Buffer:Ptr, Caption:Ptr, Prompt:Ptr, Default:Ptr, Flags:Dword, BufferSize:Dword, RedrawProc:Ptr             
Код:
Function InputBox(Buffer: Pointer; Caption, Prompt, Default: PChar; Flags, BufferSize: Dword; RedrawProc: Proc) : LongBool;         
Код:
unsigned long __stdcall InputBox(void* Buffer, char* Caption, char* Prompt, char* Default,
                                     unsigned long Flags, unsigned long BufferSize, void* RedrawProc)
    Buffer — по этому адресу будет записано возвращаемое значение
    Caption — заголовок окна InputBox
    Prompt — сообщение отображаемое в окне и предлагающее пользователю ввести данные
    Default — значение по умолчанию, отображается в текстовом поле
    Flags — опции, флаги
    BufferSize — размер буфера под возвращаемое значение
    RedrawProc — процедура перерисовки окна, вызывается при активации родительского окна

Функция возвращает код ошибки или 0(IBE_NO_ERROR) в случае успеха.

Flags = [MOUSE|SCREEN|PARENT][NUMBER|STRING]:
    IBF_STRING = 0 — в буфер будет записана строка
    IBF_NUMBER = 1 — в буфер будет записано число
    IBF_MOUSE_REL = 0 — относительно положения указателя мыши
    IBF_SCREEN_REL = 8 — относительно экрана
    IBF_PARENT_REL = 16 — относительно родительского окна
Errors:
    IBE_NO_ERROR = 0 — успешно, нет ошибки
    IBE_NUMBER_OVERFLOW = 1 — переполнение при вводе числа

Предполагается работать примерно так:
Код:
Var
  Err: LongBool;
  X: LongInt;
  Txt: Array[0..10] Of Char;

// Ввод числа в переменную X
  Err := InputBox(@X, 'Input', 'Enter value', '-100', IBF_NUMBER, SizeOf(X), @On_Redraw);
  If Not Err Then       // Если нет ошибки
    DoSomething;        // продолжаем работу
  Else                  // иначе
    InputBoxError(Err); // обрабатываем ошибку

// Ввод строки в буфер Txt, Flags = 0, но можно вместо нуля написать IBF_STRING
   InputBox(@Txt, 'Input', 'Enter string', 'my text', 0, SizeOf(Txt), @On_Redraw);

Для использования нужно загрузить библиотеку InputBox.obj и использовать функцию InputBox из неё.

Размер шрифта зависит от системной настройки.
Вот так выглядят примеры
Вложение:
InputBox1.png
InputBox1.png [ 15.71 КБ | 1096 просмотров ]
Вложение:
InputBox2.png
InputBox2.png [ 13.83 КБ | 1096 просмотров ]
Можно проверить, как это работает, есть сборка уже вместе с InputBox, в ней есть папка "$$$_TEST_$$$", там примеры, использующие InputBox.
Исходники примеров в TEST_SRC.7z:
    один на ассемблере собирается с помощью UASM
    другой на C — с помощью BCC32
Там же и исходники самого InputBoxInputBox_SRC.7z.
Вложение:
test(InputBox).7z [1.25 МБ]
21 скачивание

Автор:  akron1 [ Пт сен 28, 2018 8:49 pm ]
Заголовок сообщения:  Re: InputBox

Выглядит симпатично и в использовании удобно. Хорошо бы иметь такую библиотеку для разных диалоговых окон: MsgBox, FindReplace... Знаю, что есть такая библиотека, но она устарела -- мелкий шрифт.

Автор:  Siemargl [ Пт сен 28, 2018 10:34 pm ]
Заголовок сообщения:  Re: InputBox

Закрытые библиотеки это саботаж 100%

Автор:  Leency [ Пт сен 28, 2018 10:54 pm ]
Заголовок сообщения:  Re: InputBox

Похоже исходник лежит в kolibri.img\$$$_TEST_$$$\InputBox_SRC.7z\lib\InputBox.asm

Автор:  0CodErr [ Пн окт 01, 2018 2:57 pm ]
Заголовок сообщения:  Re: InputBox

Siemargl писал(а):
Закрытые библиотеки это саботаж 100%
А к чему ты это написал здесь?
Сможешь объяснить? Или так, от нефиг делать?
Leency писал(а):
Похоже исходник лежит в kolibri.img\$$$_TEST_$$$\InputBox_SRC.7z\lib\InputBox.asm
Да, именно это я и написал в первом сообщении
Вложение:
1.PNG
1.PNG [ 9.19 КБ | 1007 просмотров ]


Я изначально делал по аналогии с OpenDialog и ColorDialog: приложение + библиотека.
Но что-то существенных профитов от этого не обнаружил.
Интересно, какие цели преследовал Марат при разработке OpenDialog и ColorDialog?
Разве что раздельное адресное пространство — может в этом была задумка?

Плюсы варианта "всё вместе в библиотеке":
    нет возни с разделяемой памятью
    не нужно запускать новый процесс
    упрощается код
    один файл вместо двух

Для вызывающего приложения существенной разницы нет — интерфейс остаётся такой же.

Теперь поддерживается ввод 64-битных чисел.
Добавился ещё один код ошибки IBE_RESULT_TOO_LONG. Все константы:
Код:
  ; Flags = [mouse|screen|parent][number|string]
  IBF_STRING = 0      ; в буфер будет записана строка         ; string will be written to the buffer
  IBF_NUMBER = 1      ; в буфер будет записано число          ; number will be written to the buffer
  IBF_MOUSE_REL = 0   ; относительно положения указателя мыши ; relative to the mouse pointer
  IBF_SCREEN_REL = 8  ; относительно экрана                   ; relative to the screen
  IBF_PARENT_REL = 16 ; относительно родительского окна       ; relative to the parent window
 
  ; Errors
  IBE_NO_ERROR = 0        ; успешно, нет ошибки            ; success
  IBE_NUMBER_OVERFLOW = 1 ; переполнение при вводе числа   ; number greater than 0xFFFFFFFFFFFFFFFF
  IBE_RESULT_TOO_LONG = 2 ; результат не умещается в буфер ; result does not fit into buffer

Я переделал вариант "приложение + библиотека", теперь стало "всё вместе в библиотеке".
Исходники примеров остались без изменений.
Если возражений нет, я закоммичу такой вариант.
Если нужны ещё какие-нибудь примеры — могу сделать ещё.
Вложение:
test(InputBox).7z [1.28 МБ]
15 скачиваний

Автор:  Leency [ Пн окт 01, 2018 3:15 pm ]
Заголовок сообщения:  Re: InputBox

В случае с OpenDialog, Марат возможно изначально писал KFM2, потом превратив его в OpenDialog. Что точно знаю, что он хотел на основе OpenDialog потом сделать KFM2.
Возможно отсюда и такая связка.

Автор:  0CodErr [ Пн окт 01, 2018 3:44 pm ]
Заголовок сообщения:  Re: InputBox

Leency писал(а):
он хотел на основе OpenDialog потом сделать KFM2
Ну это он говорил. А ColorDialog просто по аналогии?

Автор:  Siemargl [ Пн окт 01, 2018 5:01 pm ]
Заголовок сообщения:  Re: InputBox

0CodErr писал(а):
Siemargl писал(а):
Закрытые библиотеки это саботаж 100%
А к чему ты это написал здесь?
Сможешь объяснить? Или так, от нефиг делать?
....

Наверное потому что посчитал это частью дельфийской твоей либы, от которой не нашел исходников, когда хотел натравить на нее фрипаскаль.

А первый пост просто проглядел видимо

Автор:  0CodErr [ Пн окт 01, 2018 5:52 pm ]
Заголовок сообщения:  Re: InputBox

Siemargl писал(а):
посчитал это частью дельфийской твоей либы
Первый вариант InputBox как раз был с ней собран, но теперь всё в одной библиотеке.
А так как линкера coff->coff нет, то пришлось скопипастить из неё некоторый код.
Если и как только перейдём на PE, то снова можно будет собирать, просто прилинковав эту библиотеку.
Siemargl писал(а):
не нашел исходников
Плохо искал, значит. Папка "Src" там есть. А ещё вон там viewtopic.php?f=33&t=735&p=68255#p68255 есть ссылки на pastebin.

Автор:  Siemargl [ Пн окт 01, 2018 8:03 pm ]
Заголовок сообщения:  Re: InputBox

0CodErr писал(а):
Siemargl писал(а):
посчитал это частью дельфийской твоей либы
Первый вариант InputBox как раз был с ней собран, но теперь всё в одной библиотеке.
А так как линкера coff->coff нет, то пришлось скопипастить из неё некоторый код.
Если и как только перейдём на PE, то снова можно будет собирать, просто прилинковав эту библиотеку.
Siemargl писал(а):
не нашел исходников
Плохо искал, значит. Папка "Src" там есть.....

"Там" это где?

Про СВН в профильной теме

Автор:  0CodErr [ Сб окт 13, 2018 11:00 am ]
Заголовок сообщения:  Re: InputBox

Загрузил исходники InputBox на svn( http://websvn.kolibrios.org/listing.php ... 8aa795be26 ) и добавил в автосборку.
Также были добавлены примеры использования InputBox(в папке "Examples").

Страница 1 из 1 Часовой пояс: UTC+03:00
Powered by phpBB® Forum Software © phpBB Limited
https://www.phpbb.com/