|
ListView의 OnData에서 커리 내용을 표시하려고 했는데.. 그냥 DBGrid로 쓰려고 합니다..
DBGrid의 내용을 파일로 저장하려고 하는데, 연결된 TADOQuery 에서
FieldByName()..
Next()
를 이용해서 파일로 저장하기까지는 되었습니다..
그런데 문제는 이렇게 레코드셋을 Next()해서 이동하니까 DBGrid의 내용도 같이 Next()가 된다는 것입니다..
다시 말해서 파일저장하기 위해 레코드셋의 커서를 이동하면 그 Query와 연결된 DBGrid의 커서도 같이 이동하는 겁니다.
파일 저장하는동안 DBGrid의 커서를 고정시키거나.. 해야하는데.. Query를 하나 더 해서 파일 저장할 때 새로 레코드셋을 만들어서 그 넘을 이용할지.. 아니면 다른 방법을 사용할 지 고민중입니다.
혹시 이런 문제 고민해 보신 분 들 계시면 도움 부탁드리겠습니다.
다음은 참고로 제가 만들어본 DBGrid --> File 저장하는 부분입니다.
------------------------------------------------------------
void __fastcall save_log_to_txt_file( AnsiString strfile, void * data, void * prog )
{
#if 1
if( !data || (strfile.Trim() == "") )
{
return;
}
TDataSet * pDS = (TDataSet*)data;
// 데이터모듈의 파일저장 다이얼로그를 사용하고 있습니다.
DM->m_save_dlg->FileName = strfile;
DM->m_save_dlg->Filter = "Text files (*.txt)|*.TXT";
if( !DM->m_save_dlg->Execute() )
{
return;
}
strfile = DM->m_save_dlg->FileName;
if( strfile.LowerCase().Pos(".txt") == 0 )
{
strfile += ".txt";
}
if( FileExists(strfile.c_str()) )
{
// 같은 이름을 가진 파일이 있으면 이전 파일을 백업파일로 변경합니다.
char szbakfile[256];
memset( szbakfile, 0x00, sizeof(szbakfile) );
sprintf( szbakfile, "%s.bak", strfile.c_str() );
if( FileExists(szbakfile) )
{
// 같은 이름을 가진 백업파일마저 존재하면 그넘은 지워버립니다.
DeleteFile(szbakfile);
}
RenameFile(strfile.c_str(), szbakfile);
}
FILE * logfile = NULL;
try {
logfile = fopen( strfile.c_str(), "a+" );
if( !logfile )
{
return;
}
for( int i = 0; i < pDS->FieldCount; i++ )
{ // 그리드의 컬럼 내용을 먼저 저장합니다.
fprintf( logfile, "%s\t", pDS->FieldDefList->FieldDefs[i]->Name.c_str() );
}
fprintf( logfile, "\n" );
if( prog )
{ // 파일저장 과정을 보여줄 프로그래스 바를 초기화합니다.
((TProgressBar*)prog)->Max = pDS->RecordCount;
((TProgressBar*)prog)->Min = 0;
((TProgressBar*)prog)->Position = 0;
}
pDS->First();
while( !pDS->Eof )
{
for( int i = 0; i < pDS->FieldCount; i++ )
{ // 그리드의 내용을 저장합니다.
fprintf( logfile, "%s\t", pDS->FieldByName(pDS->FieldDefList->FieldDefs[i]->Name)->AsString.c_str() );
}
fprintf( logfile, "\n" );
if( prog )
{
((TProgressBar*)prog)->Position += 1;
}
pDS->Next();
Application->ProcessMessages();
}
} catch(...) {
}
if( logfile )
{
fclose( logfile );
}
#endif
}
//---------------------------------------------------------------------------
|