📄 mainunit.cpp
字号:
//---------------------------------------------------------------------------
//(R)CopyRight KivenSoft International ,inc 1998
//程序名称:电子书库
//作 者:李会文
//开始时间:1998.07.28
//最后修改:1998.12.02
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "MainUnit.h"
#include "Option.h"
#include "About.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
const char IdxExt[4]="idx";
const char TreExt[4]="tre";
const char DatExt[4]="dat";
const char TmpExt[4]="tmp";
TMainForm *MainForm;
//---------------------------------------------------------------------------
//得到行列值
void TMainForm::GetLineRow(void)
{
char Buf[30];
sprintf(Buf,"行:%d",SendMessage(RichEdit->Handle,EM_LINEFROMCHAR,-1,0)+1);
StatusBar->Panels->Items[0]->Text=Buf;
sprintf(Buf,"列:%d",RichEdit->SelStart-SendMessage(RichEdit->Handle,EM_LINEINDEX,-1,0)+1);
StatusBar->Panels->Items[1]->Text=Buf;
StatusBar->Panels->Items[2]->Text=AnsiString("总长:")+RichEdit->GetTextLen();
}
//---------------------------------------------------------------------------
//根据文件扩展名取相应的完整文件名
char* TMainForm::GetFileName(const char* Ext)
{
char *pTemp;
pTemp=ExtFileName;
while(*pTemp)pTemp++; //移pTemp到字符串尾部
*(pTemp-3)=*Ext;
*(pTemp-2)=*(Ext+1);
*(pTemp-1)=*(Ext+2);
return ExtFileName;
}
//---------------------------------------------------------------------------
//从全路径的文件名中得到纯文件名
char* TMainForm::GetNameFromFileName(char *Buf,const char* Fn)
{
char *p=Buf;
while(*(Fn++)); //移指针到字符串尾
while(*Fn!=92)Fn--; //向前直到遇见第一个反斜杠
Fn++;
while( (*Fn!=46) && *Fn ) //不等于'.'且不到尾时循环
{
*p=*Fn;
Fn++;
p++;
}
*p=0;
return Buf;
}
//---------------------------------------------------------------------------
//根据注册表设置应用程序状态
void TMainForm::LoadStatusFromReg(void)
{
int iTemp;
if(Reg->ValueExists("LeftPanel"))
{
Width=Reg->ReadInteger("Width");
Height=Reg->ReadInteger("Height"); //窗体的高和宽
LeftPanel->Width=Reg->ReadInteger("LeftWidth"); //左边的宽
ToolsMenuItem->Checked=Reg->ReadBool("ToolBar");
StatusMenuItem->Checked=Reg->ReadBool("StatusBar"); //工具和状态栏的显示状态
TitleMenuItem->Checked=Reg->ReadBool("LeftPanel");
LineCount=Reg->ReadInteger("LineCount");
TreeView->Font->Size=Reg->ReadInteger("TreeFontSize");
RichEdit->Font->Size=Reg->ReadInteger("FontSize");
LeftPanel->Visible=TitleMenuItem->Checked;
Splitter->Visible=TitleMenuItem->Checked;
LeftPanelToolButton->Down=TitleMenuItem->Checked;
ToolBar->Visible=ToolsMenuItem->Checked;
StatusBar->Visible=StatusMenuItem->Checked;
}
else //第一次运行本程序
{
LineCount=70;
Reg->WriteString("","电子书库");
}
iTemp=GetSystemMetrics(SM_CXSCREEN);
if(iTemp<Width)
{
Width=iTemp;
Left=0;
}
iTemp=GetSystemMetrics(SM_CYSCREEN);
if(iTemp<Height)
{
Height=iTemp;
Top=0;
} //防止用户改变分辨率而造成窗口不正常显示
}
//---------------------------------------------------------------------------
//把应用程序状态保存在注册表
void TMainForm::SaveStatusToReg(void)
{
Reg->WriteInteger("Width",Width);
Reg->WriteInteger("Height",Height); //窗体的高和宽
Reg->WriteInteger("LeftWidth",LeftPanel->Width); //左边的宽
Reg->WriteBool("LeftPanel",LeftPanel->Visible);
Reg->WriteBool("ToolBar",ToolBar->Visible);
Reg->WriteBool("StatusBar",StatusBar->Visible);
Reg->WriteInteger("LineCount",LineCount);
Reg->WriteInteger("FontSize",RichEdit->Font->Size);
Reg->WriteInteger("TreeFontSize",TreeView->Font->Size);
}
//---------------------------------------------------------------------------
//为第一次运行初始化数据库
void TMainForm::InitDatabase(void)
{
FILE *IdxFp;
AnsiString TempName;
TempName=GetFileName(TreExt);
if(!FileExists(TempName)) //如果Tre文件不存在
{
TreeView->SaveToFile(TempName);
IdxFp=fopen(GetFileName(IdxExt),"wb");
fclose(IdxFp);
DatFp=fopen(GetFileName(DatExt),"wb");
fclose(DatFp); //新建三个长度为0的空文件
}
}
//---------------------------------------------------------------------------
//将索引装入TreeView
void TMainForm::LoadIndexFromFile(void)
{
int i,IdxCount,*IdxBuf;
FILE *IdxFp;
AnsiString TempName;
TempName=GetFileName(TreExt);
TreeView->LoadFromFile(TempName); //装入树形视图的标题
IdxCount=TreeView->Items->Count;
IdxBuf=new int[IdxCount];
IdxFp=fopen(GetFileName(IdxExt),"rb");
try
{
fread(IdxBuf,sizeof(int),IdxCount,IdxFp);
for(i=0;i<IdxCount;i++)
TreeView->Items->Item[i]->ImageIndex=*(IdxBuf+i); //装入相应的索引
}
__finally
{
delete IdxBuf;
fclose(IdxFp);
}
StatusBar->Panels->Items[3]->Text=AnsiString("总记录数:")+IdxCount;
}
//---------------------------------------------------------------------------
//从TreeView把索引存入到文件
void TMainForm::SaveIndexToFile(void)
{
int i,IdxCount,*IdxBuf;
FILE *IdxFp;
AnsiString TempName;
TempName=GetFileName(TreExt);
TreeView->SaveToFile(TempName); //保存树形视图的标题
IdxCount=TreeView->Items->Count;
IdxBuf=new int[IdxCount];
IdxFp=fopen(GetFileName(IdxExt),"wb");
try
{
for(i=0;i<IdxCount;i++)
*(IdxBuf+i)=TreeView->Items->Item[i]->ImageIndex;
fwrite(IdxBuf,sizeof(int),IdxCount,IdxFp); //保存相应的索引
}
__finally
{
delete IdxBuf;
fclose(IdxFp);
}
IndexChanged=false; //置索引改动标志为假
}
//---------------------------------------------------------------------------
//按索引装入正文内容
void TMainForm::LoadContentFromFile(void)
{
char *Buf;
int Size;
if(ActiveNode->ImageIndex==-1) //如果索引指针为-1(即没有内容)
{
RichEdit->Lines->Clear();
PrintToolButton->Enabled=false;
return;
}
else
{
fseek(DatFp,ActiveNode->ImageIndex,0); //移指针到相应文本的位置
fread(&Size,sizeof(int),1,DatFp); //读出文本的长度
Buf=new char[Size];
try
{
fread(Buf,sizeof(char),Size,DatFp);
RichEdit->SetTextBuf(Buf); //读出文本并置入RichEdit
}
__finally
{
delete Buf;
}
PrintToolButton->Enabled=true;
}
StatusBar->Panels->Items[2]->Text=AnsiString("总长:")+RichEdit->GetTextLen();
RichEdit->Modified=false; //置RichEdit的改动标志为假
}
//---------------------------------------------------------------------------
//添加新的正文内容到文件
void TMainForm::SaveContentToFile(void)
{
char *Buf;
int Size;
if(!RichEdit->GetTextLen()) //如果没有文本
{
ActiveNode->ImageIndex=-1;
}
else
{
fseek(DatFp,0,2); //移指针到文件尾
ActiveNode->ImageIndex=ftell(DatFp); //更新索引所指向的指针
Size=RichEdit->GetTextLen()+1; //得到文本的长度
Buf=new char[Size];
try
{
RichEdit->GetTextBuf(Buf,Size);
fwrite(&Size,sizeof(int),1,DatFp); //写入文本的长度
fwrite(Buf,sizeof(char),Size,DatFp); //写入文本
}
__finally
{
delete Buf;
}
}
IndexChanged=true; //置索引改动标志为真
RichEdit->Modified=false; //置RichEdit的改动标志为假
}
//---------------------------------------------------------------------------
void TMainForm::CompressDatabase(void)
{
char *ContentBuf,*DatFileName;
int i,ContentSize,MemSize,IdxCount,*IdxBuf;
FILE *TmpFp,*IdxFp;
char FName[256];
bool NewMemFlag;
NewMemFlag=false;
MemSize=0;
IdxCount=TreeView->Items->Count;
IdxBuf=new int[IdxCount];
strcpy(FName,GetFileName(TmpExt));
TmpFp=fopen(FName,"wb");
for(i=0;i<IdxCount;i++)
{
if(TreeView->Items->Item[i]->ImageIndex!=-1)
{
fseek(DatFp,TreeView->Items->Item[i]->ImageIndex,0);
fread(&ContentSize,sizeof(int),1,DatFp);
if(MemSize<ContentSize)
{
if(NewMemFlag)
delete ContentBuf;
ContentBuf=new char[ContentSize];
MemSize=ContentSize;
NewMemFlag=true;
}
else
{
NewMemFlag=false;
}
fread(ContentBuf,sizeof(char),ContentSize,DatFp);
TreeView->Items->Item[i]->ImageIndex=ftell(TmpFp); //得文件新指针位置
*(IdxBuf+i)=TreeView->Items->Item[i]->ImageIndex;
fwrite(&ContentSize,sizeof(int),1,TmpFp);
fwrite(ContentBuf,sizeof(char),ContentSize,TmpFp); //写入
}
else
*(IdxBuf+i)=-1;
}
fclose(TmpFp);
fclose(DatFp);
IdxFp=fopen(GetFileName(IdxExt),"wb");
fwrite(IdxBuf,sizeof(int),IdxCount,IdxFp);
fclose(IdxFp); //重写IDX文件
DatFileName=GetFileName(DatExt);
remove(DatFileName);
rename(FName,DatFileName);
DatFp=fopen(DatFileName,"rb+"); //将新文件改名为DAT并打开
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//窗体的构造函数
__fastcall TMainForm::TMainForm(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
//窗体显示前
void __fastcall TMainForm::FormShow(TObject *Sender)
{
extern DWORD ITime;
int (PASCAL *proc)();
hhctrl=LoadLibrary("hhctrl.ocx");
if(hhctrl)
{
proc=GetProcAddress(hhctrl,"HtmlHelpA");
(void*)HtmlHelp=(void*)proc;
} //得HTML帮助函数的地址
IndexChanged=false; //置索引改变标志为假
Reg=new TRegistry;
Reg->RootKey=HKEY_USERS;
Reg->OpenKey(".DEFAULT\\SOFTWARE\\KivenSoft\\CManager",true); //打开相应的键值
LoadStatusFromReg(); //装入上次应用程序的状态
strcpy(ExtFileName,Application->ExeName.c_str()); //COPY一份应用程序的名字
InitDatabase(); //检查应用程序是否第一次运行
LoadIndexFromFile(); //初始化树形视图
DatFp=fopen(GetFileName(DatExt),"rb+"); //打开数据文件
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -