Аналог компонента TComboBox

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

7bit
новенький
Сообщения: 43
Зарегистрирован: 01.10.2011 12:35:52

Аналог компонента TComboBox

Сообщение 7bit »

Добрый день. По некоторым причинам не устраивает работа стандартного компонента, решил сделать свой. Компонент наследуется от TDBEdit (приложение работает с базой данных) с привязанной сбоку кнопкой раскрытия списка (по аналогии с TComboBox). Список представляет собой окно с гридом TStringGrid. Но не нравится, что при открытии списка, фокус передается окну списка. Можно ли как-то сделать, задать какие-то параметры окну, чтобы фокус не передавался окну при показе окна и при клике мышкой (когда пользователь прокручивает содержимое списка, например)? Т. е. также, как это реализовано в стандартном TComboBox - при раскрытии списка и прокрутке мышкой фокус остается на текущем окне и компоненте.

Среда: Lazarus 1.7 x86 (getlazarus.org), Windows 7 x64.
olegy123
долгожитель
Сообщения: 1643
Зарегистрирован: 25.02.2016 11:10:20

Сообщение olegy123 »

Есть три пути:
1) Искать готовый компонент, написанным кем-то. Они есть.
2) Просто подставлять под редактирование, в нужную ячейку TComboBox.
3) Написать свой TDBEdit. Это не сложно, как пример http://www.delphikingdom.com/asp/viewit ... alogid=806

Добавлено спустя 1 минуту 42 секунды:
Я вообще создавал свой TDBEdit/TDBGrid c внутренними кнопками вшитыми в поле редактирования.
zub
долгожитель
Сообщения: 2890
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

7bit
Найдете нормальное решение - поделитесь.
ЕМНИП на http://forum.lazarus.freepascal.org было несколько похожих тем

olegy123
Проблема не в написании компонента или вшивании кнопок, проблема в окне не крадущем фокус у текущего. Я кроссплатформенных реализаций такого не встречал (но и сильно не интересовался, мне нужно было для комбобокса выбора слоев в зкаде. кража фокуса раздражжала, но не настолько)
7bit
новенький
Сообщения: 43
Зарегистрирован: 01.10.2011 12:35:52

Сообщение 7bit »

olegy123
Компонент я уже сделал, интересует как сохранить фокус при показе и прокрутке списка. А то пришлось кучу флажков придумывать, чтобы добиться правильного поведения компонента.
zub
Если найду способ, то поделюсь. Земля ж круглая :) .
olegy123
долгожитель
Сообщения: 1643
Зарегистрирован: 25.02.2016 11:10:20

Сообщение olegy123 »

zub писал(а):Проблема не в написании компонента или вшивании кнопок, проблема в окне не крадущем фокус у текущего. Я кроссплатформенных реализаций такого не встречал (но и сильно не интересовался, мне нужно было для комбобокса выбора слоев в зкаде. кража фокуса раздражжала, но не настолько)


Есть же программное переключение фокуса, и список поверх всех окон.
В X каждое окно - это отдельный слой, тут дубовое исполнение. винде есть перекрытие - программно регионами делят. Сейчас все дружно пересели на ускорители. какой нибудь wayland может иметь свой особый подход. Универсального подхода для всех нет.

Так что придется делать под каждый оконный движ. Либо уходить в графику OGL/DX.
zub
долгожитель
Сообщения: 2890
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

>>Есть же программное переключение фокуса, и список поверх всех окон.
так и сделал. но это совсем не то. переключение заметно глазу.

В X каждое окно - это отдельный слой, тут дубовое исполнение. винде есть перекрытие - программно регионами делят. Сейчас все дружно пересели на ускорители. какой нибудь wayland может иметь свой особый подход.

Давай по делу, а не как обычно))
olegy123
долгожитель
Сообщения: 1643
Зарегистрирован: 25.02.2016 11:10:20

Сообщение olegy123 »

7bit писал(а):Компонент я уже сделал, интересует как сохранить фокус при показе и прокрутке списка. А то пришлось кучу флажков придумывать, чтобы добиться правильного поведения компонента.
Вам же понравился TComoboBox.
Можно сделать свой, на основе исходников TComoboBox.
Либо TComoboBox добавить DB функционала. Там не сложно. Нужно ознакомить с TDataSource и его состояниями TDataSetState = (dsInactive, dsBrowse, dsEdit, dsInsert, dsSetKey, dsCalcFields, dsFilter, dsNewValue, dsOldValue, dsCurValue, dsBlockRead, dsInternalCalc, dsOpening); и менять поведение TComoboBox.
zub
долгожитель
Сообщения: 2890
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

>>Можно сделать свой, на основе исходников TComoboBox.
Ну вот мои хотелки не сделать на основе TComoboBox - нужна обработка клика без закрытия выпадающего окна

