Аналог компонента TComboBox
Модератор: Модераторы
Аналог компонента TComboBox
Добрый день. По некоторым причинам не устраивает работа стандартного компонента, решил сделать свой. Компонент наследуется от TDBEdit (приложение работает с базой данных) с привязанной сбоку кнопкой раскрытия списка (по аналогии с TComboBox). Список представляет собой окно с гридом TStringGrid. Но не нравится, что при открытии списка, фокус передается окну списка. Можно ли как-то сделать, задать какие-то параметры окну, чтобы фокус не передавался окну при показе окна и при клике мышкой (когда пользователь прокручивает содержимое списка, например)? Т. е. также, как это реализовано в стандартном TComboBox - при раскрытии списка и прокрутке мышкой фокус остается на текущем окне и компоненте.
Среда: Lazarus 1.7 x86 (getlazarus.org), Windows 7 x64.
Среда: Lazarus 1.7 x86 (getlazarus.org), Windows 7 x64.
Есть три пути:
1) Искать готовый компонент, написанным кем-то. Они есть.
2) Просто подставлять под редактирование, в нужную ячейку TComboBox.
3) Написать свой TDBEdit. Это не сложно, как пример http://www.delphikingdom.com/asp/viewit ... alogid=806
Добавлено спустя 1 минуту 42 секунды:
Я вообще создавал свой TDBEdit/TDBGrid c внутренними кнопками вшитыми в поле редактирования.
1) Искать готовый компонент, написанным кем-то. Они есть.
2) Просто подставлять под редактирование, в нужную ячейку TComboBox.
3) Написать свой TDBEdit. Это не сложно, как пример http://www.delphikingdom.com/asp/viewit ... alogid=806
Добавлено спустя 1 минуту 42 секунды:
Я вообще создавал свой TDBEdit/TDBGrid c внутренними кнопками вшитыми в поле редактирования.
7bit
Найдете нормальное решение - поделитесь.
ЕМНИП на http://forum.lazarus.freepascal.org было несколько похожих тем
olegy123
Проблема не в написании компонента или вшивании кнопок, проблема в окне не крадущем фокус у текущего. Я кроссплатформенных реализаций такого не встречал (но и сильно не интересовался, мне нужно было для комбобокса выбора слоев в зкаде. кража фокуса раздражжала, но не настолько)
Найдете нормальное решение - поделитесь.
ЕМНИП на http://forum.lazarus.freepascal.org было несколько похожих тем
olegy123
Проблема не в написании компонента или вшивании кнопок, проблема в окне не крадущем фокус у текущего. Я кроссплатформенных реализаций такого не встречал (но и сильно не интересовался, мне нужно было для комбобокса выбора слоев в зкаде. кража фокуса раздражжала, но не настолько)
olegy123
Компонент я уже сделал, интересует как сохранить фокус при показе и прокрутке списка. А то пришлось кучу флажков придумывать, чтобы добиться правильного поведения компонента.
zub
Если найду способ, то поделюсь. Земля ж круглая
.
Компонент я уже сделал, интересует как сохранить фокус при показе и прокрутке списка. А то пришлось кучу флажков придумывать, чтобы добиться правильного поведения компонента.
zub
Если найду способ, то поделюсь. Земля ж круглая
zub писал(а):Проблема не в написании компонента или вшивании кнопок, проблема в окне не крадущем фокус у текущего. Я кроссплатформенных реализаций такого не встречал (но и сильно не интересовался, мне нужно было для комбобокса выбора слоев в зкаде. кража фокуса раздражжала, но не настолько)
Есть же программное переключение фокуса, и список поверх всех окон.
В X каждое окно - это отдельный слой, тут дубовое исполнение. винде есть перекрытие - программно регионами делят. Сейчас все дружно пересели на ускорители. какой нибудь wayland может иметь свой особый подход. Универсального подхода для всех нет.
Так что придется делать под каждый оконный движ. Либо уходить в графику OGL/DX.
>>Есть же программное переключение фокуса, и список поверх всех окон.
так и сделал. но это совсем не то. переключение заметно глазу.
Давай по делу, а не как обычно))
так и сделал. но это совсем не то. переключение заметно глазу.
В X каждое окно - это отдельный слой, тут дубовое исполнение. винде есть перекрытие - программно регионами делят. Сейчас все дружно пересели на ускорители. какой нибудь wayland может иметь свой особый подход.
Давай по делу, а не как обычно))
Вам же понравился TComoboBox.7bit писал(а):Компонент я уже сделал, интересует как сохранить фокус при показе и прокрутке списка. А то пришлось кучу флажков придумывать, чтобы добиться правильного поведения компонента.
Можно сделать свой, на основе исходников TComoboBox.
Либо TComoboBox добавить DB функционала. Там не сложно. Нужно ознакомить с TDataSource и его состояниями TDataSetState = (dsInactive, dsBrowse, dsEdit, dsInsert, dsSetKey, dsCalcFields, dsFilter, dsNewValue, dsOldValue, dsCurValue, dsBlockRead, dsInternalCalc, dsOpening); и менять поведение TComoboBox.
>>Можно сделать свой, на основе исходников TComoboBox.
Ну вот мои хотелки не сделать на основе TComoboBox - нужна обработка клика без закрытия выпадающего окна
http://forum.lazarus.freepascal.org/ind ... ppbledtrn7 незнаю, чем там дело кончилось. помню были темы конкретно про кражу фокуса
Ну вот мои хотелки не сделать на основе TComoboBox - нужна обработка клика без закрытия выпадающего окна
http://forum.lazarus.freepascal.org/ind ... ppbledtrn7 незнаю, чем там дело кончилось. помню были темы конкретно про кражу фокуса
-
LearnMagic
- новенький
- Сообщения: 66
- Зарегистрирован: 10.11.2016 22:13:38
7bit, посмотри реализацию в EditBtn или библиотеке RX
zub писал(а):Давай по делу, а не как обычно))
Любой примитив(кроме графически оформленных в одном окне, такие тоже могут быть..) - это самостоятельное окно, сам TComboBox - типичный TEdit, во время работы он создает еще одно окно под собой - список. Это уже два окна, взаимодействия могут быть как дубовыми - работа с хендлами в одном компоненте, так и посредством PostMessage..
olegy123 писал(а):Вам же понравился TComoboBox.
Можно сделать свой, на основе исходников TComoboBox.
Либо TComoboBox добавить DB функционала.
В программе сейчас и так используется наследник TDBComboBox. Но есть проблемы: при одинаковых элементах в списке всегда выделяется самый верхний при раскрытии списка, независимо от того какой был выбран на самом деле. А у меня привязка id записи к элементам. (TDBLookupComboBox мне не подходит.) Также нельзя показать в списке несколько столбцов (хотя в инете находил способ с отрисовкой элементов).
Нашел в инете исходники EhLib. Пытаюсь разобраться с TDBComboBoxEh.
zub, Ваши ссылки почему-то не открываются.
Быть может у gtk есть в активе своя реализация TCombobox-а, Lazarus просто вайперить.zub писал(а):http://forum.lazarus.freepascal.org/ind ... ppbledtrn7 незнаю, чем там дело кончилось. помню были темы конкретно про кражу фокуса
Вот вполне у 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, спасибо огромное за ссылки! Теперь понятно, что надо делать.
>>Быть может у gtk есть в активе своя реализация TCombobox-а, Lazarus просто вайперить.
конечно есть. как и у win и у qt, это обертка над стандартным контролом. Глубоко внутрь туда не залезешь.
>>Компоненты между собой могут обмениваться сообщениями. Изучите эту науку, она проста.. Тогда вы научитесь украшать и управлять поведением компонент.
Это наука совсем не про то. Дай реализацию ТНеКрадущаяФокусForm под win, gtk и qt. Всего делов))
конечно есть. как и у win и у qt, это обертка над стандартным контролом. Глубоко внутрь туда не залезешь.
>>Компоненты между собой могут обмениваться сообщениями. Изучите эту науку, она проста.. Тогда вы научитесь украшать и управлять поведением компонент.
Это наука совсем не про то. Дай реализацию ТНеКрадущаяФокусForm под win, gtk и qt. Всего делов))
Как из простого 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 секунд:
Надо доделывать, в праздники упал я в синюю яму, хотел вылезти, друзья не давали..
Скоро будет под win, gtk и qt в одних текстурах. до конца января черновик опубликую.
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. Всего делов))
Надо доделывать, в праздники упал я в синюю яму, хотел вылезти, друзья не давали..
Скоро будет под win, gtk и qt в одних текстурах. до конца января черновик опубликую.
