第一部分实现功能:使用一个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 ...
随机推荐
- open_table与opened_table --2
好多人在调优Mysql的时候,总是对open_tables和opend_tables两个参数分别不清. 网上好多解释都是这样的:open_tables:当前打开表的数量opened_tables:当前 ...
- careercup-中等难度 17.11
17.11 给定rand5(),实现一个方法rand7().也即,给定一个产生0到4(含)随机数的方法,编写一个产生0到6(含)随机数的方法. 解法: 这个函数要正确实现,则返回0到6之间的值,每个值 ...
- Encryption
Encryption Configuration Basic Usage Encrypting a value Decrypting a value Configuration Before usin ...
- Android 自定义View修炼-Android中常见的热门标签的流式布局的实现
一.概述:在日常的app使用中,我们会在android 的app中看见 热门标签等自动换行的流式布局,今天,我们就来看看如何 自定义一个类似热门标签那样的流式布局吧(源码下载在下面最后给出哈) 类似的 ...
- 禁用 Browser Link,在浏览器调试的时候回出现大量的get,post数据。
VS2013新增的Browser Link功能虽然“强大”,但默认是开启的,很烦人!
- js Date.UTC() 与 php strtotime()生成的时间截不一样
Difference in UTC date between PHP and Javascript 工作中,因使用highcharts显示数据,需要将PHP 将日期转换为UTC 时区的时间截,然后通过 ...
- ADO和ADO.NET有什么不同?
1.一些ADO中常见的类型比如RecordSet在ADO.NET中已经没有了,而且在ADO.NET中也新增了许多在传统ADO中找不到的直接对应的新类型(如数据适配器): 2.传统的ADO主要针对紧密连 ...
- QQ粘性效果
演示如下 QQ粘性效果.zip
- JS获取网页宽高方法集合
JS获取网页宽高等方法的集合:document.body.clientWidth - 网页可见区域宽document.body.clientHeight - 网页可见区域高 document.body ...
- tomcat 6 不支持jsf2.2,仅支持jsf2.0及以下版本
tomcat 6 不支持jsf2.2,仅支持jsf2.0及以下版本 安装tomcat8即可.