Page 1 of 1

InputBox

Posted: Fri Sep 28, 2018 6:03 pm
by 0CodErr
Начал делать компонент InputBox.
Прототип функции такой(UASM\Pascal\C):

Code: Select all

InputBox Proto Buffer:Ptr, Caption:Ptr, Prompt:Ptr, Default:Ptr, Flags:Dword, BufferSize:Dword, RedrawProc:Ptr             

Code: Select all

Function InputBox(Buffer: Pointer; Caption, Prompt, Default: PChar; Flags, BufferSize: Dword; RedrawProc: Proc) : LongBool;         

Code: Select all

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 — переполнение при вводе числа
Предполагается работать примерно так:

Code: Select all

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 KiB)
Viewed 13692 times
InputBox2.png
InputBox2.png (13.83 KiB)
Viewed 13692 times
Можно проверить, как это работает, есть сборка уже вместе с InputBox, в ней есть папка "$$$_TEST_$$$", там примеры, использующие InputBox.
Исходники примеров в TEST_SRC.7z:
  • один на ассемблере собирается с помощью UASM
    другой на C — с помощью BCC32
Там же и исходники самого InputBoxInputBox_SRC.7z.
Downloaded 319 times

Re: InputBox

Posted: Fri Sep 28, 2018 8:49 pm
by akron1
Выглядит симпатично и в использовании удобно. Хорошо бы иметь такую библиотеку для разных диалоговых окон: MsgBox, FindReplace... Знаю, что есть такая библиотека, но она устарела -- мелкий шрифт.

Re: InputBox

Posted: Fri Sep 28, 2018 10:34 pm
by Siemargl
Закрытые библиотеки это саботаж 100%

Re: InputBox

Posted: Fri Sep 28, 2018 10:54 pm
by Leency
Похоже исходник лежит в kolibri.img\$$$_TEST_$$$\InputBox_SRC.7z\lib\InputBox.asm

Re: InputBox

Posted: Mon Oct 01, 2018 2:57 pm
by 0CodErr
Siemargl wrote:Закрытые библиотеки это саботаж 100%
А к чему ты это написал здесь?
Сможешь объяснить? Или так, от нефиг делать?
Leency wrote:Похоже исходник лежит в kolibri.img\$$$_TEST_$$$\InputBox_SRC.7z\lib\InputBox.asm
Да, именно это я и написал в первом сообщении
1.PNG
1.PNG (9.19 KiB)
Viewed 13603 times
Я изначально делал по аналогии с OpenDialog и ColorDialog: приложение + библиотека.
Но что-то существенных профитов от этого не обнаружил.
Интересно, какие цели преследовал Марат при разработке OpenDialog и ColorDialog?
Разве что раздельное адресное пространство — может в этом была задумка?

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

Теперь поддерживается ввод 64-битных чисел.
Добавился ещё один код ошибки IBE_RESULT_TOO_LONG. Все константы:

Code: Select all

  ; 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
Я переделал вариант "приложение + библиотека", теперь стало "всё вместе в библиотеке".
Исходники примеров остались без изменений.
Если возражений нет, я закоммичу такой вариант.
Если нужны ещё какие-нибудь примеры — могу сделать ещё.
Downloaded 326 times

Re: InputBox

Posted: Mon Oct 01, 2018 3:15 pm
by Leency
В случае с OpenDialog, Марат возможно изначально писал KFM2, потом превратив его в OpenDialog. Что точно знаю, что он хотел на основе OpenDialog потом сделать KFM2.
Возможно отсюда и такая связка.

Re: InputBox

Posted: Mon Oct 01, 2018 3:44 pm
by 0CodErr
Leency wrote:он хотел на основе OpenDialog потом сделать KFM2
Ну это он говорил. А ColorDialog просто по аналогии?

Re: InputBox

Posted: Mon Oct 01, 2018 5:01 pm
by Siemargl
0CodErr wrote:
Siemargl wrote:Закрытые библиотеки это саботаж 100%
А к чему ты это написал здесь?
Сможешь объяснить? Или так, от нефиг делать?
....
Наверное потому что посчитал это частью дельфийской твоей либы, от которой не нашел исходников, когда хотел натравить на нее фрипаскаль.

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

Re: InputBox

Posted: Mon Oct 01, 2018 5:52 pm
by 0CodErr
Siemargl wrote:посчитал это частью дельфийской твоей либы
Первый вариант InputBox как раз был с ней собран, но теперь всё в одной библиотеке.
А так как линкера coff->coff нет, то пришлось скопипастить из неё некоторый код.
Если и как только перейдём на PE, то снова можно будет собирать, просто прилинковав эту библиотеку.
Siemargl wrote:не нашел исходников
Плохо искал, значит. Папка "Src" там есть. А ещё вон там http://board.kolibrios.org/viewtopic.ph ... 255#p68255 есть ссылки на pastebin.

Re: InputBox

Posted: Mon Oct 01, 2018 8:03 pm
by Siemargl
0CodErr wrote:
Siemargl wrote:посчитал это частью дельфийской твоей либы
Первый вариант InputBox как раз был с ней собран, но теперь всё в одной библиотеке.
А так как линкера coff->coff нет, то пришлось скопипастить из неё некоторый код.
Если и как только перейдём на PE, то снова можно будет собирать, просто прилинковав эту библиотеку.
Siemargl wrote:не нашел исходников
Плохо искал, значит. Папка "Src" там есть.....
"Там" это где?

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

Re: InputBox

Posted: Sat Oct 13, 2018 11:00 am
by 0CodErr
Загрузил исходники InputBox на svn( http://websvn.kolibrios.org/listing.php ... 8aa795be26 ) и добавил в автосборку.
Также были добавлены примеры использования InputBox(в папке "Examples").