我知道, 没有窗户的控制并不是魔法.一个没有窗户的控制可以有输入的重点(例如互联网浏览器).输入的重点是没有什么比绘图:

而当户开始捣碎键,使得当。你的 知道吗 击键是意味着 集中控制,因为这是控制具有重点。

在这种情况下我的(Windows®)窗口,我就知道我没有窗户的孩子控制(让我们 假装 这是一个的后裔TGraphicControl)得到的键盘的事件。所以我在形成的 OnKeyDown, OnChar, OnKeyUp, 我需要假装他们要我没有窗户的儿童的控制。

这是我能做的,但它是一个痛苦。

但是然后用户可能会要用 导航,我会必须以某种方式截取Delphi的正常标签制以处理,并勾我自己说 这件事情 是下一个(以及前)在标签的顺序。

这是我能做的,但它是一个痛苦。

然后还有 ActiveControl, 不明白什么除非 TWinControl's。所以如果德尔福曾经试图找出谁有焦点,它会去疯了。所以我就必须有一个备用的执行ActiveControl.

这是我能做的,但它是一个痛苦。

换句话说: 这是只太多的工作? 我的战斗一切,Delphi是,所有这样我就可以有几十个没有窗户的控制可以通过键盘输入?德尔福设计师从来没有设想使用的互动没有窗户的控制,并且如果我现在尝试它的工作中,我将仅仅停留在 hurtlocker?

德尔菲给我机会帮助我心甘情愿,但我已选择的方式的痛苦。


一些进一步的解释 没有窗户的控制 是需要的。

不是每个控制你的互动是一个窗户的控制。这是完全可能的有重点,并发送键盘输入、控制那不是窗户窗口。

例如,几乎每一个控制你看见在一个互联网浏览器窗口是一个没有窗户的控制。下图可以看到一个 编辑 控制,这可类型,以及按钮其(在该截)有重点:

alt text

你可以看到虚焦点矩形,并按钮是蓝色的(其上的窗户表示,它已经焦点)。

如果我按 空格键 同时 Google Search 按钮有焦点,它就会 按钮。这个工程的原因是因为微软写了一整个部件库的控制。这些控制的外观和感觉(几乎)完全一样的定期共同控制-它们非常接近的确切的克隆的Windows共同控制,主题正在被应用。

火狐和谷歌铬也使用一个小部件库的控制。他们不使用微软的内在窗口的控制,而是使用图书馆的图形,互动的,没有窗户 小工具.

如果你有一个适宜的发展环境,然后在没有窗户部件工作,就像"正常的"窗口控制。GTK+是一个小部件库,格莱德是一个IDE,让你的布局控制的那部件库。

我不知道在什么样的发展环境的火狐,铬,或搅拌器创建的,但其部件支持没有窗户的控制。


因此,现在到我的问题。

除非我是错误的,在我看来,似乎虽然德尔斐支持基 TControl, ,(它有宽、高,并可以画本身),它不能接受的键盘重点。在我看来,Borland从来没有设计Delphi的VCL作为一个通用的部件库。唯一的证据,我们支持这一形式的 ActiveControl 是TWinControl:

property ActiveControl: TWinControl;

这并不意味着Delphi可以或必须限于窗口控制。VCL部件库,可以扩大到支持给予关注到没有窗户的控制。

但是也许 德尔斐已经支持的没有窗户的控制, 我只是没意识到吗?有没有已经建立的机制在德尔斐,以支持给予重点 TControl's?但我是一个相当聪明的家伙,我很确定德尔福VCL不能做什么其他的部件库可以做的。

然后导致另外一个问题: 多少工作将以以类种形式和这样的支持? 是有别人那里,也许有人在TeamB,谁是聪明得多比我,他已经尝试过,并得出结论,它的 不可能的?

我请求现在在最前面,如果试图添加没有窗户的控制的支持是几乎不可能的(即徒劳)-所以我不要花几个星期就没什么。我想利用这一知识的社区的德尔菲的开发。

我要问一个问题。

有帮助吗?

解决方案

这是徒劳的,建立没有窗户的控制 适合他们进入德尔福VCL框架。

你带了Internet Explorer作为一个例子。但在这种情况下,它完全负责的一切驻留。它有它自己的内部概念活动的控制,但是认为有关是什么它看起来像是从外面:这只是一个巨大的控制。当你问OS什么焦点,单浏览器控制有它,无论这浏览器的子控件 出现 有焦点。

当你按下标签,它看起来操作系统,因为虽然浏览器已经消耗的一个标签字,就像编辑控制做。编辑控制,将光标移动了几个空间和添加标签字给他们的内部缓冲区;浏览器的控制将光标移动到另一个地区显示。

