只用一个load键打开文件

本文介绍了一个基于MFC的应用程序中如何使用对话框来选择并加载文件内容至内存的过程。具体步骤包括:设置文件对话框样式、过滤器及默认文件名;通过对话框获取用户选定文件的路径;打开文件并读取其内容到缓冲区;最后解析文件内容并填充到UI编辑框中。

处理过程分:

     设置打开文件对话框;

     获取要打开文件的路径;

     根据打开路径打开文件;

     将文件内容取出后保存到CString;

     处理取出的文件。

void COperationDlg::OnBnClickedBtnOpeLoad()
{
	// TODO: Add your control notification handler code here
	
	CString sFilePath;
	// 打开文件对话框样式设置
	CFileDialog FileOpenDialog(TRUE);
	FileOpenDialog.m_ofn.Flags = OFN_ENABLEHOOK|OFN_EXPLORER;
	CString strFilter;
	strFilter = _T("TXT");
	strFilter += (TCHAR)'\0'; 
	strFilter += _T("*.txt");
	strFilter += (TCHAR)'\0';  
	CString allFilter;
	VERIFY(allFilter.LoadString(AFX_IDS_ALLFILTER));
	strFilter += allFilter;
	strFilter += (TCHAR)'\0';  
	strFilter += _T("*.*");
	strFilter += (TCHAR)'\0';   

	FileOpenDialog.m_ofn.lpstrFilter = strFilter;
	FileOpenDialog.m_ofn.lpstrTitle = "Download Filename...";

	// Set up the default to match a file that is open.....
	CString sFileName;
	sFileName.Empty();
	if ((((CMDIFrameWnd *) AfxGetMainWnd())->MDIGetActive()) != NULL)
		sFileName = (((CMDIFrameWnd *) AfxGetMainWnd())->MDIGetActive())->GetActiveDocument()->GetTitle();
	if (!sFileName.IsEmpty())
	{
		if (sFileName.Find('.') != -1)
			sFileName = sFileName.Left(sFileName.Find('.'));
		sFileName += _T(".hex");
		strcpy(FileOpenDialog.m_ofn.lpstrFile,LPCTSTR(sFileName));
	}

	// 选择要打开的文件后
	BOOL bResult = FileOpenDialog.DoModal() == IDOK ? TRUE : FALSE;
	if (bResult)
		sFilePath = FileOpenDialog.GetPathName();		// 获取要打开文件的路径
	else
		AfxMessageBox("Can't find the file");

	// 打开文件取出里面的数据存入字符串buffer
	// 获取文件大小
	HANDLE fileHand;
	DWORD fileSize;
	fileHand = CreateFile(sFilePath,0,0,0,OPEN_EXISTING,0,0);
	fileSize = GetFileSize(fileHand,0);

	// 读取文件
	char * bufFile = new char [fileSize];	// 文件读取buffer
	CFile file;
	file.Open(sFilePath,CFile::modeRead);	
	file.Read(bufFile,fileSize);

	// 将文件内容存入字符串
	CString sFile;
	sFile = bufFile;
	
	// 对从文件获得的字符串数据进行处理
	CString sFind = "\r\n";
	int StartPos = 0;		// 每次查找回车键起始位置
	int EndPos = 0;			// 每次找到回车键的位置
	int cNum = 0;			// 每行字符个数
	int enterkeyNum = 0;	// 文件中回车键的个数
	// 获取回车键总个数
	while((EndPos=sFile.Find(sFind,StartPos)) != -1)
	{
		StartPos = EndPos+2;
		enterkeyNum ++;
	}
	CString* sEdit = new CString [enterkeyNum];		// parameter各编辑框字符串buffer
	StartPos = 0;
	EndPos = 0;
	if (enterkeyNum < 15)		// 参数小于15个
	{
		AfxMessageBox("The number of parameter is insufficient");
	}
	else
	{
		if (enterkeyNum == 15)		// 最后一个参数后没有带回车键
		{
			for (int j=0; j<16; j++)
			{
				EndPos = sFile.Find(sFind,StartPos);
				cNum = EndPos - StartPos;
				unsigned char * cEdit = new unsigned char[cNum];
				for (int i=0; i<cNum; i++)
				{
					cEdit[i] = sFile[(StartPos+i)];
				}
				sEdit[j] = cEdit;
				StartPos = EndPos+2;
				delete[] cEdit;
			}
		}
		else						// 最会一个参数后带回车键(可带多个)
		{
			for (int j=0; j<enterkeyNum; j++)
			{
				EndPos = sFile.Find(sFind,StartPos);
				cNum = EndPos - StartPos;
				unsigned char * cEdit = new unsigned char[cNum];
				for (int i=0; i<cNum; i++)
				{
					cEdit[i] = sFile[(StartPos+i)];
				}
				sEdit[j] = cEdit;
				StartPos = EndPos+2;
				delete[] cEdit;
			}
		}
	}

	// 处理好后的字符串分别赋值给给个编辑框
	sPITem_write = sEdit[0];
	sInidenTem_write = sEdit[1];
	sInidenTim_write = sEdit[2];
	sDenTem_write = sEdit[3];
	sDenTim_write = sEdit[4];
	sAnnTem_write = sEdit[5];
	sAnnTim_write = sEdit[6];
	sCycle = sEdit[7];
	sExtTem_write = sEdit[8];
	sExtTim_write = sEdit[9];
	sHoldTem_write = sEdit[10];
	sHoldTim_write = sEdit[11];
	sKP = sEdit[12];
	sKI = sEdit[13];
	sKD = sEdit[14];
	sKL = sEdit[15];

	SetDlgItemTextA(IDC_EDIT_OPE_PITEM,sPITem_write);
	SetDlgItemTextA(IDC_EDIT_OPE_DENTEM,sInidenTem_write);
	SetDlgItemTextA(IDC_EDIT_OPE_DENTIME,sInidenTim_write);
	SetDlgItemTextA(IDC_EDIT_OPE_DENINGTEM,sDenTem_write);
	SetDlgItemTextA(IDC_EDIT_OPE_DENINGTIME,sDenTim_write);
	SetDlgItemTextA(IDC_EDIT_OPE_ANNTEM,sAnnTem_write);
	SetDlgItemTextA(IDC_EDIT_OPE_ANNTIME,sAnnTim_write);
	SetDlgItemTextA(IDC_EDIT_OPE_ANNCYCLE,sCycle);
	SetDlgItemTextA(IDC_EDIT_OPE_EXTTEM,sExtTem_write);
	SetDlgItemTextA(IDC_EDIT_OPE_EXTTIME,sExtTim_write);
	SetDlgItemTextA(IDC_EDIT_OPE_HOLDTEM,sHoldTem_write);
	SetDlgItemTextA(IDC_EDIT_OPE_HOLDTIME,sHoldTim_write);
	SetDlgItemTextA(IDC_EDIT_OPE_KP,sKP);
	SetDlgItemTextA(IDC_EDIT_OPE_KI,sKI);
	SetDlgItemTextA(IDC_EDIT_OPE_KD,sKD);
	SetDlgItemTextA(IDC_EDIT_OPE_KL,sKL);
	
}


 

有的。可以使用Qt的翻译工具lupdate和lrelease来实现多个工程共用一个翻译文件,从而避免重复翻译。具体步骤如下: 1. 在每个工程的.pro文件中添加以下代码,指定翻译文件的路径和名称: ``` TRANSLATIONS += translations/zh_CN.ts ``` 其中"zh_CN.ts"为翻译文件的名称,"translations"为翻译文件所在的目录。 2. 在Qt Creator中打开每个工程,选择"Tools" -> "External" -> "Qt Linguist",打开翻译工具。 3. 在翻译工具中,选择"File" -> "New Translation",选择对应的语言,例如"Chinese (Simplified)"。 4. 翻译完毕后,选择"File" -> "Save",保存翻译文件。 5. 在每个工程中,使用以下命令生成翻译文件: ``` lupdate . -ts translations/zh_CN.ts ``` 其中"."表示当前目录,"-ts"表示生成翻译文件,"translations/zh_CN.ts"为翻译文件的路径和名称。 6. 在每个工程中,使用以下命令将翻译文件编译成二进制文件: ``` lrelease translations/zh_CN.ts ``` 运行该命令后,会在translations目录下生成一个"zh_CN.qm"文件。 7. 在每个工程的代码中,使用以下代码加载翻译文件: ``` QTranslator translator; translator.load("translations/zh_CN.qm"); app.installTranslator(&translator); ``` 其中"app"为QApplication对象。 这样,多个工程就可以共用同一个翻译文件了。如果需要更新翻译文件,只需要更新一次即可,所有工程都可以使用更新后的翻译文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值