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

📄 recorder.cpp

📁 VC环境下电力系统故障录波数据管理系统
💻 CPP
字号:
// Recorder.cpp : implementation file
//

#include "stdafx.h"
#include "wgl_32.h"
#include "Recorder.h"
#include "ConfigRec.h"
#include <direct.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
const int RecordLimit = 3;

/////////////////////////////////////////////////////////////////////////////
// CRecorder dialog


CRecorder::CRecorder(CWnd* pParent /*=NULL*/)
	: CDialog(CRecorder::IDD, pParent)
{
    //{{AFX_DATA_INIT(CRecorder)
	m_StrRecorderList = _T("");
	//}}AFX_DATA_INIT
    m_StrFileName = _T("wstation.daw");
	RecordNum = 0;
}


void CRecorder::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CRecorder)
	DDX_Control(pDX, IDC_RECORDER_LIST, m_RecorderList);
	DDX_LBString(pDX, IDC_RECORDER_LIST, m_StrRecorderList);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CRecorder, CDialog)
	//{{AFX_MSG_MAP(CRecorder)
	ON_BN_CLICKED(IDC_ADD_RECORDER, OnAddRecorder)
	ON_BN_CLICKED(IDC_DELETE_RECORDER, OnDeleteRecorder)
	ON_BN_CLICKED(IDC_RECONFIG_RECORDER, OnReconfigRecorder)
	ON_LBN_SELCHANGE(IDC_RECORDER_LIST, OnSelchangeRecorderList)
	ON_LBN_SELCANCEL(IDC_RECORDER_LIST, OnSelcancelRecorderList)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CRecorder message handlers

void CRecorder::OnAddRecorder() 
{
	// TODO: Add your control notification handler code here
	CConfigRec MyConfigRec;
	MyConfigRec.bCityEnable = TRUE;
	MyConfigRec.bStationEnable = TRUE;
	MyConfigRec.bRecordIDEnable = TRUE;

	CString m_PathStr = ((CWgl_32App *)AfxGetApp())->m_PathStr;

 /*   if(RecordNum - RecordLimit >= 0)
	{
		AfxMessageBox("对不起,你只有三个站的建站权,\n请与软件供应商联系!");
		return;
	}*/
    Start:
    if(MyConfigRec.DoModal()==IDOK)
	  {
	    m_StrDataPath     = MyConfigRec.m_StrDataPath;
	    m_StrCity         = MyConfigRec.m_StrCity;
	    m_StrID           = MyConfigRec.m_StrID;
	    m_StrName         = MyConfigRec.m_StrName;
	    m_StrPhoneNumber  = MyConfigRec.m_StrPhoneNumber;
	    m_StrStation      = MyConfigRec.m_StrStation;
	    m_StrType         = MyConfigRec.m_StrType;
        if(m_StrDataPath.IsEmpty()    ||
           m_StrCity.IsEmpty()        ||
           m_StrID.IsEmpty()          ||
           m_StrName.IsEmpty()        ||
           m_StrPhoneNumber.IsEmpty() ||
           m_StrStation.IsEmpty()     ||
           m_StrType.IsEmpty()        )
         {
           AfxMessageBox("所有字段不能为空, 请重新输入!",MB_OK);
           MyConfigRec.m_StrDataPath    = m_StrDataPath;
	       MyConfigRec.m_StrCity        = m_StrCity;
	       MyConfigRec.m_StrID          = m_StrID;
	       MyConfigRec.m_StrName        = m_StrName;
	       MyConfigRec.m_StrPhoneNumber = m_StrPhoneNumber;
	       MyConfigRec.m_StrStation     = m_StrStation;
	       MyConfigRec.m_StrType        = m_StrType;
           goto Start;
         }
       else
         {
           _mkdir(m_PathStr + m_StrCity);
           _mkdir(m_PathStr + m_StrCity + "\\" + m_StrStation);
           _mkdir(m_PathStr + m_StrCity + "\\" + m_StrStation + "\\" + m_StrID);
           fp = fopen(m_StrFileName, "r+b");
           ReadHead(&Head);
           Head.Number++;
           WriteHead(&Head);
           Record.RecordNo = Head.Number-1;
           lstrcpy((char *)Record.RecordID, m_StrID);
           lstrcpy((char *)Record.StationName, m_StrStation);
           lstrcpy((char *)Record.CityName, m_StrCity);
           lstrcpy((char *)Record.DataPath, m_StrDataPath);
           lstrcpy((char *)Record.TeleNumber, m_StrPhoneNumber);
           lstrcpy((char *)Record.Type, m_StrType);
           lstrcpy((char *)Record.RecordName, m_StrName);
           WriteARecord(Head.Number-1, &Record);
           fclose(fp);
		   RecordNum++;
           ((CListBox *)GetDlgItem(IDC_RECORDER_LIST))->InsertString(-1, (char *)Record.RecordID);
         }
         
      }
}

void CRecorder::OnDeleteRecorder() 
{
	// TODO: Add your control notification handler code here
	char SelStr[20];
	
	int k = ((CListBox *)GetDlgItem(IDC_RECORDER_LIST))->GetCurSel();
	((CListBox *)GetDlgItem(IDC_RECORDER_LIST))->GetText(k, SelStr);
    if( lstrlen(SelStr) > 0 && k >=0)
	  {
	   if( AfxMessageBox("请确认删除本录波器吗?",MB_OKCANCEL) == IDOK)
	     { 
		   DelARecord(k);
           ((CListBox *)GetDlgItem(IDC_RECORDER_LIST))->DeleteString(k);
		   if(RecordNum>0)RecordNum--;
         }
	  }   
}

void CRecorder::OnReconfigRecorder() 
{
	// TODO: Add your control notification handler code here
	CConfigRec MyConfigRec;
	MyConfigRec.bCityEnable = FALSE;
	MyConfigRec.bStationEnable = FALSE;
	MyConfigRec.bRecordIDEnable = FALSE;

	CString m_PathStr = ((CWgl_32App *)AfxGetApp())->m_PathStr;
	char SelStr[20];
	
	int k = ((CListBox *)GetDlgItem(IDC_RECORDER_LIST))->GetCurSel();
	((CListBox *)GetDlgItem(IDC_RECORDER_LIST))->GetText(k, SelStr);
    if( lstrlen(SelStr) > 0 && k >=0)
	  {
       fp = fopen(m_StrFileName, "r+b");
       if(fp == NULL)
         {
           AfxMessageBox("录波器数据库不存在!", MB_OK);
           return;
		 }
       ReadARecord(k, &Record);
       MyConfigRec.m_StrDataPath    = Record.DataPath;
	   MyConfigRec.m_StrCity        = Record.CityName;
	   MyConfigRec.m_StrID          = Record.RecordID;
	   MyConfigRec.m_StrName        = Record.RecordName;
	   MyConfigRec.m_StrPhoneNumber = Record.TeleNumber;
	   MyConfigRec.m_StrStation     = Record.StationName;
	   MyConfigRec.m_StrType        = Record.Type;
	   if(MyConfigRec.DoModal() == IDOK)
	     {
           m_StrDataPath     = MyConfigRec.m_StrDataPath;
	       m_StrCity         = MyConfigRec.m_StrCity;
	       m_StrID           = MyConfigRec.m_StrID;
	       m_StrName         = MyConfigRec.m_StrName;
	       m_StrPhoneNumber  = MyConfigRec.m_StrPhoneNumber;
	       m_StrStation      = MyConfigRec.m_StrStation;
	       m_StrType         = MyConfigRec.m_StrType;
          
		   //_mkdir(m_PathStr + m_StrCity);
           //_mkdir(m_PathStr + m_StrCity + "\\" + m_StrStation);
           //_mkdir(m_PathStr + m_StrCity + "\\" + m_StrStation + "\\" + m_StrID); 

		   lstrcpy((char *)Record.RecordID, m_StrID);
           lstrcpy((char *)Record.StationName, m_StrStation);
           lstrcpy((char *)Record.CityName, m_StrCity);
           lstrcpy((char *)Record.DataPath, m_StrDataPath);
           lstrcpy((char *)Record.TeleNumber, m_StrPhoneNumber);
           lstrcpy((char *)Record.Type, m_StrType);
           lstrcpy((char *)Record.RecordName, m_StrName);

		   WriteARecord(k, &Record);
		 }
		fclose(fp);
	  }
    
}