你想做的这一切,在德尔斐TForm.德尔菲形式已经有了一个框架,用于管理活动的控制和处理键,而你会拥有打击这一切。如果你想要的没有窗户的控制,去互联网浏览器的路线和 建立你自己的容器控制 要保持他们,使你可以留在负责所发生的一切在它里面。

你的容器可以是一个VCL控制,但是你的东西放在它能不能—他们还会想到使用VCL重点和键盘处理规则。注意到如何你不能把普通Windows控制在互联网资源管理器,无论是。什么你把有需要通过具体件接口。也许你会需要的接口,也是,或许你可以只是让你自己设置的控制的类下降,从某些特别类的祖先设计的工作与你的容器。不要开始 TGraphicControl;这是太过根深蒂固的VCL可以用作为基础的分支控制图书馆。

这将是一个很大的工作,但随后再次,所以互联网浏览器。

其他提示

是的,这是徒劳的。
它不是德尔菲的错,你只是战斗Windows本身。
如果你需要一个控制,其行为就像一个窗口控制,使用一个窗口之一。
你是对的,试图重新整API堆的窗口控制从头开始是一个痛苦。

是啊,你几乎它想通了。使用没有窗户的控制意味着你会失去一切窗户可以做的来帮助你。具有超过一对夫妇在一个单独的实际窗口的痛苦。

大多数的这些程序是最有可能不是最初的开发使用RAD型工具,因此没有选择,只能重新发明轮子。其中一个最大优点的特尔斐是深VCL和第3次缔约方分支持,以提供看起来你的愿望。

一种技术,我已经使用取得了巨大成功减少量的窗口处理中使用的一个复杂的(税制)的形式为基础的应用程序是以绘制文本在画布上,而移动单TCustomEdit decendant的位置是用户编辑。这是微不足道的捕获TAB/上/下钥匙和移动的编辑到适当的位置。面临的挑战,我们发现的是在绘图的一个热矩形围绕鼠徘徊的领域。我们结束了一个网格列TObject,那里的阵元将是"无"(no领域),一个TLIst(网格包含多个领域)或一类,其中包含我们的描述符。这一减少数额的范围内检查我们必须执行,因为它是多个可能的框只包含一个单一的领域,或在最多4个领域。

fpGUI工具包 是一个例子是你想要的。最新的fpGUI码的源码存储库是根据一个多窗口的设计。这么简单意味着,每一个部件/组件都有一个窗口处理,但Windows和Linux没有窗户、其他基本的消息通知(鼠,mouseexit等)。fpGUI仍然具有完全控制了那里的每个部件,如果他们都聚焦,他们如何看起来等。一些部件/组件在fpGUI是非窗口组成。例如:TfpgScrollbar,TfpgMainMenu,按钮在一组合框等。

如果你想要一个真正的非窗版本,意味着只有一个顶级的窗口,一个窗口处理,所有其他部件/组件内的窗口实际上并不存在的操作系统(他们没有窗口处理),然后fpGUI可以帮助。初始设计的fpGUI工具包是基于这样的设计。再次,看看源代码存储库的0.4分行代码。我设计、fpGUI不得不处理一切,创造鼠/鼠标的事件、翻译协调系统对于容器的组件,处理(假)组成的重点国家等。是的最初的设计是很多工作,但随后你有一个非常便携式框架,该框架可以很容易地应用于其他操作系统。

是的,fpGUI是充分执行的对象Pascal语言使用免费Pascal编译器给我交叉平台支持。目前fpGUI上运行的Windows、Linux(32和64位),Windows移动和嵌入式的Linux(臂)设备。

我不知道有什么问题真是的,这里,但我认为这个小小的历史可能是相关的...

我们有一个应用程序,它填满了十几种形式。用户可能填写其他形式,并且也改变价值观填写的申请。

现在,在我们第一次执行情况,我们使用的窗口组成,为每一个单输入领域,所以这一领域可以得到关注和投入。竟然是一个大问题,因为所有的这个窗口了大量的资源。

我们现在有没有窗户的控制每一个输入的领域。这意味着我们结束了,是一个合并的绘图的形式及其输入的领域。当用户点内部的绘图,或者使用一些按键动/设置的重点,我们创建了一个新的窗口控制点领域。当用户移到下一个输入域,我们摧毁第一个窗口,并创建一个新。这种方式我们只有一个窗口控制再次给了我们一个漂亮的速度改善。

再次-我不知道你到底想要什么以管理。TWinControl是TWinControl的一个原因,但也有可能是一个解决你想要什么,什么,就是...

我认为 fgGUI 可以帮助你。

做检查 维基 第一次。

我想你可以用这个框架为你的申请在德尔斐,因为它是完全写在帕斯卡尔。实际上这是基于FreePascal;)

禾田

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top