⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mainunit.cpp

📁 一个小巧实用的电子书库程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
//---------------------------------------------------------------------------
//(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 + -