📄 main.pas
字号:
{
模块名称:电子小说阅读器
使用方法:1、Create
2、Show
返回值: 无
}
unit Main;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, Menus, ShellAPI, Buttons, ComCtrls, ImgList, Jpeg,
Clipbrd, FileCtrl, Registry, DlgText;
const
c_nTaskIcoMsg = WM_USER + 78; //托盘图标返回消息
c_nRegLabelCount = 20; //最多保存书签数
c_nBufSize = 25000; //文件读入缓存大小
c_strVer = '版本 2.68'; //当前版本号
type
TFormMain = class(TForm)
MenuMain: TPopupMenu;
ItemOpen: TMenuItem;
ItemSave: TMenuItem;
ItemNew: TMenuItem;
N8: TMenuItem;
ItemLib: TMenuItem;
N3: TMenuItem;
ItemDeal: TMenuItem;
ItemBIG5: TMenuItem;
ItemGB: TMenuItem;
ItemHtml: TMenuItem;
ItemChap: TMenuItem;
ItemHangD: TMenuItem;
ItemUnderLine: TMenuItem;
ItemEdit: TMenuItem;
ItemRefresh: TMenuItem;
N14: TMenuItem;
ItemSearch: TMenuItem;
ItemSearchNext: TMenuItem;
ItemDecode: TMenuItem;
ItemUnMimeCode: TMenuItem;
ItemUnQPCode: TMenuItem;
ItemUnHZCode: TMenuItem;
ItemLabel: TMenuItem;
ItemAddLabel: TMenuItem;
ItemEditLabel: TMenuItem;
ItemDeleteLabel: TMenuItem;
N9: TMenuItem;
ItemLabelInput: TMenuItem;
ItemInputYe: TMenuItem;
N12: TMenuItem;
ItemAutoPageMove: TMenuItem;
ItemMP3: TMenuItem;
ItemReadClip: TMenuItem;
N2: TMenuItem;
ItemSetup: TMenuItem;
N5: TMenuItem;
ItemShow: TMenuItem;
ItemMax: TMenuItem;
ItemRecordTime: TMenuItem;
ItemClearNewItem: TMenuItem;
N1: TMenuItem;
ItemAbout: TMenuItem;
N7: TMenuItem;
ItemQuit: TMenuItem;
MenuPageMove: TPopupMenu;
ItemPagePrev: TMenuItem;
ItemPageNext: TMenuItem;
N6: TMenuItem;
ItemPageFirst: TMenuItem;
ItemPageLast: TMenuItem;
N4: TMenuItem;
ItemInputYe1: TMenuItem;
N10: TMenuItem;
ItemFilePrev: TMenuItem;
ItemFileNext: TMenuItem;
MenuTime: TPopupMenu;
ItemShowTime: TMenuItem;
N11: TMenuItem;
ItemShowAlarm: TMenuItem;
MenuEdit: TPopupMenu;
ItemSaveEdit: TMenuItem;
ItemExitEdit: TMenuItem;
ImageBook: TImage;
ImageBookPic: TImage;
ImageBook1Pic: TImage;
ImageLabel: TImage;
ImageLabelPic: TImage;
ImageUnderLine: TImage;
ImagePagePrev: TImage;
ImagePageNext: TImage;
ImageMinSize: TImage;
ImageMove: TImage;
ImageResize: TImage;
ImageMinSizePic: TImage;
ImageMovePic: TImage;
ImageResizePic: TImage;
ImageListMenuMain: TImageList;
LabelPage1: TLabel;
LabelPage2: TLabel;
LabelPageTest: TLabel;
LabelYe1Be: TLabel;
LabelYe1: TLabel;
LabelYe1Af: TLabel;
LabelYe1Test: TLabel;
LabelYe2Be: TLabel;
LabelYe2: TLabel;
LabelYe2Af: TLabel;
LabelYe2Test: TLabel;
TimeAutoUnderLine: TTimer;
TimeShowTime: TTimer;
TimeKeyDelay: TTimer;
TimeRecord: TTimer;
TimeAutoPageMove: TTimer;
MemoReadme: TMemo;
MemoRTFRead: TRichEdit;
ListChap1: TListBox;
ListChap2: TListBox;
PanelLabel: TPanel;
PanelShowTime: TPanel;
//---窗体事件---
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure OnMinimize(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure FormHide(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
//---菜单事件---
procedure MenuMainPopup(Sender: TObject);
procedure ItemOpenClick(Sender: TObject);
procedure OnItemNewFileClick(Sender: TObject);
procedure ItemSaveClick(Sender: TObject);
procedure ItemLibClick(Sender: TObject);
procedure ItemBIG5Click(Sender: TObject);
procedure ItemEditClick(Sender: TObject);
procedure ItemRefreshClick(Sender: TObject);
procedure ItemSearchClick(Sender: TObject);
procedure ItemSearchNextClick(Sender: TObject);
procedure ItemAddLabelClick(Sender: TObject);
procedure ItemEditLabelClick(Sender: TObject);
procedure ItemDeleteLabelClick(Sender: TObject);
procedure OnLabelInputClick(Sender: TObject);
procedure ItemInputYeClick(Sender: TObject);
procedure ItemAutoPageMoveClick(Sender: TObject);
procedure ItemMP3Click(Sender: TObject);
procedure ItemReadClipClick(Sender: TObject);
procedure ItemSetupClick(Sender: TObject);
procedure ItemShowClick(Sender: TObject);
procedure ItemMaxClick(Sender: TObject);
procedure ItemRecordTimeClick(Sender: TObject);
procedure ItemClearNewItemClick(Sender: TObject);
procedure ItemAboutClick(Sender: TObject);
procedure ItemQuitClick(Sender: TObject);
procedure MenuPageMovePopup(Sender: TObject);
procedure ItemPagePrevClick(Sender: TObject);
procedure ItemPageNextClick(Sender: TObject);
procedure ItemPageFirstClick(Sender: TObject);
procedure ItemPageLastClick(Sender: TObject);
procedure ItemFilePrevClick(Sender: TObject);
procedure ItemFileNextClick(Sender: TObject);
procedure ItemShowAlarmClick(Sender: TObject);
procedure ItemShowTimeClick(Sender: TObject);
procedure ItemSaveEditClick(Sender: TObject);
procedure ItemExitEditClick(Sender: TObject);
//---图片事件---
procedure ImageBookMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
procedure ImageBookMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
procedure ImageBookMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
procedure LabelPage1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
procedure ImageMinSizeClick(Sender: TObject);
procedure ImageMoveMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
procedure ImageResizeMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
//---时钟事件---
procedure TimeAutoPageMoveTimer(Sender: TObject);
procedure TimeShowTimeTimer(Sender: TObject);
procedure TimeAutoUnderLineTimer(Sender: TObject);
procedure TimeKeyDelayTimer(Sender: TObject);
procedure TimeRecordTimer(Sender: TObject);
procedure ShowTime(Show : Boolean);
//---初始化事件---
procedure Init; //初始化所有东西
procedure Init_Var; //初始化变量和注册表
procedure Init_Setup; //初始化各种设置
procedure Init_Max; //初始化窗口的最大化显示
procedure Init_Window; //初始化窗口的位置和大小
procedure Init_Page; //初始化页面、下划线
procedure Init_Page_String; //初始化页面的显示内容
procedure Init_Ye; //初始化页码
procedure Init_Ye_View; //初始化页码显示
procedure Init_UnderLine; //初始化下划线
procedure Init_Text; //初始化文本
procedure Init_UnMimeCode; //初始化UnMimeCode
procedure Init_UnQPCode; //初始化UnQPCode
procedure Init_UnHZCode; //初始化UnHZCode
procedure Init_BIG5; //初始化BIG5toGB
procedure Init_GB; //初始化GBtoBIG5
procedure Init_AutoGB; //初始化AutoGB
procedure Init_Html; //初始化Html
procedure Init_Chap; //初始化智能分段
procedure Init_Page_Do; //初始化页面处理
procedure Init_BackImage; //初始化背景图片
procedure Init_LabelImage; //初始化书签图片
procedure Init_ViewCtrl; //初始化界面控制按钮
//---打开文件事件---
function OpenParamFile(Filename : string) : Boolean;
function OpenItemFile(Filename : string) : Boolean;
function OpenFile(Filename : string) : Boolean;
procedure OpenDiskFile(Incr : integer);
function GetNextFilename(Filename : string; Incr : integer) : string;
function isFileExist(Filename : string; isShowMessage : Boolean) : Boolean;
function isZipSubFile(Filename : string) : Boolean;
//---其他事件---
procedure ShowMainForm;
procedure UpdateMainForm;
procedure ChangeYe(YeNumber : integer);
procedure DeleteNewItem(index : integer);
procedure InitShowMess(PosMin, PosMax : integer; Msg : string);
procedure ShowMessPos(Pos : integer);
procedure CloseShowMess;
procedure MoveUnderLine(Kind : integer);
procedure DoSearch(SearchString : string; Caps : Boolean);
function GetIndexFilename(index : integer) : string;
function GetItemFilename(index : integer; Filename : string) : string;
procedure GetZipFilename(Filename : string; var strZipFilename, strZipSubFilename : string);
procedure OnMemoPageEditKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure ImageLabelMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
procedure PanelShowTimeMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
//---系统变量---
FpNotify : PNotifyIconDataA; //定义托盘图标结构
FboolIsMP3Show : Boolean; //MP3窗口是否显示
FboolEdit : Boolean; //编辑状态
FboolSaveEdit : Boolean; //保存编辑状态
FnKeyOpenFile : integer; //使用键盘打开文件的索引(将键码转换为最新文件的序号)
//---对话框变量---
FDlgOpenTextFile : TOpenTextDialog; //定义打开文件对话框
FDlgSaveTextFile : TOpenTextDialog; //定义保存文件对话框
FDlgSaveLibFile : TOpenTextDialog; //定义保存书库文件对话框
//---窗口变量---
FnBookLeftBeMax : integer; //最大化前的窗口左位置
FnBookTopBeMax : integer; //最大化前的窗口上位置
FnBookWidthBeMax : integer; //最大化前的窗口宽度
FnBookHeightBeMax : integer; //最大化前的窗口高度
FboolBookResizeFlag : Boolean; //窗口改变大小标志(屏蔽Form.Resize)
FnWidthAvg : Real; //窗口宽度平均值
FnHeightAvg : Real; //窗口高度平均值
//---页面变量---
FnPage1Left : integer; //左页面左位置
FnPage2Left : integer; //右页面左位置
FnPageTop : integer; //页面上位置
FnPageWidth : integer; //页面宽度
FnPageHeight : integer; //页面高度
FnPageNumber : integer; //页面可存放行数
FnPageTestHeight : integer; //测试页面的高度
FnPageMouseDown : integer; //页面上是否有鼠标按下
//---下划线变量---
FnUnderLineLocate : integer; //下划线位置
FnUnderLineNumber : integer; //下划线的行数
//---文本框变量---
FMemoTextRead : array of TMemo; //最终用于显示的文本框
FMemoPageEdit : array [1 .. 2] of TMemo; //原稿编辑窗口
FstrTextReadReady : array of string; //处理后的文本框
FstrTextReadBak : array of string; //原始的文本框
FnCountLines : integer; //总行数
FnCountTextRead : integer; //实际总文本框数
FnCurrentTextRead : integer; //当前文本框数
FnPageLineNumber : integer; //页起始行数
FnCountLineNumber : integer; //总文本框行数
//---最新文件变量---
FstrNewFileList : TStringList; //最新文件列表
//---书签变量---
FnLabelLeft : integer; //书签左位置
FnLabelTop : integer; //书签上位置
FnLabelWidth : integer; //书签宽度
FnLabelHeight : integer; //书签高度
FboolCurrentLabel : boolean; //当前有没有书签显示
FItemAddLabel : TMenuItem; //书签添加菜单
FnLabelIndex : array [0 .. c_nRegLabelCount - 1] of integer; //书签索引
FstrLabelString : array [0 .. c_nRegLabelCount - 1] of string; //书签说明
//---翻页变量---
FnPageNextLeft : integer; //右翻页左位置
FnPageMoveWidth : integer; //翻页宽度
FnPageMoveHeight : integer; //翻页高度
//---自动翻页变量---
FboolTestAutoPage : Boolean; //测试自动翻页
FnPageRecordTime : integer; //测试翻页时间
//---按钮变量---
FnBookButtonWidth : integer; //系统按钮的宽度
//---页码变量---
FnYeLocLeft : integer; //页码左位置
FnYeLocTop : integer; //页码上位置
FnYeOffset : integer; //页码偏移量
//---文件变量---
FpFile : File; //一般文件指针
FpLibFile : TextFile; //书库文件指针
ItemAddNew : TMenuItem; //添加最新文件的菜单
FnCloseFileIndex : integer; //上次关闭时候的文件名索引
FstrCloseFilename : string; //上次关闭时候的文件名
FnCloseFileYe : integer; //上次关闭时候的文件页码
FboolOpenLibFile : Boolean; //打开书库文件标志
FboolOpenFileFlag : Boolean; //正确打开文件标志
FnOpenFileCount : integer; //打开的文件总数
FnOpenNewIndex : Integer; //打开最新文件索引
FnReadnum : integer; //实际读取文件长度大小
FstrDataBuf : array [1 .. c_nBufSize + 5000] of Char; //读文件的缓冲(加5000是因为转换的时候会多出一些字节)
public
{ Public declarations }
procedure TaskIcoMsgDo(var Msg : TMessage); Message c_nTaskIcoMsg; //托盘图标的返回消息
procedure DropFiles(var Msg : TMessage); Message WM_DROPFILES; //拖动文件消息
function DeleteDirectory(DirName : string) : boolean; //删除目录
end;
//---定义基本常量---
const
//---系统常量---
c_nDragMove = $F017; //移动控件消息
c_strLibFile = 'blf'; //书库文件扩展名
c_strZipPassTempDir = '\~TaleZip'; //ZIP文件临时解压目录
c_strPopNewIndex = ') '; //最新文件菜单索引序号分隔符
//---窗口常量---
c_nBookLeft = 100; //窗口左位置
c_nBookTop = 50; //窗口上位置
c_nBookWidth = 556; //窗口宽度
c_nBookHeight = 380; //窗口高度
//---页面常量---
c_nPage1Left = 33; //左页面左位置
c_nPage2Left = 306; //右页面左位置
c_nPageTop = 28; //页面上位置
c_nPageWidth = 230; //页面宽度
c_nPageHeight = 330; //页面高度
//---书签常量---
c_nLabelLeft = 300; //书签左位置
c_nLabelTop = 5; //书签上位置
c_nLabelWidth = 40; //书签宽度
c_nLabelHeight = 90; //书签高度
//---翻页常量---
c_nPageNextLeft = 543; //右翻页的左位置
c_nPageMoveWidth = 13; //翻页宽度
c_nPageMoveHeight = 380; //翻页宽度
//---页码常量---
c_nYeLocLeft = 11; //页码左位置
c_nYeLocTop = 8; //页码上位置
//---注册表常量---
//---系统注册目录---
c_strRegPath = 'Software\Tale\ReadBook'; //系统目录
c_strRegBookPath = 'Book Files'; //右键菜单注册路径
c_strRegFilePath = 'Software\Tale\ReadBook\File'; //最新文件目录
c_strRegFontPath = 'Software\Tale\ReadBook\Font'; //字体目录
c_strRegLabelPath = 'Software\Tale\ReadBook\Label'; //书签目录
c_strRegAlarmPath = 'Software\Tale\ReadBook\Alarm'; //定时提醒目录
//---注册标志---
c_strRegRegFlag = '注册';
c_strRegRegVer = '版本';
//---注册书本设置---
c_strRegBookLeft = '窗口左位置';
c_strRegBookTop = '窗口上位置';
c_strRegBookWidth = '窗口宽度';
c_strRegBookHeight = '窗口高度';
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -