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

📄 refermain.cpp

📁 《C++ Builder 5技术内幕》一书附带的程序源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop

//#include <process.h>
#include "ReferMain.h"
//#include "Refer.h"
#include "Container.h"
#include "refabout.h"
#include "SrchRslt.h"
#include "Searchin.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "cspin"
#pragma resource "*.dfm"
TMainFormRefer *MainFormRefer;
//extern TReferenceStream *pReferenceStream;

//---------------------------------------------------------------------------
__fastcall TMainFormRefer::TMainFormRefer(TComponent* Owner)
    : TForm(Owner)
{
  m_asReferDatabaseName = AnsiString( "ReferDB.rdf" );
  m_eStatus     = msNone;
  m_bSearching  = true;
  m_bSearched   = false;
  m_bModified   = true;
  if( FileExists( "wordlist.txt" ) )
    m_bWithParser = InitializeParser();
  else
    m_bWithParser = false;
// The Mode parameter indicates how the file is to be opened.
// The Mode parameter consists of an open mode and a share mode or/and together.
//
// The open mode must be one of the following values:
//
// Value            Meaning
// fmCreate	        TFileStream a file with the given name. If a file with the given name exists, open the file in write mode.
// fmOpenRead	    Open the file for reading only.
// fmOpenWrite	    Open the file for writing only. Writing to the file completely replaces the current contents.
// fmOpenReadWrite	Open the file to modify the current contents rather than replace them.
//
// The share mode must be one of the following values:
//
// Value            Meaning
// fmShareCompat	Sharing is compatible with the way FCBs are opened.
// fmShareExclusive	Other applications can not open the file for any reason.
// fmShareDenyWrite	Other applications can open the file for reading but not for writing.
// fmShareDenyRead	Other applications can open the file for writing but not for reading.
// fmShareDenyNone	No attempt is made to prevent other applications from reading from or writing to the file.
//
// Read reference database.
// If the pointer can not be constructed, application will have to be terminated.
///////////////////////////////////////////
  try
  {
    m_prlReferList = new TList;
    if( FileExists( m_asReferDatabaseName ) )
    {
      AnsiString asTitle = Caption;
      Caption = asTitle + AnsiString( " - "  ) + m_asReferDatabaseName;
//  Construct reference database stream according to the file's contents
      m_prsReferenceStream = new TReferenceStream( m_asReferDatabaseName, fmOpenReadWrite );
//  Seek to the very beginning of the reference database.
      m_prsReferenceStream->Seek( 0, soFromBeginning );
//  Get the reference database header.
      m_prsReferenceStream->ReadReferDatabaseHeader( &m_rdReferDBHeader );
//  If exists some reference records.
      if ( m_rdReferDBHeader.nCount > 0 )
      {
//  Seek to the very beginning of the reference database.
        m_prsReferenceStream->Seek( 0, soFromCurrent );
//  Insert all reference records to list.
        InsertAllReferRecToList();
//  Get the current working reference record, the default is the first one.
        m_nWorkingReferRec = 1;
      }
//  Otherwise
      else
        m_nWorkingReferRec = 0;
    }
    else
    {
      AnsiString asTitle = Caption;
      Caption = asTitle + AnsiString( " - [New]"  ) + m_asReferDatabaseName;
//  Construct a new reference database stream
      m_prsReferenceStream = new TReferenceStream( m_asReferDatabaseName, fmCreate );
//  Construct a new working reference record, which can be inserted into the stream.
      m_prsReferenceStream->Seek( 0, soFromBeginning );
//  Initialize reference workspace with all 0s.
      m_nWorkingReferRec = 0;
//      InitializeWorkspace();
    }
  }
  catch ( ... )
  {
    Application->MessageBox(
        AnsiString( const_cast< char * >( MI_NOMEMORY ) ).c_str(),
        const_cast< char * >( MT_FATALERROR ),
        MB_OK + MB_ICONERROR );
    Application->Terminate();
  }
////////////////////////////////////////
// Construct the pointer to current reference record.
// If the pointer can not be constructed, application will have to be terminated.
//  try
//  {
//    TReferRecord *m_pWorkingReferRec = m_pReferenceStream->GetCurrentRefer();
//    m_refWorkingReferRec = m_pWorkingReferRec;
//  }
//  catch ( ... )
//  {
//    Application->MessageBox(
//        AnsiString( const_cast< char * >( MI_NOMEMORY ) ).c_str(),
//        const_cast< char * >( MT_FATALERROR ),
//        MB_OK + MB_ICONERROR );
//    Application->Terminate();
//  }
  m_nSearchedReferRec    = 0;
  m_prlSearchedReferList = NULL;
}
//---------------------------------------------------------------------------

