📄 refermain.cpp
字号:
//---------------------------------------------------------------------------
#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 + -