L
LAW
Есть вот такой вот код...
Он был полностью рабочий, пока не понадобилось данные из текстовика перед внесением в базу конвертануть из OEM в ANSI.
Тут начались проблемы. :lol:
Если раскоминтарить текст "// delete tmp;" То мгновенно получаем Access Violation. На всех типах процессоров.
Если оставить закоминтареным то получаем Acess Violation при выходе из подпрограммы после выполнения строки "delete cStrLst;" причём (!!!) только на AMD процессорах. На интеле всё выполняется без ошибок.
Незнаю что делать, хоть самописную конвертилку в Ansi пиши.![Frown :( :(](https://cdn.jsdelivr.net/joypixels/assets/8.0/png/unicode/64/1f641.png)
Код:
//---------------------------------------------------------------------------
void CrtDBList(AnsiString cFilePth)
// Создаём таблицу перечня БД, входящих в группы, если этой таблицы еще нет:
{
AnsiString cEOL="";
if (QryDropTbl(3,"DBLIST"))
{
ShowMessage("Таблица DBLIST занята другим пользователем. Операция невозможна!");
return;
}
QryCrtTbl(3,"CREATE TABLE DBLIST (DB_NO INTEGER,BSEID CHAR(10),BSENME CHAR(100),"+cEOL+
+"ISBANK LOGICAL,GRPBNK LOGICAL,SHRIMG LOGICAL,ALTCAGENT LOGICAL,ALTGOODS LOGICAL,"+cEOL+
+"ADDDOC LOGICAL,SHRDIR CHAR(70),NETDIR CHAR(70),LOCDIR CHAR(70),IMGDIR CHAR(70));"+cEOL+
+"CREATE INDEX BSEID ON DBLIST (BSEID)");
// Создаем ListBox для TXT.dir:
TListBox *cStrLst=new TListBox(ControlPanel);
cStrLst->Visible=false;
cStrLst->Items->LoadFromFile(cFilePth);
// Формируем перечень параметров БД:
const int nPBIndCnt=14;
AnsiString aParamBuf[nPBIndCnt][5]={{"","DB_NO","[Database","N","0"},
{"","BSEID","DtbsID=","C","''"},
{"","BSENME","Name=","C","''"},
{"","ISBANK","IsBank=","B","Off"},
{"","GRPBNK","GrpBnk=","B","Off"},
{"","SHRIMG","ShrImg=","B","Off"},
{"","ALTCAGEN","AltCagent=","B","Off"},
{"","ALTGOODS","AltGoods=","B","Off"},
{"","ADDDOC","AddDoc=","B","Off"},
{"","SHRDIR","Shared=","C","''"},
{"","NETDIR","Network=","C","''"},
{"","LOCDIR","Local=","C","''"},
{"","IMGDIR","Images=","C","''"}};
// Строка для формирования значений реквизитов для INSERT:
AnsiString cWrk,cCurPrmVal;
int nPos;
for (int nRecInd=0;nRecInd<cStrLst->Count;nRecInd++)
// Цикл по кол-ву строк в TXT.dir:
{
for (int nPrmInd=0;nPrmInd<nPBIndCnt;nPrmInd++)
// Цикл по кол-ву строк в aParamBuf:
{
// Опредеяем, содержит ли очередная строка TXT.dir ключевое слово
// из текущей строки aParamBuf:
nPos=cStrLst->Items->Strings[nRecInd].Pos(aParamBuf[nPrmInd][2]);
if (nPos > 0)
// Очередная строка TXT.dir содержит ключевое слово из текущей
// строки aParamBuf.
// Приступаем к формированию значения соответствующего поля DBLIST:
{
if (aParamBuf[nPrmInd][2] == "[Database")
// Для параметра [Database спец.обработка - заносим в aParamBuf № БД:
{
aParamBuf[nPrmInd][0]=cStrLst->Items->Strings[nRecInd].SubString(10,(cStrLst->Items->Strings[nRecInd].Pos("]")-10));
if (nRecInd > 0)
WrtToDBList(aParamBuf);
}
else
// Для остальных параметров заносим в aParamBuf значение после символа "=":
aParamBuf[nPrmInd][0]=cStrLst->Items->Strings[nRecInd].SubString(nPos+aParamBuf[nPrmInd][2].Length(),((cStrLst->Items->Strings[nRecInd].Length()+1)-nPos));
}
}
}
WrtToDBList(aParamBuf);
delete cStrLst;
//---------------------------------------------------------------------------
void WrtToDBList(AnsiString aParamBuf[14][5])
// Запись очередной строки в таблицу DBLIST.
{
AnsiString cWrk;
const int nPBIndCnt=14;
// Пустые параметры (не запоненные в TXT.dir) заполняем значениями
// по-умолчанию:
for (int nPrmInd=0;nPrmInd<nPBIndCnt;nPrmInd++)
{
if (aParamBuf[nPrmInd][0]=="")
aParamBuf[nPrmInd][0]=aParamBuf[nPrmInd][4];
}
char *tmp=new char(aParamBuf[2][0].Length()+1);
// Переводим имя базы в ANSI
tmp=aParamBuf[2][0].c_str();
OemToChar(tmp,tmp);
aParamBuf[2][0]=tmp;
// delete tmp;
for (int nPrmInd=0;nPrmInd < nPBIndCnt;nPrmInd ++)
{
if (aParamBuf[nPrmInd][3]=="N")
cWrk=cWrk + aParamBuf[nPrmInd][0]+",";
else if (aParamBuf[nPrmInd][3]=="C")
cWrk=cWrk + "'"+aParamBuf[nPrmInd][0]+"',";
else if (aParamBuf[nPrmInd][3]=="B")
{
if (aParamBuf[nPrmInd][0]=="On")
cWrk=cWrk + "TRUE,";
else if (aParamBuf[nPrmInd][0]=="Off")
cWrk=cWrk + "FALSE,";
else
ShowMessage("Неверный параметр "+aParamBuf[nPrmInd][0]);
}
}
ControlPanel->qryDBList->SQL->Clear();
ControlPanel->qryDBList->SQL->Add("INSERT INTO DBLIST (DB_NO,BSEID,BSENME,ISBANK,GRPBNK,SHRIMG,ALTCAGENT,ALTGOODS,ADDDOC,SHRDIR,NET
DIR,LOCDIR,IMGDIR)");
// cWrk.SubString для удаления последней запятой в списке значений параметров.
ControlPanel->qryDBList->SQL->Add("VALUES ("+cWrk.SubString(1,cWrk.Length()-1)+")");
ControlPanel->qryDBList->ExecSQL();
// Очистим значение текущего параметров перед заполнением из TXT.dir:
for (int nPrmInd=0;nPrmInd<nPBIndCnt;nPrmInd++)
aParamBuf[nPrmInd][0]="";
}
//---------------------------------------------------------------------------
Он был полностью рабочий, пока не понадобилось данные из текстовика перед внесением в базу конвертануть из OEM в ANSI.
Код:
char *tmp=new char(aParamBuf[2][0].Length()+1);
// Переводим имя базы в ANSI
tmp=aParamBuf[2][0].c_str();
OemToChar(tmp,tmp);
aParamBuf[2][0]=tmp;
// delete tmp;
Если раскоминтарить текст "// delete tmp;" То мгновенно получаем Access Violation. На всех типах процессоров.
Если оставить закоминтареным то получаем Acess Violation при выходе из подпрограммы после выполнения строки "delete cStrLst;" причём (!!!) только на AMD процессорах. На интеле всё выполняется без ошибок.
Незнаю что делать, хоть самописную конвертилку в Ansi пиши.
![Frown :( :(](https://cdn.jsdelivr.net/joypixels/assets/8.0/png/unicode/64/1f641.png)