Дельфы:Как использовать элементы управления без окон?

StackOverflow https://stackoverflow.com/questions/2315906

  •  22-09-2019
  •  | 
  •  

Вопрос

я знаю, что элементы управления без окон - это не волшебство.Элемент управления без окон может иметь фокус ввода (напримерInternet Explorer).Фокус ввода - это тоже не что иное, как рисование:

и когда пользователь начинает нажимать клавиши, реагируя соответствующим образом.Ты знать нажатия клавиш предназначены для это сфокусированный контроль, потому что именно этот контроль имеет фокус.

В случае моего окна (Windows®) я должен был бы знать, что мой дочерний элемент управления без окон (давайте притворяйся это потомок TGraphicControl) получает события клавиатуры.Итак, во время моей формы OnKeyDown, OnChar, OnKeyUp, мне нужно было бы притвориться, что они переходят к моему дочернему элементу управления без окон.

Что я могу сделать, но это причиняет боль.

Но тогда пользователь, вероятно, захочет использовать Вкладка навигации, и мне придется каким-то образом перехватить обычную обработку порядка управления вкладками Delphi и подключить себя, чтобы сказать, что эта штука является следующим (и предыдущим) в порядке табуляции.

Что я могу сделать, но это причиняет боль.

И потом, есть еще ActiveControl, который не понимает ничего , кроме TWinControl's.Так что если Delphi когда-нибудь попытается выяснить, у кого есть фокус, это сойдет с ума.Так что мне пришлось бы использовать альтернативную реализацию ActiveControl.

Что я могу сделать, но это причиняет боль.

Другими словами: это просто слишком большая работа? я борюсь со всем, что есть в Delphi, и все для того, чтобы у меня было несколько десятков элементов управления без окон, доступных через ввод с клавиатуры?Разработчики Delphi никогда не рассматривали возможность использования интерактивных элементов управления без окон, и если я попытаюсь сейчас использовать это, я просто застряну в хертлок?

Дельфи дала мне шанс добровольно помочь мне, но я избрал путь боли.


Некоторое дальнейшее объяснение элементы управления без окон необходим.

Не каждый элемент управления, с которым вы взаимодействуете, должен быть элементом управления Windows.Вполне возможно сфокусироваться на элементе управления, который не является окном Windows, и отправить ввод с клавиатуры на него.

Например, почти каждый элемент управления, который вы видите в окне браузера Internet Explorer, является элементом управления без окон.На следующем скриншоте вы можете увидеть Редактировать элемент управления, который вы можете ввести, и кнопка, которая (на этом скриншоте) имеет фокус:

alt text

Вы можете видеть пунктирный прямоугольник фокусировки, а кнопка голубоватая (что в Windows указывает на то, что у нее есть фокус).

Если бы я нажал на Пробел в то время как Google Search кнопка имеет фокус, это было бы Пресса кнопка.Причина, по которой это работает, заключается в том, что Microsoft написала целую библиотеку элементов управления виджетами.Эти элементы управления выглядят и ощущаются (почти) точно так же, как обычные общие элементы управления - они являются почти точными клонами общих элементов управления Windows, вплоть до применяемых тем.

Mozilla Firefox и Google Chrome также используют библиотеку элементов управления виджетами.Они не используют встроенные оконные элементы управления Microsoft, а вместо этого используют библиотеку графических, интерактивных элементов управления без окон. виджеты.

И если у вас есть подходящая среда разработки, то виджеты без окон работают точно так же, как "обычные" оконные элементы управления.GTK + - это библиотека виджетов, а Glade - это IDE, которая позволяет вам размещать элементы управления в этой библиотеке виджетов.

я не знаю, в какой среде разработки были созданы Firefox, Chrome или Blender, но их виджеты поддерживают элементы управления без окон.


Итак, теперь перейдем к моему вопросу.

Если я не ошибаюсь, мне кажется, что, хотя Delphi поддерживает базовую TControl, (который имеет ширину, высоту и может сам рисовать), он не может получить фокус клавиатуры.Мне кажется, что Borland никогда не разрабатывал VCL Delphi как универсальную библиотеку виджетов.Единственное доказательство, которым я располагаю в поддержку этого, - это то, что Форма ActiveControl является двойным управлением:

property ActiveControl: TWinControl;

Это не означает, что Delphi может быть или должен быть ограничен оконными элементами управления.Библиотека виджетов VCL может быть расширена для поддержки фокусировки на элементах управления без окон.

Но, возможно Delphi уже поддерживает элементы управления без окон, и я просто не осознаю этого?Существует ли уже установленный механизм в Delphi для поддержки уделения особого внимания TControlс?Но я достаточно умный парень, и я почти уверен, что VCL Delphi не может делать то, что могут делать другие библиотеки виджетов.

Что затем приводит к другому вопросу: сколько работы потребовалось бы для создания подкласса forms и тому подобного для его поддержки? Есть ли там кто-то еще, возможно, кто-то из TeamB, кто намного умнее меня, кто уже попробовал это и пришел к выводу, что это невозможно?

я спрашиваю сейчас, заранее, является ли попытка добавить поддержку управления без окон практически невозможной (т. е.бесполезно) - чтобы я не тратил на это недели впустую.я пытаюсь опираться на знания сообщества разработчиков Delphi.

я задаю вопрос.

Это было полезно?

Решение

Бесполезно создавать элементы управления без окон и поместите их в VCL-фреймворк Delphi.

В качестве примера вы приводите Internet Explorer.Но в таком случае он полностью отвечает за все, что на нем находится.У него есть свое собственное внутреннее представление о том, что такое активный контроль, но подумайте о том, как это выглядит снаружи:Это всего лишь один гигантский элемент управления.Когда вы спрашиваете ОС, что имеет фокус, он есть у элемента управления single browser, независимо от того, какой из субконтролей браузера появляется чтобы иметь фокус.

Когда вы нажимаете Tab, ОС выглядит так, как будто браузер просто использовал символ табуляции, точно так же, как это делают элементы управления редактированием.Редактирование элементов управления наведите курсор на несколько пробелов и добавьте символы табуляции к их внутренним буферам;элементы управления браузером перемещают курсор в другую область дисплея.

Вы думаете сделать все это на Delphi TForm.В Delphi forms уже есть платформа для управления активным элементом управления и обработки нажатий клавиш, и вам придется бороться со всем этим.Если вам нужны элементы управления без окон, перейдите по маршруту Internet Explorer и создайте свой собственный элемент управления контейнером удерживать их так, чтобы вы могли оставаться ответственным за все, что происходит внутри него.

Ваш контейнер может быть элементом управления VCL, но то, что вы помещаете в него, вероятно, не может — они по-прежнему будут ожидать использования правил фокусировки VCL и обработки клавиатуры.Обратите внимание, что вы также не можете поместить обычные элементы управления Windows в Internet Explorer.Все, что вы туда помещаете, должно проходить через определенные интерфейсы ActiveX.Возможно, вам тоже понадобятся интерфейсы, или, может быть, вы можете просто создать свой собственный набор классов управления, которые происходят от какого-то специального класса-предка, который вы разрабатываете для работы с вашим контейнером.Не начинайте с TGraphicControl;он слишком укоренился в VCL, чтобы его можно было использовать в качестве основы для вашей библиотеки управления ответвлениями.

Это будет большая работа, но опять же, как и Internet Explorer.

Другие советы

Да, это бесполезно.
И это не вина Delphi, вы просто боретесь с самой Windows.
Если вам нужен элемент управления, который ведет себя как оконный элемент управления, используйте оконный элемент управления.
И вы правы, пытаться воссоздать весь стек оконных элементов управления API с нуля - сплошная мука.

Да, ты в значительной степени уже понял это.Использование элементов управления без окон означает, что вы теряете все, что Windows может сделать, чтобы помочь вам.Иметь больше пары в одном реальном окне - это боль.

Большинство из этих программ, скорее всего, изначально не были разработаны с использованием инструментов типа RAD, поэтому у нас не было другого выбора, кроме как заново изобрести колесо.Одним из самых больших преимуществ Delphi является глубокий VCL и поддержка сторонних компонентов для обеспечения желаемого внешнего вида.

Один из приемов, который я с большим успехом использовал для уменьшения количества дескрипторов окон, используемых в приложении на основе сложных форм (подготовка налогов), заключался в том, чтобы нарисовать текст на холсте и переместить один дескриптор TCustomEdit в положение, которое редактировал пользователь.Было тривиально захватить клавиши TAB / Up / Down и переместить редактирование в соответствующее положение.Задача, которую мы обнаружили, заключалась в том, чтобы нарисовать горячий прямоугольник вокруг поля наведения курсора мыши.В итоге мы получили сеточный массив TObject, где элементом массива было бы nil (без поля), TList (сетка содержит несколько полей) или класс, который содержал наш дескриптор поля.Это уменьшило количество проверок диапазона, которые нам приходилось выполнять, поскольку было более вероятно, что поле содержало только одно поле или не более 4 полей.

Инструментарий fpGUI Toolkit это пример того, чего вы хотите.Последний код fpGUI в репозитории исходного кода основан на многооконном дизайне.Это просто означает, что у каждого виджета / компонента есть дескриптор окна, но Windows или Linux ничего не делают с этим окном, кроме обычных уведомлений (mouseenter, mouseexit и т.д.).fpGUI по-прежнему имеет полный контроль над тем, куда направляется каждый компонент, можно ли их фокусировать, как они выглядят и т.д.Некоторые виджеты / компоненты в fpGUI также не являются оконными компонентами.например:TfpgScrollbar, TfpgMainMenu, кнопка в выпадающем списке и т.д.

Если вам нужна настоящая неоконная версия, то есть есть только одно окно верхнего уровня, у которого есть дескриптор окна, все остальные виджеты / компоненты внутри этого окна фактически не существуют в ОС (у них нет дескрипторов окна), тогда fpGUI тоже может помочь.Первоначальный дизайн fpGUI Toolkit был основан на таком дизайне.Опять же, поищите в репозитории исходного кода ветку code версии 0.4.При таком проектировании fpGUI приходилось обрабатывать абсолютно все, создавая события mouseenter / mouseleave, переводить системы координат для компонентов контейнера, обрабатывать (поддельные) состояния фокусировки компонентов и т.д...Да, первоначальный дизайн требует БОЛЬШОЙ работы, но затем у вас есть очень переносимый фреймворк, который можно легко применить и к другим операционным системам.

И да, fpGUI полностью реализован на языке Object Pascal с использованием компилятора Free Pascal, чтобы обеспечить мне кроссплатформенную поддержку.В настоящее время fpGUI работает на устройствах Windows, Linux (32 и 64-разрядные версии), Windows Mobile и Embedded Linux (ARM).

Я понятия не имею, в чем на самом деле заключается ваша проблема, но я думаю, что эта небольшая история может иметь отношение к делу...

У нас есть заявка, которая заполняет дюжину форм.Пользователь может заполнять дополнительные формы, а также изменять значения, заполняемые самим приложением.

Теперь, в нашей первой реализации, мы использовали оконные компоненты для каждого отдельного поля ввода, чтобы поля могли получать фокус и входные данные.Это оказалось большой проблемой, потому что вся эта Windows отнимала много ресурсов.

Теперь у нас есть элементы управления без окон для каждого поля ввода.Это означает, что все, что мы в итоге получаем, - это комбинированный рисунок формы и ее полей ввода.Когда пользователь щелкает внутри рисунка или использует несколько нажатий клавиш для перемещения / установки фокуса, мы создаем новый оконный элемент управления для выбранного поля.Когда пользователь переходит к следующему полю ввода, мы уничтожаем первое окно и создаем новое.Таким образом, у нас есть только один оконный элемент управления, который снова дал нам значительное улучшение скорости.

Опять же - я понятия не имею, чем вы на самом деле хотите управлять.TWinControl - это TWinControl по определенной причине, но может быть решение для того, что вы хотите, каким бы оно ни было...

Я думаю, что Фгги может быть, это вам поможет.

Обязательно проверьте его Вики Первый.

Я думаю, вы можете использовать этот фреймворк для своего приложения на Delphi, поскольку он полностью написан на Pascal.На самом деле он основан на FreePascal ;)

HTH

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top