📄 main.pas
字号:
//调整下划线位置
if pop_HangD.Checked then //行距加倍,则下划线多移一行
UnderLine.Top:=Page_Top_v-(2*UnderLine_Number-1)*PageFont.Font.Height+UnderLine_Offset
else
UnderLine.Top:=Page_Top_v-UnderLine_Number*PageFont.Font.Height+UnderLine_Offset;
end;
procedure Tf_main.FormResize(Sender: TObject);
begin
//判断是否允许改变窗口大小
if Book_Resize_Flag then exit;
//判断窗口不能过小
if f_main.Width<2*Book_Button_Width_v+100 then
f_main.Width:=2*Book_Button_Width_v+100;
if f_main.Height<3*Book_Button_Width_v+50 then
f_main.Height:=3*Book_Button_Width_v+50;
//调整窗口位置、大小变量
Book_Left_v:=f_main.Left;
Book_Top_v:=f_main.Top;
Book_Width_v:=f_main.Width;
Book_Height_v:=f_main.Height;
if xtsub then exit; //若为系统调用,则退出
Init_Window; //初始化窗口
Init_Page; //初始化页面
Init_Page_String; //初始化页面内容
Init_ye; //初始化页码
end;
procedure Tf_main.pop_openClick(Sender: TObject);
var OpenFileIndex : integer; //打开文件索引
OpenFileCount : Longint; //打开文件总数
begin
f_main.Enabled:=False;
//打开对话框,错误则退出
if not OpenTextFile.Execute then
begin
f_main.Enabled:=True;
Exit;
end;
f_main.Enabled:=True;
//打开参数文件
Openfile_Flag:=False; //写标志:没有正确打开文件
OpenFileCount:=OpenTextFile.Files.Count; //获得总文件数
if OpenFileCount>Reg_Filename_Count then
OpenFileCount:=Reg_Filename_Count;
Open_File_Count:=0; //文件计数写0
Open_blf_File:=False; //写标志:不是打开书库文件
for OpenFileIndex:=OpenFileCount-1 downto 0 do
begin
pFileName:=OpenTextFile.Files.Strings[OpenFileIndex]; //菜单文件名
Open_Param_file(pFileName); //打开参数文件
end;
//判断是否打开了书库文件,并且删除原最新菜单
if (Open_blf_File) and (f_setup.Check_ClearNew.Checked) then
for OpenFileIndex:=Open_File_Count to pop_new.Count-1-2 do
Delete_NewItem(Open_File_Count);
if Openfile_Flag then
begin //正确打开文件,则打开参数文件中第一个文件
OpenNew_Flag:=True; //写标志:打开最新文件标志
pOpenNew_Index:=0; //参数文件索引写0
pFilename:=pop_new.Items[0].Caption; //参数文件名
OpenFile; //打开文件
end;
end;
procedure Tf_main.OpenFile();
var NewFile_Index : integer; //写入新文件的索引
begin
//格式化菜单文件名
pFilename:=LowerCase(pFileName);
//以只读形式打开文件
if FileExists(pFileName) then
begin //文件存在,则打开文件
AssignFile(fp,pFilename);
FileMode:=0;
Reset(fp,1);
end
else
begin //文件不存在,显示打开文件错误
f_main.Enabled:=False;
Application.MessageBox(PChar('打开文件 '+pFileName+' 失败!'+#13+#10+'请检查文件是否存在。'), '错误', Mb_OK);
f_main.Enabled:=True;
OpenNew_Flag:=False; //写标志:不是打开最新文件
OpenNew_parm:=False; //写标志:不是打开参数文件
OpenNew_Item:=False; //写标志:不是仅假如菜单
Exit;
end;
//获得文件长度
FileLength:=FileSize(fp);
if FileLength>(MaxTextRead-1)*BufSize then
begin //文件太大,显示文件太大错误
f_main.Enabled:=False;
Application.MessageBox(PChar('文件 '+pFileName+' 太大,无法打开!'), '错误', Mb_OK);
CloseFile(fp); //关闭文件
f_main.Enabled:=True;
OpenNew_Flag:=False; //写标志:不是打开最新文件
OpenNew_parm:=False; //写标志:不是打开参数文件
OpenNew_Item:=False; //写标志:不是仅假如菜单
Exit;
end;
//调整参数
filename:=pfilename; //调整文件名
OpenNew_Index:=pOpenNew_Index; //调整打开的文件索引
Openfile_Flag:=True; //写标志:正确打开文件
inc(Open_File_Count); //文件计数+1
//调整参数文件索引
if OpenNew_parm then
OpenNew_Index:=Reg_Filename_Count-1;
//获得写入新文件的索引
//打开注册表
Reg_ini:=TRegIniFile.Create(Reg_Path);
Reg_ini.RootKey:=HKEY_LOCAL_MACHINE;
//获得索引
NewFile_Index:=Reg_ini.ReadInteger(Reg_File_Path,Reg_Filename_Sort+IntToStr(OpenNew_Index),0);
//关闭注册表
Reg_ini.Free;
//清除书签信息
for j:= 0 to Reg_Label_Count-1 do
begin
Label_Indexv[j]:=0; //书签索引写0
Label_Stringv[j]:=''; //书签标志写''
end;
//写入最新文件菜单,调整书签
//打开注册表
Reg_ini:=TRegIniFile.Create(Reg_Path);
Reg_ini.RootKey:=HKEY_LOCAL_MACHINE;
if (OpenNew_Flag) and (not OpenNew_parm) then
begin
//获得最新文件索引
k:=Reg_ini.ReadInteger(Reg_File_Path,Reg_Filename_Sort+IntToStr(OpenNew_Index),-1);
//获得当前参数文件的书签信息
for j:= 0 to Reg_Label_Count-1 do
begin
Label_Indexv[j]:=Reg_ini.ReadInteger(Reg_Label_Path,IntToStr(k)+Reg_Label+IntToStr(j),0);
Label_Stringv[j]:=Reg_ini.ReadString(Reg_Label_Path,IntToStr(k)+Reg_Label_String+IntToStr(j),'');
end;
if f_setup.Check_Item_Change.Checked then
pop_new.Delete(OpenNew_Index); //若改变最新菜单顺序,则删除原菜单
end
else
begin
//判断参数文件是否和最新文件相同
j:=0;
while (j<=pop_new.Count-1-2) do
begin
//判断是否存在相同的最新文件
if Lowercase(pfilename)=LowerCase(pop_new.Items[j].Caption) then
begin //已经存在相同文件
OpenNew_Index:=j; //参数文件索引写j
//获得最新文件索引
NewFile_Index:=Reg_ini.ReadInteger(Reg_File_Path,Reg_Filename_Sort+IntToStr(OpenNew_Index),-1);
//判断是否保留书签信息
if not f_setup.Check_ClearLab.Checked then
begin //保留书签信息
//获得当前参数文件的书签信息
for j:= 0 to Reg_Label_Count-1 do
begin
Label_Indexv[j]:=Reg_ini.ReadInteger(Reg_Label_Path,IntToStr(NewFile_Index)+Reg_Label+IntToStr(j),0);
Label_Stringv[j]:=Reg_ini.ReadString(Reg_Label_Path,IntToStr(NewFile_Index)+Reg_Label_String+IntToStr(j),'');
end;
end;
pop_new.Delete(OpenNew_Index); //删除原菜单
break;
end;
inc(j); //下一个最新文件
end;
end;
//关闭注册表
Reg_ini.Free;
//调整最新文件菜单
if not ((OpenNew_Flag) and (not f_setup.Check_Item_Change.Checked)) then
begin //改变最新文件菜单顺序
//加入最新文件菜单
if pop_new.Count-2>=Reg_Filename_Count then
pop_new.Delete(Reg_Filename_Count-1); //若最新文件菜单中文件过多,则删除最后一个
//建立最新文件子菜单
AddNew:=TMenuItem.Create(Self);
AddNew.Caption:=pfilename;
AddNew.OnClick:=OpenNewClick;
//更改最新文件菜单设置
pop_new.Insert(0,AddNew); //插入子菜单
pop_new.Enabled:=True; //允许使用下一级子菜单
pop_clearnew.Enabled:=True; //允许删除最新记录
//将最新文件写入注册表
//打开注册表
Reg_ini := TRegIniFile.Create(Reg_Path);
Reg_ini.RootKey:=HKEY_LOCAL_MACHINE;
//将其余最新文件下移一个
For i:= OpenNew_Index-1 Downto 0 do
begin
k:=Reg_ini.ReadInteger(Reg_File_Path,Reg_Filename_Sort+IntToStr(i),0);
Reg_ini.WriteInteger(Reg_File_Path,Reg_Filename_Sort+IntToStr(i+1),k);
end;
//写入注册表最新文件
Reg_ini.WriteInteger(Reg_File_Path,Reg_Filename_Sort+'0',NewFile_Index);
Reg_ini.WriteString(Reg_File_Path,Reg_Filename+IntToStr(NewFile_Index),pfilename);
//写入注册表最新文件的书签
for j:=0 to Reg_Label_Count-1 do
begin
Reg_ini.WriteInteger(Reg_Label_Path,IntToStr(NewFile_Index)+Reg_Label+IntToStr(j),Label_Indexv[j]);
Reg_ini.WriteString(Reg_Label_Path,IntToStr(NewFile_Index)+Reg_Label_String+IntToStr(j),Label_Stringv[j]);
end;
//关闭注册表
Reg_ini.Free;
//写最新文件索引为0
OpenNew_Index:=0;
end;
//将打开文件标志归位
OpenNew_Flag:=False; //写标志:不是打开最新文件
OpenNew_parm:=False; //写标志:不是打开参数文件
//仅加入菜单
if OpenNew_Item then
begin //若仅加入菜单,则退出
OpenNew_Item:=False; //写标志:不是仅假如菜单
CloseFile(fp); //关闭文件
exit;
end;
//读文件
//计算剩余文件长
LeftLength:=FileLength-trunc(FileLength/BufSize)*BufSize;
//清除缓冲内容
for i:=1 to BufSize do
DataBuf[i]:=#0;
//计算总文本框数
CountTextRead:=trunc(FileLength/BufSize);
//显示信息
f_mess.ShowMess.Caption:='打开文件';
f_mess.compper.Min:=0;
f_mess.compper.Position:=f_mess.compper.Min;
if LeftLength<>0 then
f_mess.compper.Max:=CountTextRead+1
else
f_mess.compper.Max:=CountTextRead;
f_mess.show;
Application.ProcessMessages;
for i:= 1 to CountTextRead do
begin
//显示完成度信息
f_mess.compper.Position:=i;
Application.ProcessMessages;
//读入文件
BlockRead(fp,DataBuf,SizeOf(DataBuf),Readnum);
TextRead_Bak[i]:=DataBuf;
end;
//清除缓冲内容
for i:=1 to BufSize do
DataBuf[i]:=#0;
//读剩余文件内容
if LeftLength<>0 then
begin
inc(CountTextRead);
//显示完成度信息
f_mess.compper.Position:=CountTextRead;
Application.ProcessMessages;
//读入剩余文件
BlockRead(fp,DataBuf,SizeOf(DataBuf),Readnum);
TextRead_Bak[CountTextRead]:=DataBuf;
//删除多余内容
Delete(TextRead_Bak[CountTextRead],LeftLength+1,SizeOf(DataBuf)-LeftLength);
end;
//关闭文件
CloseFile(fp);
//关闭显示信息
f_mess.Close;
Application.ProcessMessages;
//处理原始文本框
//显示信息
f_mess.ShowMess.Caption:='处理文件';
f_mess.compper.Position:=f_mess.compper.Min;
f_mess.show;
Application.ProcessMessages;
//处理原始文本框
for i:=1 to CountTextRead do
begin
//显示完成度信息
f_mess.compper.Position:=i;
Application.ProcessMessages;
EndChange:=False; //写标志:没有处理完成
ChangeIndex:=1; //从第1位开始搜索
while not EndChange do
begin
//搜索错误的换行
L:=Length(TextRead_Bak[i]);
j:=pos(#10,copy(TextRead_Bak[i],ChangeIndex,l-ChangeIndex+1));
k:=pos(#13,copy(TextRead_Bak[i],ChangeIndex,l-ChangeIndex+1));
if ((j=0) and (k=0)) or (ChangeIndex>l) then
EndChange:=True //结束搜索
else
begin
if ((j<k)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -