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

📄 grwtest.cpp

📁 qt3.3.5,实现操作access数据库例子,可以对数据库进行简单的操作.
💻 CPP
字号:
#include "GRWTest.h"
#include "qmessagebox.h"
#include "qfile.h"
#include "qregexp.h"
#include "GFieldData.h"

#define CHS(x) QString::fromLocal8Bit(x)

#define MAX_CNT 20
#define MAX_LINE_LEN 4096

GRWTest::GRWTest(QWidget* parent, const char* name)
:QTable(parent)
{
	init();
}

GRWTest::~GRWTest()
{

}


void GRWTest::init()
{
	QHeader * th = horizontalHeader();
	
	setNumRows(MAX_CNT);
	setLeftMargin(0);
	//th->setLabel(0,CHS("序号"));
	//th->setLabel(1,CHS("属性值"));
	//setColumnWidth(0,60);
	//setColumnWidth(1,150);
	m_qFile = QString("test.conf");
	m_qSection = QString("testsection");
	if(!readConfIni())
		QMessageBox::information(this,CHS("提示"),CHS("读取文件失败!"),CHS("确定"));
	else{
		setNumCols( m_childList.count() );
		QValueList<GFieldData*>::iterator it;
		it = m_childList.begin();
		for ( int i = 0 ; it != m_childList.end() ; ++it, ++i ) {
			th->setLabel(i,CHS((*it)->m_qsFieldQmName));
		}
	}
	//QTableItem * item = new QTableItem(this);
	//item->alignment(AlignVCenter);
}

bool GRWTest::readConfIni()
{
	bool bFlag = false;
	QFile qFile(m_qFile);
	bFlag = qFile.open(IO_ReadOnly);
	if ( !bFlag )
		return false;

	long lBeginPos = 0;
	long lEndPos = 0;
	long lsize = qFile.size();
	int data_len = 0;
	
	QStringList qsList;
	
	QString qsLine;
	QString qsTemp;
	
	while ( ! qFile.atEnd() )
	{
		qFile.readLine(qsLine,MAX_LINE_LEN);

		if ( -1 != qsLine.find(QRegExp("^(\\s+)?\\[" + m_qSection + "\\]" )) )
		{ 
			lBeginPos = qFile.at();
			while ( ! qFile.atEnd() )
			{
				qsLine = QString::null;
				lEndPos = qFile.at();
				qFile.readLine(qsLine,MAX_LINE_LEN);
				
				if ( -1 != qsLine.find(QRegExp("^\\s+$")) )	//空白行
					continue;
				
				if ( -1 != qsLine.find(QRegExp("^(\\s+)?\\[" )))
					break;
				
				if ( -1 == qsLine.find(QRegExp("^(\\s+)?define" ) ) ) {
					//真实的数据
					//analyzeFieldDataStr(pFieldDataList,qsLine);
				} else {
					//if (-1 != qsLine.find(QRegExp("^(\\s+)?(#|;|//)")) ) {	//注释行
					qsTemp = qsLine.replace(QRegExp("(\\s+)?$(\\s+)?"),"");
					qsTemp += "\n";
					qsList.append(qsTemp);
					data_len += qsTemp.length();
					//	continue;
				}
			}
		}
	}
	qFile.close();
	int iCount=0;
	char * p_chTemp[100];
	for ( QStringList::Iterator it = qsList.begin(); it != qsList.end(); ++it,++iCount) {
		p_chTemp[iCount] = (char*)(*it).ascii();
		}

	QString strTemp;
	for (int k = 0 ; k < iCount ; k++)
	{
		strTemp = QString(p_chTemp[k]);
		strTemp = strTemp.replace(QRegExp("^(\\s+)?define:(\\s+)?"),"");	//去头
		strTemp = strTemp.replace(QRegExp("(\\s+)?,(\\s+)?"),",");	//去掉所有的逗号前后的space
		strTemp = strTemp.replace(QRegExp("\\s+$"),",");	//去尾,去掉最后的space
		//strTemp = strTemp.replace(QRegExp(" "),"");//一次去掉所有空格
		
		QStringList qsListC = QStringList::split( ",", strTemp,true );
		GFieldData* pFieldData = new GFieldData();
		if ( NULL == pFieldData )
		return bFlag;
		
		QString qsTemp;
		int offset = 0;
		
		qsTemp = qsListC[offset++];
		if ( 0 == qsTemp.find("$") ) {
			pFieldData->m_iObjType = 1;
			pFieldData->m_qsFieldName = qsTemp.replace("$","");
		} else {
			pFieldData->m_iObjType = 0;
			pFieldData->m_qsFieldName = qsTemp;
		}
		
		pFieldData->m_qsFieldQmName = qsListC[offset++];
		pFieldData->m_iColumnWidth = qsListC[offset++].toInt();
		pFieldData->m_bReal = qsListC[offset++].toInt();
		pFieldData->m_bEditable = qsListC[offset++].toInt();
		pFieldData->m_iVisable_p = qsListC[offset++].toInt();
		pFieldData->m_iVisable_l = qsListC[offset++].toInt();
		pFieldData->m_iValueType = qsListC[offset++].toInt();
		pFieldData->m_qsFieldDescription = qsListC[offset++];
		
		m_childList.append(pFieldData);	
	}
			
	return true;
}

bool GRWTest::writeConfIni()
{
	bool bFlag = false;
	QFile qFile(m_qFile);

	bFlag = qFile.open(IO_ReadOnly);
	if ( !bFlag )
		return false;
	
	long lBeginPos = 0;
	long lEndPos = 0;
	long lsize = qFile.size();
	int data_len = 0;
	
	QStringList qsList;
	
	QString qsLine;
	QString qsTemp;

	while ( ! qFile.atEnd() )
	{
		qFile.readLine(qsLine,MAX_LINE_LEN);
		//lCurPos = qFile.at();
		if ( -1 != qsLine.find(QRegExp("^(\\s+)?\\[" + m_qSection + "\\]" )) )
		{ 
			lBeginPos = qFile.at();
			while ( ! qFile.atEnd() )
			{
				qsLine = QString::null;
				lEndPos = qFile.at();
				qFile.readLine(qsLine,MAX_LINE_LEN);
				
				if ( -1 != qsLine.find(QRegExp("^\\s+$")) )	//空白行
					continue;
				
				if ( -1 != qsLine.find(QRegExp("^(\\s+)?\\[" )))
					break;

				if ( -1 != qsLine.find(QRegExp("^(\\s+)?define" ) ) ) {
					//真实的数据
					//analyzeFieldDataStr(pFieldDataList,qsLine);
				} else {
				//if (-1 != qsLine.find(QRegExp("^(\\s+)?(#|;|//)")) ) {	//注释行
					qsTemp = qsLine.replace(QRegExp("(\\s+)?$(\\s+)?"),"");
					qsTemp += "\n";
					qsList.append(qsTemp);
					data_len += qsTemp.length();
				//	continue;
				}
			}
		}
	}
	qFile.close();

	GFieldData* pFieldData = NULL;
	
	unsigned int i;
	
	QValueList<GFieldData*>::iterator it = m_childList.begin();

	for ( ; it != m_childList.end(); it++ )
	{
		pFieldData = (*it);
		if ( pFieldData != NULL ) {
			qsTemp.sprintf("define: %-26s%-20s%4d,%4d,%5d,%4d,%3d,%3d,    %-5s%s\n",
				(pFieldData->m_iObjType == 0) ? 
				(const char *)(QString(pFieldData->m_qsFieldName + ",").utf8()) :
				(const char *)(QString("$" + pFieldData->m_qsFieldName + ",").utf8()),
				(const char *)(QString(pFieldData->m_qsFieldQmName + ",").utf8()),
				pFieldData->m_iColumnWidth,
				pFieldData->m_bReal,
				pFieldData->m_bEditable,
				pFieldData->m_iVisable_p,
				pFieldData->m_iVisable_l,
				pFieldData->m_iValueType,
				(const char *)(QString(pFieldData->m_qsFieldDescription + ",").utf8()),
				(const char *)(pFieldData->m_qsRawFormat.utf8())
				);
			
			qsList.append(qsTemp);
			data_len += qsTemp.length();
		}
	}
	
	qsTemp = "\n";
	qsList.append(qsTemp);
	data_len += qsTemp.length();
	
	data_len += lsize - lEndPos;
	char * pData = new char[data_len + 256];
	
	if ( pData == NULL )
		return false;
	
	memset(pData,0,data_len + 256);
	char * p = pData;
	for ( i = 0; i < qsList.count(); i++ )
	{
		qsTemp = qsList[i];
		memcpy(p,qsTemp.latin1(),qsTemp.length());
		p += qsTemp.length();
	}
	
	FILE* pFile = fopen(m_qFile, "r+w");
	if ( !pFile )
		return false;
	
	fseek(pFile, lEndPos, SEEK_SET);
	fread(p, sizeof(char), lsize - lEndPos, pFile); 
	
	fseek(pFile, lBeginPos, SEEK_SET);
	fwrite(pData,sizeof(char),strlen(pData),pFile);
	
	fclose(pFile);
	delete [] pData;

	return true;
}

//从指定文件中读取一行
int GRWTest::ReadLineFromFile(FILE* IniFile, char* lpszLineBuf, int iLen)
{
	int   iPos;

	/*-----------------------------------------------------------------------------

	注意:如果文件以t即text方式打开,则回车换行两个字符在input时被当作一个字符处理,
	      因此fgets()得到的一行字符串尾部只有一个换行符而没有回车符,而如果是binary
		  方式打开则一行字符尾部同时有回车换行两个字符,打开方式的不同直接影响fgets
		  读入一行后删除行尾部控制字符的操作,如果是text方式,只要删除换行符号即可,
		  如果是binary方式,则要删掉两个控制字符。以下对两个控制字符是否存在都进行
		  判断,可以同时适应text和binary两种模式,也就能同时适应Windows下和Unix两种
		  不同格式的文本文件(unix文本文件行末只有一个换行符,即0A,没有回车符)
		  
		  后续记录: fopen()中打开模式里的"t"是微软自己定义的,Ansi C 只支持 "b"模式

	----------------------------------------------------------------------------*/

	if(fgets(lpszLineBuf, iLen, IniFile) != NULL)					 //fgets()函数遇到第一个换行符(0x0A)后结束(包括换行符),然后在尾部追加一个NULL后返回,因此换行符总是倒数第二个字符
	{
		iPos = strlen(lpszLineBuf) - 1;
		
		if( lpszLineBuf[iPos-1] == 0x0D )  lpszLineBuf[iPos-1] = 0;  //删除尾部可能存在的回车符(0x0D)
		if( lpszLineBuf[iPos] == 0x0A )  lpszLineBuf[iPos] = 0;      //删除尾部可能存在的换行符(0x0A)
	}
	else
		return -1;

	return 0;  //0表示正确
}

⌨️ 快捷键说明

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