效果图:

一期功能概要:

  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类实现文本临时存储的更多相关文章

  1. php 获取数组第一个元素 以及最后一个元素 && 最后一个元素的键名

    1. current() 函数返回数组中的当前元素的值. 每个数组中都有一个内部的指针指向它的"当前"元素,初始指向插入到数组中的第一个元素. end() - 将内部指针指向数组中 ...

  2. Java实现点击一个Jlabel增加一个Jlabel的小功能

    当界面生成以后,自己想做一个点击一个Jlabel增加一个Jlabel,即类似于QQ的添加好友以后可以及时的加进一个好友.自己做了好久,发现不能及时刷新.在网上查了一下,然后自己研究了一小会.发现需要v ...

  3. select into tb_temp2 from tb_temp1 创建临时表实现上一个、下一个功能,使用完毕就删除临时表

    好久没有写过Sql了,今天遇到一个问题,业务逻辑是: 一个商品可以属于多个分类,在显示商品详情的时候,要求可以点击“上一个”,“下一个” 查看和该商品在同一个分类下的其他商品,商品具有排序号. 这样我 ...

  4. 左键双击关闭pagecontrol中的一个分页即一个tabsheet,功能像遨游浏览器一样

    左键双击关闭pagecontrol中的一个分页即一个tabsheet,功能像遨游浏览器一样 procedure TfrmServerSetup.PageControl1MouseDown(Sender ...

  5. 《Java从入门到失业》第四章:类和对象(4.3):一个完整的例子带你深入类和对象

    4.3一个完整的例子带你深入类和对象 到此为止,我们基本掌握了类和对象的基础知识,并且还学会了String类的基本使用,下面我想用一个实际的小例子,逐步来讨论类和对象的一些其他知识点. 4.3.1需求 ...

  6. 自定义一个可以使用foreach语句进行迭代的类(IEnumerable)

    在c#中,凡是实现了IEnumerable接口的数据类型都可以用foreach语句进行迭代访问.所以,我们要定义一个可以使用foreach进行迭代访问的类,就必须要实现IEnumerable接口. / ...

  7. 一个简单的ORM制作(SQL帮助类)

    一个简单的ORM制作大概需要以下几个类: SQL执行类 CURD操作类 其他酱油类 先从SQL执行类说起,可能会涉及数据库的迁移等问题,所以需要定义一个接口以方便迁移到其他数据库, 事务没提供命名,若 ...

  8. 一个不错的PHP文件页面缓存类

    在php中缓存分类数据库缓存,文件缓存和内存缓存,下面我来给各位同学详细介绍PHP文件缓存类实现代码,有需要了解的朋友可参考. 页面缓存类 <?php    /*    * 缓存类    cac ...

  9. nginx和apache最核心的区别在于apache是同步多进程模型,一个连接对应一个进程;nginx是异步的,多个连接(万级别)可以对应一个进程

    nginx和apache的一些优缺点比较,摘自网络,加自己的一些整理. nginx相对于apache的优点: 1.轻量级,同样是web 服务,比apache 占用更少的内存及资源 2.抗并发,ngin ...

随机推荐

  1. Linux-PAM(Linux下的密碼認證和安全机制)系統管理員指南(中文版)

    he Linux-PAM 系统管理员指南作者:Andrew G. Morgan, morgan@linux.kernel.org翻译:孙国清(Thomas Sun),thomassun@yeah.ne ...

  2. 文件和目录之symlink和readlink函数

    symlink函数创建一个符号链接. #include <unistd.h> int symlink( const char *actualpath, const char *sympat ...

  3. Windows 7 Ultimate(旗舰版)SP1 32/64位官方原版下载(2011年5月12日更新版)

    MSDN于2011年5月12日,最新发布简体中文Windows 7 Ultimate 旗舰版 SP1 DVD镜像安装包,分32位和64位两个版本.最新发行代号分别是:677486(32位),67740 ...

  4. dos常用文件操作命令

    1.DIR 含义: 显示指定目录下的文件和子目录列表 类型: 内部命令 格式: DIR[drive:][path][filename][/p][/w][/A[[:]attributes]][/O[[: ...

  5. TOP30专访:捕鱼达人陈昊芝

    原文:http://www.csdn.net/article/2012-04-04/313919/1 编者按:3月31日,第四届CocoaChina游戏开发者大会暨Cocos2D-X技术研讨会在北京举 ...

  6. Upgrade Guide

    Upgrade Guide This guide will point out the key points to be aware of when upgrading to version 3. A ...

  7. FBReaderJ 编译Jni

    最近要做一个电子书项目用到FBReaderJ 第一步,也是最难的一步,要编译他的Jni 文件,对于android开发还是小白的我,只能说难!好难!非常难!,于是乎百度了一下,找到几篇有价值性的文章 第 ...

  8. Hibernate学习笔记--------4.查询

    一.Get/Load Get方法是立即检索,而load是延迟检索,他们都是根据主键进行查询.在<class>标签中,若把lazy属性改为false,load方法就会立即检索,class中的 ...

  9. WebSocket原理及与http1.0/1.1 long poll和 ajax轮询的区别【转自知乎】

    一.WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连接,循环连接的不算)首先HTTP有1.1和1.0之说,也就是所谓的ke ...

  10. linux commond

    1  vi /etc/sysconfig/network-scripts/ifcfg-eth0     2  ifconfig    3  ping 172.22.14.59    4  ping 1 ...