|
StringGrid를 이용하여 각 셀에 들어있던 정보들을 화일에 저장하였다가 불러오는 프로그램을
짜고 있는데 4가지 파일에 저장했다가 불러오는 것입니다. 소스는 아래와 같이 하였습니다.
void __fastcall TRForm::RSave()
{
char szFileName[MAXFILE+4];
int iFileHandle;
int iColCountLen;
int iRowCountLen;
int iLength;
AnsiString aFileName;
AnsiString cColNo;
AnsiString cRowNo;
//SRB(RadioButton) 4개를 설치하여 체크된 결과에 따라 4가지 파일로 저장한다.(그룹으로 묶었음)
if(SRB->Checked==true)
{
aFileName="sreg.orf";
}
else if(MRB->Checked==true)
{
aFileName="mreg.orf";
}
else if(LRB->Checked==true)
{
aFileName="lreg.orf";
}
else
{
aFileName="hreg.orf";
}
//같은 이름의 화일은 백업해 둔다.
if (FileExists(aFileName))
{
fnsplit(aFileName.c_str(), 0, 0, szFileName, 0);
strcat(szFileName, ".OLD");
RenameFile(aFileName, szFileName);
}
iFileHandle = FileCreate(aFileName);
//RSGrid는 StringGrid 임
cColNo=IntToStr(RSGrid->ColCount);
cRowNo=IntToStr(RSGrid->RowCount);
// 그리드의 rows 와 columns 의 수를 적는다.
iColCountLen=cColNo.Length()+1;
FileWrite(iFileHandle, &iColCountLen, sizeof(int));
FileWrite(iFileHandle, cColNo.c_str(), iColCountLen);
iRowCountLen=cRowNo.Length()+1;
FileWrite(iFileHandle, &iRowCountLen, sizeof(int));
FileWrite(iFileHandle, cRowNo.c_str(), iRowCountLen);
// 각 string의 길이와 스트링을 적는다.
for (int x=0;x<RSGrid->ColCount;x++)
{
for (int y=0;y<RSGrid->RowCount;y++)
{
iLength = RSGrid->Cells[x][y].Length()+1;
FileWrite(iFileHandle, &iLength, sizeof(int));
FileWrite(iFileHandle, RSGrid->Cells[x][y].c_str(), iLength);
}
}
FileClose(iFileHandle);
}
void __fastcall TRForm::ROpen()
{
int iFileHandle;
int iColCountLen;
int iRowCountLen;
int iLength;
AnsiString cColNo;
AnsiString cRowNo;
AnsiString aFileName;
if(SRB->Checked==true)
{
aFileName="sreg.orf";
}
else if(MRB->Checked==true)
{
aFileName="mreg.orf";
}
else if(LRB->Checked==true)
{
aFileName="lreg.orf";
}
else
{
aFileName="hreg.orf";
}
iFileHandle = FileOpen(aFileName, fmOpenRead);
//ColCount와 RowCount 수를 읽어온다.
FileRead(iFileHandle, &iColCountLen, sizeof(int));
FileRead(iFileHandle, cColNo.c_str(), iColCountLen);
cColNo=(AnsiString)(cColNo.c_str());
RSGrid->ColCount=StrToInt(cColNo);
FileRead(iFileHandle, &iRowCountLen, sizeof(int));
FileRead(iFileHandle, cRowNo.c_str(), iRowCountLen);
cRowNo=(AnsiString)(cRowNo.c_str());
RSGrid->RowCount=StrToInt(cRowNo);
//셀에 저장했던 데이터를 읽어와 보여준다.
for (int i=0;i<RSGrid->ColCount;i++)
{
for (int j=0;j<RSGrid->RowCount;j++)
{
FileRead(iFileHandle, &iLength, sizeof(int));
FileRead(iFileHandle, RSGrid->Cells[i][j].c_str(), iLength);
RSGrid->Cells[i][j]=(RSGrid->Cells[i][j].c_str());
}
}
FileClose(iFileHandle);
}
저장하는 버튼이 RSave()로 저장하고 라디오버튼을 체크하면 4가지중 한가지가
StringGrid에 자료를 보여주는데......
문제는 2가지 자료는 보여주는데 3번째 자료부터는(무작위로 선택해도) 에러메시지가
뜹니다.
왜 그런지 누가 가르쳐주시고 잘못된 부분좀 설명해 주셔요...
TFileStream을 이용하여 짜보다가 않되서 포기하고 API 함수로 짜보았습니다.
제발 누가 가르쳐주셔요....벌써 2주째 않되네요..
|