效果图:

一期功能概要:

  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. jbpm入门样例

    1.      jBPM的简介 jBPM是JBOSS下的一个开源java工作流项目,该项目提供eclipse插件,基于Hibernate实现数据持久化存储.    參考 http://www.jbos ...

  2. PAT 1016

    1016. Phone Bills (25) A long-distance telephone company charges its customers by the following rule ...

  3. (收藏)sokcet编程

    C# Socket网络编程精华篇 C#编写高性能网络服务器(源码) .net自动更新组件Ant 客户端服务器通信demo(附源码) 有了WCF,Socket是否已人老珠黄? Socket服务器整体架构 ...

  4. Redirect

    Redirect To use this Class, add the following to the top of the file. use Redirect; Redirect::to($pa ...

  5. 手动开启tomacat服务器

    四.配置Tomcat环境变量 1,新建变量名(关键,你的tomacat安装目录):CATALINA_BASE,变量值:E:\apache-tomcat-6.0.37 2,新建变量名(关键,你的toma ...

  6. logstash-input-file 参数说明

    参数 close_older close_older: # This has different implications depending on if a file is being tailed ...

  7. Windows Azure入门教学:使用Blob Storage

    对于.net开发人员,这是一个新的领域,但是并不困难.本文将会介绍如何使用Blob Storage.Blob Storage可以看做是云端的文件系统.与桌面操作系统上不同,我们是通过REST API来 ...

  8. asp生成静态HTML(动态读取)

    这样的代码多用于我们没有实现设计生成静态的功能,但又想临时将一些动态页面生成静态的,直接获取动态内容并保存为静态的 复制代码代码如下: <!--#include file="admin ...

  9. 支持IE,FireFox,Chrome三大主流浏览器,通过js+Flash方式将table导出Excel文件

    今天在做项目的时候,遇到了前端下载Excel的功能,结果原先的代码,如下: function generate_excel(tableid) {        var table = document ...

  10. Install GTK in Ubuntu

    reference: http://www.cnblogs.com/niocai/archive/2011/07/15/2107472.html 一.安装 1.安装gcc/g++/gdb/make 等 ...