Delphi之创建组件模板(Component Template)

[tip]

组件模板(Component Template)是指修改后保存下来供以后再使用的一个或一组组件。

[/tip]

组件模板可用来创建、保存和重复使用组件组。实际上,组件模板不必是一组组件,完全可以是单个组件。举一个小例子对理解组件模板的用途会很有帮助,但先要简要介绍一下Windows编辑控件(edit control)。

与所有的Windows控件一样,标准Windows单行编辑控件有若干预定义动作。其中一个动作与Enter键的处理方式有关。如果当光标在编辑框控件上时用户按下Enter键,Windows就开始查找窗口上的缺省按钮,如果找到了缺省按钮,Windows就点击该按钮。

这是什么意思呢?比方说,一个窗体上有多个编辑控件和一个缺省按钮(如OK按钮或Default属性设成True的其他按钮),当按下Enter键且有一个编辑控件为当前控件时,窗口会关闭;如果窗体上无缺省按钮,Windows就会发出嘟嘟声。虽然这是标准的Windows动作,但很多用户觉得它很烦人,它们希望按下Enter键后输入焦点移到下一个控件,而不是关闭窗口。

这个问题的解决其实很简单。只要为OnKeyPress事件提供一个事件处理程序并加入代码,其代码如下:

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  if Key = Char(vk_return) then
  begin
    Key := #0;
    PostMessage(Handle, WM_NEXTDLGCTL, 0, 0);
  end;
end;

这段代码首先检查按下的键是不是Enter键(VK_RETURN虚拟键码),如果是,它就把键值设为#0,Windows就不会发出嘟嘟声。代码第6行发送一个Windows的WM_NEXTDLGCTL消息给窗体,该消息把焦点设置到下一个控件上,这就是与此有关的全部内容。

为新的Edit组件编写好代码后,可将它保存为一个组件模板。保存组件时,全部代码都一起保存下来。创建的代码模板保存到组件面板的Templates页面上。下面来创建一个组件模板,以便读者更好地理解。下面我们按步骤建立组件模板:

(1)在空白窗体上放置一个Edit组件,将其Name属性改为EnterAsTab,并清除它的Text属性;

(2)切换到Object Inspector的Events页面。创建OnKeyPress事件的事件处理程序。输入下面的代码:

procedure TForm1.EnterAsTabKeyPress(Sender: TObject; var Key: Char);
begin
  if Key = Char(vk_return) then
  begin
    Key := #0;
    PostMessage(Handle, WM_NEXTDLGCTL, 0, 0);
  end;
end;

(3)选取Edit组件,从主菜单上选【Component | Create Component Template】菜单项,显示出“Component Template Information”对话框;

(4)在“Component Name”栏中输入TEnterAsTab,这时的对话框如上面所示;

(5)点击OK保存该组件模板。

现在组件面板上有了一个Templates页面。

切换到Templates页面,选择需要的组件放置到窗体上,OnKeyPress事件处理程序的代码也随组件一起加到了窗体上。

[tip]

一个窗体上如果有多个这样的组件,对于窗体上每个EnterAsTab组件,OnKeyPress事件处理程序的代码是重复的。为了避免代码重复,可只放置一个EnterAsTab组件于窗体上,其他组件可以是标准Edit组件,它们的OnKeyPress事件均有EnterAsTab组件的OnKeyPress事件处理程序处理。

组件模板的最大优势就是:每个组件的事件处理程序的代码与该组件存放在一起。用组件模板可将定值组件按自己的安排集中在一起:带有预定义过滤器和标题的公用对话框、带有符号的加速按钮、列表框或自动从文件中加载项目的组合框以及任意其他集合。

尽管组件模板概念适用于单个组件,但用它来处理多个组件更有意义。如果有一组组件要放置到窗体上,则可以创建一个由这组组件组成的组件模板,以后再用这组组件时只要点击一下由它们组成的组件模板就可以了。

[note]

组件模板与对象库中保存的窗体有一些相似之处。组件模板用于窗体上的组件组。使用对象库保存要重复使用的窗体。

原文地址:https://www.cnblogs.com/penginfo/p/9314908.html

时间: 2024-09-30 02:02:31

Delphi之创建组件模板(Component Template)的相关文章

0810 vue 创建组件 模板 动态组件 传值

lesson10 1.demo    vue样本 <body> <div id="myApp"> </div> </body> <script> new Vue({ el:"#myApp", data:{}, methods:{}, computed:{}, filters:{} }) </script> 2.案例: 模拟百度搜索框 <!DOCTYPE html> <html

Delphi动态创建组件,并释放内存

开发所用delphi版本是xe2,效果图如下: 代码如下: ----------------------------------------------------------------------------------------------------------------- unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Class

Delphi 动态创建组件,单个创建、单个销毁

效果图如下: 实现部分代码如下: var rec: Integer = 0; //记录增行按钮点击次数 implementation {$R *.dfm} //动态释放单个组件内存,即销毁组件 procedure TForm1.DeleteRow(Sender: TObject); begin if rec < 1 then Exit else begin TPanel(Panel1.Controls[rec]).Free; //释放单个控件内存 TComboBox(Panel2.Control

vue.js 创建组件 子父通信 父子通信 非父子通信

1.创建组件 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>创建组件</title> <script src="https://unpkg.com/vue/dist/vue.js"></script> </head> <body> &l

Ionic开发2:目录分析及创建组件

上一篇我们创建好了一个新项目. 现在用VScode打开这个目录并且观察: node_modules :node 各类依赖包 resources :android/ios 资源(更换图标和启动动画) src:开发工作目录,页面.样式.脚本和图片都放在这个目录下 www:静态文件 platforms:生成 android 或者 ios 安装包路径( platforms\android\build\outputs\apk:apk 所在位置)执行 cordova platform add android

Angular动态创建组件之Portals

这篇文章主要介绍使用Angular api 和 CDK Portals两种方式实现动态创建组件,另外还会讲一些跟它相关的知识点,如:Angular多级依赖注入.ViewContainerRef,Portals可以翻译为 门户 ,我觉得放到这里叫 入口 更好,可以理解为动态创建组件的入口,类似于小程序或者Vue中的Slot. cdk全名Component Development Kit 组件开发包,是Angular官方在开发基于Material Design的组件库时抽象出来单独的一个开发包,里面

Vue创建组件的三种方式

1.使用 Vue.extend 来创建全局的Vue组件 <div id="app"> <!-- 如果要使用组件,直接,把组件的名称,以 HTML 标签的形式,引入到页面中,即可 --> <mycom1></mycom1> </div> <script> // 1.1 使用 Vue.extend 来创建全局的Vue组件 // var com1 = Vue.extend({ // template: '<h3&g

Vue基础篇--8组件基础 component

Vue基础篇--8组件基础 component 1.简单示例 <div id='components1'> <button-conter></button-conter> </div> <script> // 定义一个名为button-conter组件 Vue.component("button-conter",{ data:function () { return { count:0 } }, template:`<b

- Component template should contain exactly one root element. If you are using v-if on multiple elements, use v-else-if to chain them instead. 解决方案

<template> <div>{{hello}}</div> <button @click="addOne">add one</button> <button @click="minusOne">minus one</button> </template> 在*.vue组件里有这么一段. 报错信息: (Emitted value instead of an instan