bool __fastcall TMainFormRefer::InitializeParser()
{
  MemoParser->Clear();
//  Try to open parser file.
  try
  {
    MemoParser->Lines->LoadFromFile( "wordlist.txt" );
  }
  catch( const EFOpenError& e )  // EFOpenError
  {
    int nButton = Application->MessageBox(
        AnsiString( const_cast< char * >( MI_NOPARSER ) ).c_str(),
        const_cast< char * >( MT_GENERALERROR ),
        MB_OKCANCEL + MB_ICONERROR );
    if( nButton == IDOK )
      return false;
    if( nButton == IDCANCEL )
      Application->Terminate();
  }
//  Success.
  return true;
}
//---------------------------------------------------------------------------

bool __fastcall TMainFormRefer::InsertAllReferRecToList()
{
  try
  {
    while ( m_rdReferDBHeader.nCount-- > 0 )
    {
      TReferRecord *prrReferRec = new TReferRecord;
      m_prsReferenceStream->ReadReferRecord( prrReferRec );
      m_prlReferList->Capacity += 1;
      m_prlReferList->Add( prrReferRec );
//  Can not delete them!
//      if ( prrReferRec != NULL )
//      {
//        delete prrReferRec;
//        prrReferRec = NULL;
//      }
    }
  }
  catch( ... )  // EOutOfMemory
  {
    Application->MessageBox(
        AnsiString( const_cast< char * >( MI_NOMEMORY ) ).c_str(),
        const_cast< char * >( MT_FATALERROR ),
        MB_OK + MB_ICONERROR );
    Application->Terminate();
  }
  return true;
}
//---------------------------------------------------------------------------
TReferRecord * __fastcall TMainFormRefer::CopyFromWorkspace()
{
  TReferRecord *prrReferRec;
  try
  {
//  Construct a new reference record pointer.
    prrReferRec = new TReferRecord;
  }
  catch( ... )  // EOutOfMemory
  {
    Application->MessageBox(
        AnsiString( const_cast< char * >( MI_CANNOTMODIFY ) ).c_str(),
        const_cast< char * >( MT_GENERALERROR ),
        MB_OK + MB_ICONERROR );
    return NULL;
  }
//  Copy data members of the struct.
  prrReferRec->nMagic = m_rrWorkingReferRec.nMagic;
  prrReferRec->nId = m_rrWorkingReferRec.nId;
//  EditReferID->Text = AnsiString( ( int )( m_rrWorkingReferRec.nId ) );
  prrReferRec->eReferType = m_rrWorkingReferRec.eReferType;
//  ComboBoxReferType->ItemIndex = ( int )( m_rrWorkingReferRec.eReferType );
//  char sReserved[3]; // Unused
  prrReferRec->nLength = m_rrWorkingReferRec.nLength;
  prrReferRec->nOffset = m_rrWorkingReferRec.nOffset;
  prrReferRec->nCrossReferIndex = m_rrWorkingReferRec.nCrossReferIndex;
  prrReferRec->nAuthors = m_rrWorkingReferRec.nAuthors;
  prrReferRec->nTitle = m_rrWorkingReferRec.nTitle;
  prrReferRec->nJournal = m_rrWorkingReferRec.nJournal;
  prrReferRec->vnVolumeAndNumber.nVolume = m_rrWorkingReferRec.vnVolumeAndNumber.nVolume;
//  SpinVolume->Value = ( int )( m_rrWorkingReferRec.vnVolumeAndNumber.nVolume );
  prrReferRec->vnVolumeAndNumber.nNumber = m_rrWorkingReferRec.vnVolumeAndNumber.nNumber;
//  SpinNumber->Value = ( int )( m_rrWorkingReferRec.vnVolumeAndNumber.nNumber );
  prrReferRec->nProceedings = m_rrWorkingReferRec.nProceedings;
  prrReferRec->nConferencePlace = m_rrWorkingReferRec.nConferencePlace;
  prrReferRec->nConferenceDate = m_rrWorkingReferRec.nConferenceDate;
  prrReferRec->nBook = m_rrWorkingReferRec.nBook;
  prrReferRec->nEditors = m_rrWorkingReferRec.nEditors;
  prrReferRec->nTechnicalReport = m_rrWorkingReferRec.nTechnicalReport;
  prrReferRec->nNote = m_rrWorkingReferRec.nNote;
  prrReferRec->ymPublicationDate.nYear = m_rrWorkingReferRec.ymPublicationDate.nYear;
//  SpinPubYear->Value = (int )( m_rrWorkingReferRec.ymPublicationDate.nYear );
  prrReferRec->ymPublicationDate.nMonth = m_rrWorkingReferRec.ymPublicationDate.nMonth;
//  SpinPubMonth->Value = (int )( m_rrWorkingReferRec.ymPublicationDate.nMonth );
  prrReferRec->sePages.nStart = m_rrWorkingReferRec.sePages.nStart;
//  SpinStartPage->Value = (int )( m_rrWorkingReferRec.sePages.nStart );
  prrReferRec->sePages.nEnd = m_rrWorkingReferRec.sePages.nEnd;
//  SpinEndPage->Value = (int )( m_rrWorkingReferRec.sePages.nEnd );
  prrReferRec->nKeywordsNumber = m_rrWorkingReferRec.nKeywordsNumber;
//  EditKeywordsNo->Text = ( int )( m_rrWorkingReferRec.nKeywordsNumber );
  prrReferRec->nKeywords = m_rrWorkingReferRec.nKeywords;
  prrReferRec->nAbstract = m_rrWorkingReferRec.nAbstract;
//  unsigned __int32  m_rrWorkingReferRec.nReserved[4]; // Unused
  prrReferRec->asCrossReferIndex = m_rrWorkingReferRec.asCrossReferIndex;
//  EditIndex->Text = m_rrWorkingReferRec.asCrossReferIndex;
  prrReferRec->asAuthors = m_rrWorkingReferRec.asAuthors;
//  EditAuthors->Text = m_rrWorkingReferRec.asAuthors;
  prrReferRec->asTitle = m_rrWorkingReferRec.asTitle;
//  EditTitle->Text = m_rrWorkingReferRec.asTitle;
  prrReferRec->asJournal = m_rrWorkingReferRec.asJournal;
//  EditJournal->Text = m_rrWorkingReferRec.asJournal;
  prrReferRec->asProceedings = m_rrWorkingReferRec.asProceedings;
//  EditProceedings->Text = m_rrWorkingReferRec.asProceedings;
  prrReferRec->asConferencePlace = m_rrWorkingReferRec.asConferencePlace;
//  EditConfPlace->Text = m_rrWorkingReferRec.asConferencePlace;
  prrReferRec->asConferenceDate = m_rrWorkingReferRec.asConferenceDate;
//  EditConfDate->Text = m_rrWorkingReferRec.asConferenceDate;
  prrReferRec->asBook = m_rrWorkingReferRec.asBook;
//  EditBook->Text = m_rrWorkingReferRec.asBook;
  prrReferRec->asEditors = m_rrWorkingReferRec.asEditors;
  prrReferRec->asTechnicalReport = m_rrWorkingReferRec.asTechnicalReport;
//  EditTechReport->Text = m_rrWorkingReferRec.asTechnicalReport;
  prrReferRec->asNote = m_rrWorkingReferRec.asNote;
//  EditNote->Text = m_rrWorkingReferRec.asNote;
  prrReferRec->asKeywords = m_rrWorkingReferRec.asKeywords;
//  EditKeywords->Text = m_rrWorkingReferRec.asKeywords;
  prrReferRec->asAbstract = m_rrWorkingReferRec.asAbstract;
//  MemoAbstract->Text = m_rrWorkingReferRec.asAbstract;
  return prrReferRec;
}
//---------------------------------------------------------------------------
bool __fastcall TMainFormRefer::CopyToWorkspace( TList *prlReferList, int nWorkingRec )
{
//  Get the current reference record.
  TReferRecord *prrReferRec = ( TReferRecord * )( prlReferList->Items[nWorkingRec-1] );
//  Copy data members of the struct.
  m_rrWorkingReferRec.nMagic = prrReferRec->nMagic;
  m_rrWorkingReferRec.nId = prrReferRec->nId;
//  EditReferID->Text = AnsiString( ( int )( m_rrWorkingReferRec.nId ) );
  m_rrWorkingReferRec.eReferType = prrReferRec->eReferType;
//  ComboBoxReferType->ItemIndex = ( int )( m_rrWorkingReferRec.eReferType );
//  char sReserved[3]; // Unused
  m_rrWorkingReferRec.nLength = prrReferRec->nLength;
  m_rrWorkingReferRec.nOffset = prrReferRec->nOffset;
  m_rrWorkingReferRec.nCrossReferIndex = prrReferRec->nCrossReferIndex;
  m_rrWorkingReferRec.nAuthors = prrReferRec->nAuthors;
  m_rrWorkingReferRec.nTitle = prrReferRec->nTitle;
  m_rrWorkingReferRec.nJournal = prrReferRec->nJournal;
  m_rrWorkingReferRec.vnVolumeAndNumber.nVolume = prrReferRec->vnVolumeAndNumber.nVolume;
//  SpinVolume->Value = ( int )( m_rrWorkingReferRec.vnVolumeAndNumber.nVolume );
  m_rrWorkingReferRec.vnVolumeAndNumber.nNumber = prrReferRec->vnVolumeAndNumber.nNumber;
//  SpinNumber->Value = ( int )( m_rrWorkingReferRec.vnVolumeAndNumber.nNumber );
  m_rrWorkingReferRec.nProceedings = prrReferRec->nProceedings;
  m_rrWorkingReferRec.nConferencePlace = prrReferRec->nConferencePlace;
  m_rrWorkingReferRec.nConferenceDate = prrReferRec->nConferenceDate;
  m_rrWorkingReferRec.nBook = prrReferRec->nBook;
  m_rrWorkingReferRec.nEditors = prrReferRec->nEditors;
  m_rrWorkingReferRec.nTechnicalReport = prrReferRec->nTechnicalReport;
  m_rrWorkingReferRec.nNote = prrReferRec->nNote;
  m_rrWorkingReferRec.ymPublicationDate.nYear = prrReferRec->ymPublicationDate.nYear;
//  SpinPubYear->Value = (int )( m_rrWorkingReferRec.ymPublicationDate.nYear );
  m_rrWorkingReferRec.ymPublicationDate.nMonth = prrReferRec->ymPublicationDate.nMonth;
//  SpinPubMonth->Value = (int )( m_rrWorkingReferRec.ymPublicationDate.nMonth );
  m_rrWorkingReferRec.sePages.nStart = prrReferRec->sePages.nStart;
//  SpinStartPage->Value = (int )( m_rrWorkingReferRec.sePages.nStart );
  m_rrWorkingReferRec.sePages.nEnd = prrReferRec->sePages.nEnd;
//  SpinEndPage->Value = (int )( m_rrWorkingReferRec.sePages.nEnd );
  m_rrWorkingReferRec.nKeywordsNumber = prrReferRec->nKeywordsNumber;
//  EditKeywordsNo->Text = ( int )( m_rrWorkingReferRec.nKeywordsNumber );
  m_rrWorkingReferRec.nKeywords = prrReferRec->nKeywords;
  m_rrWorkingReferRec.nAbstract = prrReferRec->nAbstract;
//  unsigned __int32  m_rrWorkingReferRec.nReserved[4]; // Unused
  m_rrWorkingReferRec.asCrossReferIndex = prrReferRec->asCrossReferIndex;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -