第一部分实现功能:使用一个TabControl和一个Memo和TDictionary类实现文本临时存储
效果图:

一期功能概要:
a.双击tab关闭tab,双击tab右边空白添加tab(标题为以hhnnsszzz的时间格式命名)
b.切换tab将数据存入dictionary,key为标题,value为memo的内容
实现代码:
unit Unit1; interface uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ComCtrls, Vcl.StdCtrls,
System.Generics.Collections; type
TForm1 = class(TForm)
TabControl1: TTabControl;
Memo1: TMemo;
procedure onAppMessage(var Msg: TMsg; var Handled: Boolean);
procedure FormCreate(Sender: TObject);
procedure TabControl1Change(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction); private
{ Private declarations }
public
{ Public declarations }
end; var
Form1: TForm1; implementation {$R *.dfm} var
dic: TDictionary<string, string>;
preTabCaption: string; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
FreeAndNil(dic);
end; procedure TForm1.FormCreate(Sender: TObject);
begin
//创建dictionary
dic := TDictionary<string, string>.Create; //转接消息处理
Application.OnMessage := onAppMessage; //设置上一个key的值为当前的标题
preTabCaption := TabControl1.Tabs[TabControl1.TabIndex]; //把当前的key和value插入到dictionary
dic.Add(preTabCaption, Memo1.Text); end; procedure TForm1.onAppMessage(var Msg: tagMSG; var Handled: Boolean);
var
tmp: string;
begin
//关闭一个tab
if (Msg.message = WM_LBUTTONDBLCLK) and (Msg.hwnd = TabControl1.Handle) then
begin
// 如果标签只剩下一个,不做任何操作
if TabControl1.Tabs.Count = then
begin
// 设置上一个key的值为当前标题并读取内容
preTabCaption := TabControl1.Tabs[];
Memo1.Text := dic.Items[preTabCaption];
Exit;
end; // 关闭标签前,通过把标题当做key,删除dictionary中对应的value
dic.Remove(TabControl1.Tabs[TabControl1.TabIndex]); if TabControl1.TabIndex = then
begin
// 标签index=的时候设置当前index=
TabControl1.TabIndex := ; // 删除前一个tab
TabControl1.Tabs.Delete(TabControl1.TabIndex - ); // 设置上一个key的值为当前标题并读取内容
preTabCaption := TabControl1.Tabs[TabControl1.TabIndex];
Memo1.Text := dic.Items[preTabCaption];
Exit;
end; // 标签为其他index,设置当前index为index-
TabControl1.TabIndex := TabControl1.TabIndex - ; // 删除指定的tab
TabControl1.Tabs.Delete(TabControl1.TabIndex + ); // 设置上一个key的值为当前标题并读取内容
preTabCaption := TabControl1.Tabs[TabControl1.TabIndex];
Memo1.Text := dic.Items[preTabCaption];
end; //新建一个tab
if (Msg.message = WM_LBUTTONDBLCLK) and (Msg.hwnd = Self.Handle) then
begin
// 添加tab 标题为时间分秒毫秒
tmp := FormatDateTime('hhnnsszzz', now); // 添加标题
TabControl1.Tabs.Add(tmp); // 设置当前活动页
TabControl1.TabIndex := TabControl1.Tabs.Count - ; // 新建tab的value=''添加到dictionary
dic.Add(tmp, ''); // 插入到对应value
dic.Items[preTabCaption] := Memo1.Text; // 把当前标题设置成上一个key
preTabCaption := tmp; //当前新建tab显示内容为''
Memo1.Text := '';
end;
end; procedure TForm1.TabControl1Change(Sender: TObject);
begin
//
// 把tab改变之前的内容通过上一个key存入dictionary
dic.Items[preTabCaption] := Memo1.Text;
// ShowMessage(TabControl1.Tabs[TabControl1.TabIndex]); // 把当前标题当做key,取出value
Memo1.Text := dic.Items[TabControl1.Tabs[TabControl1.TabIndex]]; // 把当前标题设置成上一个key
preTabCaption := TabControl1.Tabs[TabControl1.TabIndex]; end; end.
第一部分实现功能:使用一个TabControl和一个Memo和TDictionary类实现文本临时存储的更多相关文章
- php 获取数组第一个元素 以及最后一个元素 && 最后一个元素的键名
1. current() 函数返回数组中的当前元素的值. 每个数组中都有一个内部的指针指向它的"当前"元素,初始指向插入到数组中的第一个元素. end() - 将内部指针指向数组中 ...
- Java实现点击一个Jlabel增加一个Jlabel的小功能
当界面生成以后,自己想做一个点击一个Jlabel增加一个Jlabel,即类似于QQ的添加好友以后可以及时的加进一个好友.自己做了好久,发现不能及时刷新.在网上查了一下,然后自己研究了一小会.发现需要v ...
- select into tb_temp2 from tb_temp1 创建临时表实现上一个、下一个功能,使用完毕就删除临时表
好久没有写过Sql了,今天遇到一个问题,业务逻辑是: 一个商品可以属于多个分类,在显示商品详情的时候,要求可以点击“上一个”,“下一个” 查看和该商品在同一个分类下的其他商品,商品具有排序号. 这样我 ...
- 左键双击关闭pagecontrol中的一个分页即一个tabsheet,功能像遨游浏览器一样
左键双击关闭pagecontrol中的一个分页即一个tabsheet,功能像遨游浏览器一样 procedure TfrmServerSetup.PageControl1MouseDown(Sender ...
- 《Java从入门到失业》第四章:类和对象(4.3):一个完整的例子带你深入类和对象
4.3一个完整的例子带你深入类和对象 到此为止,我们基本掌握了类和对象的基础知识,并且还学会了String类的基本使用,下面我想用一个实际的小例子,逐步来讨论类和对象的一些其他知识点. 4.3.1需求 ...
- 自定义一个可以使用foreach语句进行迭代的类(IEnumerable)
在c#中,凡是实现了IEnumerable接口的数据类型都可以用foreach语句进行迭代访问.所以,我们要定义一个可以使用foreach进行迭代访问的类,就必须要实现IEnumerable接口. / ...
- 一个简单的ORM制作(SQL帮助类)
一个简单的ORM制作大概需要以下几个类: SQL执行类 CURD操作类 其他酱油类 先从SQL执行类说起,可能会涉及数据库的迁移等问题,所以需要定义一个接口以方便迁移到其他数据库, 事务没提供命名,若 ...
- 一个不错的PHP文件页面缓存类
在php中缓存分类数据库缓存,文件缓存和内存缓存,下面我来给各位同学详细介绍PHP文件缓存类实现代码,有需要了解的朋友可参考. 页面缓存类 <?php /* * 缓存类 cac ...
- nginx和apache最核心的区别在于apache是同步多进程模型,一个连接对应一个进程;nginx是异步的,多个连接(万级别)可以对应一个进程
nginx和apache的一些优缺点比较,摘自网络,加自己的一些整理. nginx相对于apache的优点: 1.轻量级,同样是web 服务,比apache 占用更少的内存及资源 2.抗并发,ngin ...
随机推荐
- android学习日记10--裁剪区域
裁剪区域 裁剪是画布的一个函数,区域可以是矩形和圆形,也可以通过设置 path 或Region来显示自定义区域,通过不同组合,Android几乎可以支持任意现状的裁剪区域.android.graphi ...
- Web.xml 中增加log4j
配置文件例如以下.web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app versio ...
- windows平台下php版本问题–VC6/VC9和TS/NTS
php下载页面中提供了4个下载版本,是vc6/vc9 与 TS/NTS的组合 VC6:legacy Visual Studio 6 compiler,就是使用这个编译器编译的. VC9: ...
- [原创]VS2013 EF6连接MySql需要几步?
精简的美丽...... 1.安装mysql server下载地址 http://cdn.mysql.com/Downloads/MySQL-5.6/mysql-5.6.21-winx64.zip注意: ...
- linux服务器命令
清除屏幕数据:ctrl + l :快速查找某个文件: find / -name 'httpd.conf' (或php.ini) 重启Apache : service httpd restar ...
- Android之利用HTTP网络通信实现与PHP的交互(三)
Android与PHP的交互是通过Http网络编程来实现的,利用php访问数据库,并且操作数据库中的数据,利用php作为接口,使Android连接数据库. 一般情况下,我们使用Json格式进行传输,利 ...
- 零门槛!ZBLibrary仿微信朋友圈自定义View,就是这么简单!
传统方法是继承现有View再重写方法,这种方式缺点很多: 1.往往不能在xml编辑器中预览效果: 2.比较难实现预期效果,比如设置宽度为wrap_content,实际显示为match_parent等: ...
- fedora 23中配置tftp-server
fedora 23中配置tftp-server */--> fedora 23中配置tftp-server Table of Contents 1. 简介 2. tftp安装 3. 启动和允许 ...
- C#扫盲之:==/Equals /ReferenceEquals 异同的总结,相等性你真的知道吗?
1.前言 == Equals ReferenceEquals 三个相等性测试,是.NET提供给程序员使用的三个方法,他们之间有什么联系和区别,你真的仔细研究过?虽然之前也多多少少知道一点,但是有时候又 ...
- java 反射机制探究
一 反射机制操作类的成员变量 二 操作类的方法 三 利用反射实例化类 四 利用反射访问一个类的私有成员 五 利用反射覆盖数据对象的toString 方法