http://forum.lazarus.freepascal.org/ind ... ppbledtrn7 незнаю, чем там дело кончилось. помню были темы конкретно про кражу фокуса
LearnMagic
новенький
Сообщения: 66
Зарегистрирован: 10.11.2016 22:13:38

Сообщение LearnMagic »

7bit, посмотри реализацию в EditBtn или библиотеке RX
olegy123
долгожитель
Сообщения: 1643
Зарегистрирован: 25.02.2016 11:10:20

Сообщение olegy123 »

zub писал(а):Давай по делу, а не как обычно))

Любой примитив(кроме графически оформленных в одном окне, такие тоже могут быть..) - это самостоятельное окно, сам TComboBox - типичный TEdit, во время работы он создает еще одно окно под собой - список. Это уже два окна, взаимодействия могут быть как дубовыми - работа с хендлами в одном компоненте, так и посредством PostMessage..
7bit
новенький
Сообщения: 43
Зарегистрирован: 01.10.2011 12:35:52

Сообщение 7bit »

olegy123 писал(а):Вам же понравился TComoboBox.
Можно сделать свой, на основе исходников TComoboBox.
Либо TComoboBox добавить DB функционала.

В программе сейчас и так используется наследник TDBComboBox. Но есть проблемы: при одинаковых элементах в списке всегда выделяется самый верхний при раскрытии списка, независимо от того какой был выбран на самом деле. А у меня привязка id записи к элементам. (TDBLookupComboBox мне не подходит.) Также нельзя показать в списке несколько столбцов (хотя в инете находил способ с отрисовкой элементов).

Нашел в инете исходники EhLib. Пытаюсь разобраться с TDBComboBoxEh.

zub, Ваши ссылки почему-то не открываются.
olegy123
долгожитель
Сообщения: 1643
Зарегистрирован: 25.02.2016 11:10:20

Сообщение olegy123 »

zub писал(а):http://forum.lazarus.freepascal.org/ind ... ppbledtrn7 незнаю, чем там дело кончилось. помню были темы конкретно про кражу фокуса
Быть может у gtk есть в активе своя реализация TCombobox-а, Lazarus просто вайперить.
Вот вполне у GTK фокус теряется..
Никто не мешает самому подставлять окошко и перенаправлять нужные события родителю.

Добавлено спустя 2 минуты 47 секунд:
реализация Hint-ов вполне подойдет, там топовое окошко ничего не делает, только показывает что нужно в данный момент времени. А обновляет его родившее это окошко компонент.

Добавлено спустя 3 минуты 1 секунду:
Я бы не советовал изучать сразу EhLib, там много сложного..
посмотрите как расписано тут.
http://delphikingdom.com/asp/viewitem.a ... logid=1213

Добавлено спустя 23 минуты 31 секунду:
Взаимодействие с разными компонентами:
http://delphikingdom.com/asp/viewitem.asp?catalogid=317
http://delphikingdom.com/asp/viewitem.asp?catalogid=771
http://delphikingdom.com/asp/viewitem.a ... logid=1443

Добавлено спустя 5 минут 36 секунд:
Компоненты между собой могут обмениваться сообщениями. Изучите эту науку, она проста.. Тогда вы научитесь украшать и управлять поведением компонент.
7bit
новенький
Сообщения: 43
Зарегистрирован: 01.10.2011 12:35:52

Сообщение 7bit »

olegy123, спасибо огромное за ссылки! Теперь понятно, что надо делать.
zub
долгожитель
Сообщения: 2890
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

>>Быть может у gtk есть в активе своя реализация TCombobox-а, Lazarus просто вайперить.
конечно есть. как и у win и у qt, это обертка над стандартным контролом. Глубоко внутрь туда не залезешь.

>>Компоненты между собой могут обмениваться сообщениями. Изучите эту науку, она проста.. Тогда вы научитесь украшать и управлять поведением компонент.
Это наука совсем не про то. Дай реализацию ТНеКрадущаяФокусForm под win, gtk и qt. Всего делов))
olegy123
долгожитель
Сообщения: 1643
Зарегистрирован: 25.02.2016 11:10:20

Сообщение olegy123 »

Как из простого TEdit сделать TDBEdit
https://rsdn.org/article/delphi/dbaware.xml
Варианты попроще:
http://www.delphisources.ru/pages/faq/b ... comps.html
http://delphidabbler.com/tips/194
http://www.castle-cadenza.demon.co.uk/example.htm

Добавлено спустя 9 минут 8 секунд:
zub писал(а):Дай реализацию ТНеКрадущаяФокусForm под win, gtk и qt. Всего делов))

:D
Надо доделывать, в праздники упал я в синюю яму, хотел вылезти, друзья не давали..
Скоро будет под win, gtk и qt в одних текстурах. до конца января черновик опубликую.
Ответить