开发复合组件TLabel + TwwDBLookupCombo

news2025/5/17 7:41:34

老鸟跳过。。。。。。。。本文只是为小白准备的

--------------

TwwDBLookupCombo 组件是老牌控件包的 Inofpower 中的一个组件。Inofpower 很久也没有更新了,只是作了新版DELPHI的适配,组件的功能从D2007那些开始到现在,可以说几乎没有任何的改变;

可以官方觉得够用了吧。

我个人就非常喜欢这套组件包,它的DBGrid(TwwDBGrid)的例可以绑入twwdbedit,twwcombobox,twwLookupcombo,twwButton 等等组件包内的其它很多自身的组件,有人说 DevExpress 也可以。虽然看上去效果差不多,但是原理是不同的。相对于DevExpress那个壮硕的体积,这个可谓即小巧又灵活。使用还相当简单方便。(感觉想是在作广告,其实就是表达我确定挺喜欢的)

本文主要就是记录一下自己的心得。

从 TCustomControl 继承,如:

TJoeDBLookupCombo = class(TCustomControl)

具体的过程就不赘述了。说说我踩坑(其实不算坑,只是我太菜水平有限遇到的困难,花了不小时间才解决的)

大部分的属性或者事件,都可以简单的 get、set解决;这里要记录的就是我觉得插重要的,又不能简单Get/Set能解决的;

1、在设计期,双击 TwwDBLookupCombo 会弹出一个设置窗口(如下图:

如果想要在自己的组件控件中也这样。需要自己写一个类并编写(应该是抄)一些代码;

TDBLookupDisplayComponentEditor = class(TwwComponentEditor)
     procedure Edit; override;
  end;


TDBLookupDisplayProperty = class(TPropertyEditor)
     procedure Edit; override;
     function GetAttributes: TPropertyAttributes; override;
     function GetValue: string; override;
  end;




{ TDBLookupDisplayComponentEditor }

procedure TDBLookupDisplayComponentEditor.Edit;
var
  listHandle: TStrings;
  dataSet: TDataSet;
  useTFields: boolean;
  SelectedPropertyType: TwwSelectedPropertyType;
begin
  listHandle := (Component as TJoeDBLookupCombo).LookupCombo.Selected;
  dataSet := (Component as TJoeDBLookupCombo).LookupCombo.LookupTable;
  SelectedPropertyType := sptNone;
  useTFields := TJoeDBLookupCombo(Component).LookupCombo.useTFields;
  if (EditSelectedFieldsProperty(TJoeDBLookupCombo(Component).LookupCombo, listHandle, dataSet, Designer, False, useTFields, SelectedPropertyType)) then begin
    TJoeDBLookupCombo(Component).LookupCombo.useTFields := useTFields;
    (TJoeDBLookupCombo(Component).LookupCombo as TwwDBLookupCombo).refreshDisplay;
  end
end;




{ TDBLookupDisplayProperty }

procedure TDBLookupDisplayProperty.Edit;
var
  listHandle: TStrings;
  dataSet: TDataSet;
  component: TComponent;
  useTFields: boolean;
  SelectedPropertyType: TwwSelectedPropertyType;
begin
  component:= GetComponent(0) as TComponent;
  listHandle := (component as TJoeDBLookupCombo).LookupCombo.Selected;
  dataSet := (component as TJoeDBLookupCombo).LookupCombo.LookupTable;
  SelectedPropertyType := sptNone;
  useTFields := TJoeDBLookupCombo(component).LookupCombo.useTFields;
  if (EditSelectedFieldsProperty(TJoeDBLookupCombo(component).LookupCombo, listHandle, dataSet, Designer, False, useTFields, SelectedPropertyType)) then begin
    TJoeDBLookupCombo(component).LookupCombo.useTFields := useTFields;
    (TJoeDBLookupCombo(component).LookupCombo as TwwDBLookupCombo).refreshDisplay;
  end
end;

function TDBLookupDisplayProperty.GetAttributes: TPropertyAttributes;
begin
  result:= [paDialog];
end;

function TDBLookupDisplayProperty.GetValue: string;
var
  listHandle: TStrings;
  component: TComponent;
begin
  {(*}
  component  := GetComponent(0) as TComponent;
  listHandle := (component as TJoeDBLookupCombo).LookupCombo.Selected;
  if listHandle.count > 0 then  
      result := listHandle[0] else   result := '';
  {*)}
end;

然后注册它

procedure Register;
RegisterComponents('JoeDBComponents',[TJoeDBLookupCombo]);
RegisterComponentEditor(TJoeDBLookupCombo, TDBLookupDisplayComponentEditor);
RegisterPropertyEditor(TypeInfo(TStrings), TJoeDBLookupCombo, 'Selected', TDBLookupDisplayProperty);
end;

这个才能在双击这个复合组件(或在属性设置中双击 Selected 属性)时,弹出那个设置窗口;

当然,在 published 中,要将 Selected 显示出来

TJoeDBLookupCombo = class(TCustomControl)
  private
    FLookupCombo  : TwwDBLookupCombo;
//..... 其它的代码省略
published
property Selected : TStrings read getSelectedFields write setSelectedFields;
//..... 其它的代码省略
end;




//传递一下相关的设置
function TJoeDBLookupCombo.getSelectedFields: TStrings;
begin
  Result :=  FLookupCombo.Selected;
end;

procedure TJoeDBLookupCombo.setSelectedFields(const Value: TStrings);
begin
  FLookupCombo.Selected := Value;
end;

---

下一篇说说  twwCheckBox + TwwLookupCombobo 

感觉跟 TLabel + TwwDBLookupCombo 差不多,其实也还真差不多。不过。仍然有需要记录的东西,比如说:wwCheckbox勾选与不勾选 wwLookupCombo的状态等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2323652.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

0328-内存图2

是否正确待定: Perso类 package com.qc.内存图2;public class Perso {public int age;public String name;public static int flag;public void m1() {}public static void m2() {}Overridepublic String toString() {return "Perso [age" age "…

【ESP32S3】esp32获取串口数据并通过http上传到前端

通过前面的学习(前面没发过,因为其实就是跑它的demo)了解到串口配置以及开启线程实现功能的工作流程,与此同时还有esp32作为STA节点,将数据通过http发送到服务器。 将这两者联合 其实是可以得到一个:esp32获…

《一本书讲透Elasticsearch:原理、进阶与工程实践》读书笔记

1:es的组成部分: Elasticsearch 引擎:核心组件,处理索引和搜索请求 Kibana:es的可视化的数据界面,用于分析和展示数据 Beats(可选)轻量级的日志采集器 2:基本概念 es开…

Android15查看函数调用关系

Android15 Camera3中打印函数调用栈 1.使用CallStack跟踪函数调用 修改涉及三个内容: Android.bp中添加对CallStack的引用。CallStack被打包在libutilscallstack.so。代码中包含CallStack的头文件。代码中调用CallStack接口,打印函数调用栈。 例子&am…

macOS 15 通过 MacPorts 安装 PHP 7 构建错误找不到符号在 dns.o 中解决方法

构建遇到的问题如下: "_res_9_dn_expand", referenced from:_php_parserr in dns.o_php_parserr in dns.o_php_parserr in dns.o_php_parserr in dns.o_php_parserr in dns.o_php_parserr in dns.o_zif_dns_get_mx in dns.o..."_res_9_dn_skipname&…

练习:猜数字小游戏

需求: 程序自动生成一个 1 - 100 之间的随机数字,使用程序实现猜出这个数字是多少? 代码: //猜数字小游戏 package demo01; import java.util.Random; import java.util.Scanner; public class HelloJava {public static void …

EMQX Dashboard

EMQX Dashboard EMQX理论基础 https://blog.csdn.net/liudachu/article/details/146495030 1 Dashboard简介 EMQX 提供了一个内置的管理控制台,即 EMQX Dashboard。方便用户通过 Web 页面就能轻松管理和监控 EMQX 集群,并配置和使用所需的各项功能。 访…

PC名词解释-笔记本的S0,S1,S2,S3,S4,S5状态

​🎓作者简介:程序员转项目管理领域优质创作者 💌个人邮箱:[2707492172qq.com] 🌐PMP资料导航:PM菜鸟(查阅PMP大纲考点) 💡座右铭:上善若水,水善利…

uniapp自定义目录tree(支持多选、单选、父子联动、全选、取消、目录树过滤、异步懒加载节点、v-model)vue版本

先看案例: 效果: 数据结构如下: const themeList ref([{id: 1,name: 内蒙古,children: [{id: 3,name: 街道1,children: [{id: 4,name: 小区1}]}]},{id: 2,name: 北京,children: [{id: 6,name: 街道2}]} ]) 参数配置: 属性名类…

ESP32S3 WIFI 实现TCP服务器和静态IP

一、 TCP服务器代码 代码由station_example_main的官方例程修改 /* WiFi station ExampleThis example code is in the Public Domain (or CC0 licensed, at your option.)Unless required by applicable law or agreed to in writing, thissoftware is distributed on an &q…

docker中安装 python

ubuntu 1、安装源码编译所需依赖 apt-get install -y gcc g make cmake libsqlite3-dev zlib1g-dev libssl-dev libffi-dev 2、下载python安装包 python-release安装包下载_开源镜像站-阿里云 3、解压安装 tar -zxvf Python-3.7.5.tgz cd Python-3.7.5 ./configure --prefix…

数据库----单表、多表

数据库 create database 数据库名称;---创建数据库create database 数据库名称 default charsetutf8mb4;---创建数据库,同时指定编码show databases;---查看当前数据库管理下存在多少数据库show databases like "db_%";---查询以db_开头的数据库select d…

ubuntu 22.04 一键安装 lxd

LXD系列 LXD是一个现代、安全且功能强大的系统容器和虚拟机管理器。 它为在容器或虚拟机中运行和管理完整的 Linux 系统提供了统一的体验。LXD 支持大量 Linux 发行版的映像(官方 Ubuntu 映像和社区提供的映像),并且围绕

HO与OH差异之Navigation三

在上一篇内容中我们介绍了HO与OH差异之Navigator,我们也了解了Navigator的基本概念和大致了解了一下他的基础用法,既然谈到差异肯定就不止这两种差异,今天就让我们来了解第三种差异NavRouter,其中在HO中我们并没有这种路由方式但是…

模型压缩与迁移:基于蒸馏技术的实战教程

1.前言 模型蒸馏(Model Distillation),又称为知识蒸馏(Knowledge Distillation),是一种将大型、复杂的模型(通常称为教师模型,Teacher Model)的知识转移到小型、简单模型…

XSS通关技巧

目录 第一关: 第二关: 第三关: 第四关: 第五关: 第六关: 第七关: 第八关: 第九关: 第十关: 第十一关: 第十二关: 第十三关&#xff1a…

el-tree树多选,将选中的树对象中某个字段值改为true,并过滤出所有为true的对象,组成新的数组

功能实现&#xff1a; el-tree树多选&#xff0c;将选中的树对象中某个字段值改为true,并过滤出所有为true的对象&#xff0c;组成新的数组提交给后端 <template><div><!-- 树形菜单 --><el-tree:data"stageList"show-checkboxdefault-expand-…

大文件版本管理git-lfs

1. 安装 Git Large File Storage (LFS) 是一个 开源的 Git 扩展&#xff0c;用于替换 Git 仓库中的大文件&#xff0c;用指针文件替代实际的大文件&#xff0c;可以在保持仓库轻量级的同时&#xff0c;有效地管理大型文件。 如果install提示失败&#xff0c;多试几次&#xf…

融合YOLO11与行为树的人机协作智能框架:动态工效学优化与自适应安全决策

人工智能技术要真正发挥其价值&#xff0c;必须与生产生活深度融合&#xff0c;为产业发展和人类生活带来实际效益。近年来&#xff0c;基于深度学习的机器视觉技术在工业自动化领域取得了显著进展&#xff0c;其中YOLO&#xff08;You Only Look Once&#xff09;算法作为一种…

Postgresql源码(142)子查询提升pull_up_sublinks

1 案例 drop table t_fun01; create table t_fun01 (image_id numeric primary key, content_id varchar(50), file_code varchar(20)); create index idx3 on t_fun01(content_id); create index idx4 on t_fun01(file_code); insert into t_fun01 select t.i, t.i%10, t.i%1…