BOOL CRecorder::OnInitDialog() 
{
    CDialog::OnInitDialog();
	// TODO: Add extra initialization here
    fp = fopen(m_StrFileName, "r+b");
    if(fp == NULL)
      {
       if(AfxMessageBox("录波器数据库不存在,是否创建一个新的数据库?", MB_OKCANCEL) == IDOK)
         {
           fp = fopen(m_StrFileName, "wb");
           Head.Flag = 0x30;
           Head.Number = 0;
           Head.HeadLength = sizeof(HEAD);
           Head.RecordLength = sizeof(RECORD);
           WriteHead(&Head);
           fclose(fp);
         }
        else return FALSE;
      }
    else
     {
      fseek(fp, 0L, SEEK_SET);
      fread(&Head, sizeof(HEAD), 1, fp);
      for(UINT i=0; i< Head.Number; i++)
         {
          ReadARecord(i, &Record);
          ((CListBox *)GetDlgItem(IDC_RECORDER_LIST))->InsertString(-1, (char *)Record.RecordID);
	//	  RecordNum ++ ;
	//	  if(RecordNum - RecordLimit >= 0) 
	//		 break; 
         }
      fclose(fp);
     }
   return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

int CRecorder::ReadHead(HEAD *Head)
{
 fseek(fp, 0L,  SEEK_SET);
 fread(Head, sizeof(HEAD), 1, fp);
 return (1);
}

int CRecorder::WriteHead(HEAD *Head)
{
 fseek(fp, 0L,  SEEK_SET);
 fwrite(Head, sizeof(HEAD), 1, fp);
 return (1);
}


int CRecorder::ReadARecord(UINT No, RECORD *Record)
{
 unsigned long offset = sizeof(HEAD) + No *sizeof(RECORD);
 fseek(fp, offset, SEEK_SET);
 fread(Record, sizeof(RECORD), 1 ,fp);
 return (1);   
}

RECORD* CRecorder::SearchARecord(CString m_strRecordID, RECORD *TempRecord )
{
	HEAD TempHead;
	fp = fopen(m_StrFileName, "rb");
	if(fp == NULL)
	{
		AfxMessageBox(_T("打不开文件:") + m_StrFileName);
		return (NULL);
	}
    fseek(fp, 0L, SEEK_SET);
    fread(&TempHead, sizeof(HEAD), 1 ,fp);
	UINT TotalSize = TempHead.Number;
	UINT index =0; 
	unsigned long offset;
	while(index < TotalSize)
    {
		offset = sizeof(HEAD) + index *sizeof(RECORD);
        fread(TempRecord, sizeof(RECORD), 1 ,fp);
		if(strcmp((char *)(TempRecord->RecordID), m_strRecordID)==0)
		{fclose(fp); return (TempRecord);}
		index++;
	}
	fclose(fp);
	return NULL;   
}

int CRecorder::WriteARecord(UINT No, RECORD *Record)
{
 unsigned long offset = sizeof(HEAD) + No *sizeof(RECORD);
 fseek(fp, offset, SEEK_SET);
 fwrite(Record, sizeof(RECORD), 1 ,fp);
 return (1);
}


int CRecorder::DelARecord(UINT No)
{
 FILE *tempfp;
 unsigned long offset;

 fp = fopen(m_StrFileName, "r+b");
 tempfp = fopen("temp.bak", "wb");

 ReadHead(&Head);
 if(Head.Number>0)Head.Number--;
 else return(0);
 fwrite(&Head, sizeof(HEAD), 1, tempfp);
 for(UINT i=0; i<No; i++)
    {
     ReadARecord(i, &Record);
     offset = sizeof(HEAD) + i*sizeof(RECORD);
     fseek(tempfp,  offset, SEEK_SET);
     fwrite(&Record, sizeof(RECORD), 1, tempfp);
    }
 for(i=No; i<Head.Number; i++)
    {
     ReadARecord(i+1, &Record);
     offset = sizeof(HEAD) + i*sizeof(RECORD);
     fseek(tempfp,  offset, SEEK_SET);
     fwrite(&Record, sizeof(RECORD), 1, tempfp);
    }
 fclose(tempfp);
 fclose(fp);
 remove(m_StrFileName);
 rename("temp.bak", m_StrFileName);
 return (1);
}

void CRecorder::OnSelchangeRecorderList() 
{
	// TODO: Add your control notification handler code here
	((CButton *)GetDlgItem(IDC_DELETE_RECORDER))->EnableWindow(TRUE);
	((CButton *)GetDlgItem(IDC_RECONFIG_RECORDER))->EnableWindow(TRUE);

}

void CRecorder::OnSelcancelRecorderList() 
{
	// TODO: Add your control notification handler code here
	((CButton *)GetDlgItem(IDC_DELETE_RECORDER))->EnableWindow(FALSE);
	((CButton *)GetDlgItem(IDC_RECONFIG_RECORDER))->EnableWindow(FALSE);
}

⌨️ 快捷键说明

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