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

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

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

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

Сообщение 7bit » 24.01.2018 09:29:23

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

Среда: Lazarus 1.7 x86 (getlazarus.org), Windows 7 x64.
7bit
новенький
 
Сообщения: 14
Зарегистрирован: 01.10.2011 12:35:52

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

Сообщение olegy123 » 24.01.2018 09:56:00

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

Добавлено спустя 1 минуту 42 секунды:
Я вообще создавал свой TDBEdit/TDBGrid c внутренними кнопками вшитыми в поле редактирования.
olegy123
энтузиаст
 
Сообщения: 1037
Зарегистрирован: 25.02.2016 12:10:20

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

Сообщение zub » 24.01.2018 10:15:05

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

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

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

Сообщение 7bit » 24.01.2018 10:28:27

olegy123
Компонент я уже сделал, интересует как сохранить фокус при показе и прокрутке списка. А то пришлось кучу флажков придумывать, чтобы добиться правильного поведения компонента.
zub
Если найду способ, то поделюсь. Земля ж круглая :) .
7bit
новенький
 
Сообщения: 14
Зарегистрирован: 01.10.2011 12:35:52

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

Сообщение olegy123 » 24.01.2018 11:42:26

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


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

Так что придется делать под каждый оконный движ. Либо уходить в графику OGL/DX.
olegy123
энтузиаст
 
Сообщения: 1037
Зарегистрирован: 25.02.2016 12:10:20

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

Сообщение zub » 24.01.2018 11:48:45

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

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

Давай по делу, а не как обычно))
zub
долгожитель
 
Сообщения: 2462
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение olegy123 » 24.01.2018 11:52:57

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

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

Сообщение zub » 24.01.2018 11:57:48

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

http://forum.lazarus.freepascal.org/ind ... ppbledtrn7 незнаю, чем там дело кончилось. помню были темы конкретно про кражу фокуса
zub
долгожитель
 
Сообщения: 2462
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение LearnMagic » 24.01.2018 12:00:29

7bit, посмотри реализацию в EditBtn или библиотеке RX
LearnMagic
новенький
 
Сообщения: 57
Зарегистрирован: 10.11.2016 23:13:38

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

Сообщение olegy123 » 24.01.2018 12:12:16

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

Любой примитив(кроме графически оформленных в одном окне, такие тоже могут быть..) - это самостоятельное окно, сам TComboBox - типичный TEdit, во время работы он создает еще одно окно под собой - список. Это уже два окна, взаимодействия могут быть как дубовыми - работа с хендлами в одном компоненте, так и посредством PostMessage..
olegy123
энтузиаст
 
Сообщения: 1037
Зарегистрирован: 25.02.2016 12:10:20

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

Сообщение 7bit » 24.01.2018 12:21:05

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

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

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

zub, Ваши ссылки почему-то не открываются.
7bit
новенький
 
Сообщения: 14
Зарегистрирован: 01.10.2011 12:35:52

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

Сообщение olegy123 » 24.01.2018 12:21:48

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 секунд:
Компоненты между собой могут обмениваться сообщениями. Изучите эту науку, она проста.. Тогда вы научитесь украшать и управлять поведением компонент.
olegy123
энтузиаст
 
Сообщения: 1037
Зарегистрирован: 25.02.2016 12:10:20

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

Сообщение 7bit » 24.01.2018 16:17:51

olegy123, спасибо огромное за ссылки! Теперь понятно, что надо делать.
7bit
новенький
 
Сообщения: 14
Зарегистрирован: 01.10.2011 12:35:52

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

Сообщение zub » 24.01.2018 16:20:51

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

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

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

Сообщение olegy123 » 24.01.2018 16:44:36

Как из простого 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 в одних текстурах. до конца января черновик опубликую.
olegy123
энтузиаст
 
Сообщения: 1037
Зарегистрирован: 25.02.2016 12:10:20

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: MailRu[bot] и гости: 11

Рейтинг@Mail.ru