第一部分实现功能:使用一个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 ...
随机推荐
- max_user_connections 与 max_connections,max_connect_errors, nr_open, file-max
LINUX文件设置: ulimit -n <num> ----> [/etc/profile,/.bashrc] ---->/etc/security/limits.conf ...
- C#_delegate - 调用列表 计算阶乘
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Dele ...
- Java + MongoDB Hello World Example--转载
原文地址:http://www.mkyong.com/mongodb/java-mongodb-hello-world-example/ A simple Java + MongoDB hello w ...
- Android_ViewFlipper
xml: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:t ...
- 关于Eclipse插件开发(四)-------给视图加下拉菜单和按钮和加入编辑器.
本例将给视图加入下拉菜单和按钮,同时再为列表添加一个右键菜单. 创建ActionGroup类 加入菜单和按钮的方法与SWT和JFace组件的一样,先创建一个ActionGroup代码如下: MyAct ...
- 根据日期字符串获取星期几,日期获取星期,时间获取星期,js获取星期
根据日期字符串获取星期几,日期获取星期,时间获取星期,js获取星期 >>>>>>>>>>>>>>>>&g ...
- [记录] js判断数组key是否存在
数组中判断key是否存在 可以通过arrayObject.hasOwnProperty(key)来进行判断数组key是否存在,返回的是boolean值,如果存在就返回true,不存在就返回false ...
- cisco通过控制口或者通过远程配置交换机
学而不思则罔,思而不学则殆,每天坚持一小步,则成功一大步 下面我们通过Cisco Packet来模拟交换机和路由器的远程和控制台登录配置交换机. 交换机console口的连接与配置方法 (1),在Ci ...
- 12天学好C语言——记录我的C语言学习之路(Day 7)
12天学好C语言--记录我的C语言学习之路 Day 7: 昨天进行了一天的数组学习,今天大家可以先写几个昨天的程序热热身,回顾回顾,然后今天第一个新程序也是关于数组的,比较难,准备好就开始啦! //输 ...
- leetcode之Rectangle Area
Find the total area covered by two rectilinear rectangles in a 2D plane. Each rectangle is defined b ...