Ошибка при преобразовании формы
Код:
FormStyle = fsMDIForm;
Выдает ошибку:
rised exception class EIBClientError with message 'Cannot perform operation -- DB is currently open'.
судя по описанию, ошибка возникает при действиях с БД
Сервер базы данных FireBird 2.1
На форме компоненты:
IBDataBase1
IBTransaction1
IBQuery1
DataSource1
DBLookupComboBox1
Только когда я работаюс компонентами никаких ошибок, начинаю елать, что то с формой - выбивает ошибку.
Какие мысли теперь будут?
Цитата: iRain
Какие мысли теперь будут?
никаких... хз чего ты там наворотил, у тебя же код дюже секретный, никому не показываешь, так копайся сам в нем.
ЗЫ: отладчик в 90% случаев снимает подобные вопросы.
Если это поможет:
Код:
void __fastcall TForm1::FormShow(TObject *Sender)
{
TIniFile *ini;
AnsiString inif = ExtractFilePath(Application->ExeName) + "azs.ini", basep, basen;
if(!FileExists(inif))
{
TIniFile *ini;
AnsiString inif = ExtractFilePath(Application->ExeName) + "azs.ini";
ini = new TIniFile(inif);
ini->WriteString("DataBase", "DataBase", ExtractFilePath(Application->ExeName));
ini->WriteBool("Programm", "LogFile", true);
}
basep = ini->ReadString("DataBase", "DataBase", ExtractFilePath(Application->ExeName));
basen = ExtractFilePath(basep) + "azs.gdb";
inis.logfile = ini->ReadBool("Programm", "LogFile", true);
delete ini;
if(inis.logfile)
{
OpenLog(false);
SaveLog("Запуск программы");
}
if(!FileExists(basen))
{
Application->MessageBoxA("Базаданных отсутствует, укажите правильный путь!","Ошибка", MB_ICONSTOP + MB_OK);
ShellExecute(Handle,NULL,"FindBase.exe",NULL,ExtractFilePath(Application->ExeName).c_str(),SW_NORMAL);
Form1->Close();
return;
}
//Подключение базы данных...................................
IBDatabase1->DatabaseName = basen;
IBDatabase1->DefaultTransaction = IBTransaction1;
IBDatabase1->Params->Add("SYSDBA");
IBDatabase1->Params->Add("masterkey");
IBDatabase1->LoginPrompt = false;
IBTransaction1->DefaultDatabase = IBDatabase1;
IBTransaction1->AutoStopAction = saCommit;
IBTransaction1->DefaultAction = TACommit;
IBDatabase1->Connected = true;
IBTransaction1->Active = true;
IBQuery1->Database = IBDatabase1;
IBQuery1->Transaction = IBTransaction1;
Form2->IBQuery1->Database = IBDatabase1;
Form2->IBQuery1->Transaction = IBTransaction1;
//Вывод списка пользователей.............................................
Form1->PrepQuery(Form1->IBQuery1);
Form1->IBQuery1->SQL->Add("select * from tbl_users where prava > 0 order by id");
Form1->IBQuery1->Open();
DBLookupComboBox1->ListField = "NAME";
DBLookupComboBox1->KeyField = "NAME";
DBLookupComboBox1->ListFieldIndex = 1;
Form1->IBQuery1->First();
}
{
TIniFile *ini;
AnsiString inif = ExtractFilePath(Application->ExeName) + "azs.ini", basep, basen;
if(!FileExists(inif))
{
TIniFile *ini;
AnsiString inif = ExtractFilePath(Application->ExeName) + "azs.ini";
ini = new TIniFile(inif);
ini->WriteString("DataBase", "DataBase", ExtractFilePath(Application->ExeName));
ini->WriteBool("Programm", "LogFile", true);
}
basep = ini->ReadString("DataBase", "DataBase", ExtractFilePath(Application->ExeName));
basen = ExtractFilePath(basep) + "azs.gdb";
inis.logfile = ini->ReadBool("Programm", "LogFile", true);
delete ini;
if(inis.logfile)
{
OpenLog(false);
SaveLog("Запуск программы");
}
if(!FileExists(basen))
{
Application->MessageBoxA("Базаданных отсутствует, укажите правильный путь!","Ошибка", MB_ICONSTOP + MB_OK);
ShellExecute(Handle,NULL,"FindBase.exe",NULL,ExtractFilePath(Application->ExeName).c_str(),SW_NORMAL);
Form1->Close();
return;
}
//Подключение базы данных...................................
IBDatabase1->DatabaseName = basen;
IBDatabase1->DefaultTransaction = IBTransaction1;
IBDatabase1->Params->Add("SYSDBA");
IBDatabase1->Params->Add("masterkey");
IBDatabase1->LoginPrompt = false;
IBTransaction1->DefaultDatabase = IBDatabase1;
IBTransaction1->AutoStopAction = saCommit;
IBTransaction1->DefaultAction = TACommit;
IBDatabase1->Connected = true;
IBTransaction1->Active = true;
IBQuery1->Database = IBDatabase1;
IBQuery1->Transaction = IBTransaction1;
Form2->IBQuery1->Database = IBDatabase1;
Form2->IBQuery1->Transaction = IBTransaction1;
//Вывод списка пользователей.............................................
Form1->PrepQuery(Form1->IBQuery1);
Form1->IBQuery1->SQL->Add("select * from tbl_users where prava > 0 order by id");
Form1->IBQuery1->Open();
DBLookupComboBox1->ListField = "NAME";
DBLookupComboBox1->KeyField = "NAME";
DBLookupComboBox1->ListFieldIndex = 1;
Form1->IBQuery1->First();
}
Есть еще обработка нажатия на кнопку:
Код:
AnsiString psw, pswb, name;
psw = genpsw(Edit1->Text);
pswb = IBQuery1->FieldByName("PSW")->AsString;
pswb = getdb(pswb);
name = getdb(IBQuery1->FieldByName("NAME")->AsString);
if (pswb == psw)
{
openrul(IBQuery1->FieldByName("PRAVA")->AsInteger);
if(!ruls.active)
{
Label3->Caption = "Данный пользователь не активен\nобратитесь к администратору!";
Edit1->Text = "";
ActiveControl = DBLookupComboBox1;
return;
}
Label1->Caption = name;
Form2->Caption = Form1->Caption + " - пользователь " + name;
Label1->Tag = IBQuery1->FieldByName("ID")->AsInteger;
IBQuery1->Close();
Constraints->MaxHeight = 0;
Constraints->MinHeight = 0;
Constraints->MaxWidth = 0;
Constraints->MinWidth = 0;
Left = 1;
Top = 1;
Width = 1023;
Height = 767;
Form1->WindowState = wsMaximized;
Color = clMedGray;
FormStyle = fsMDIForm; //После этой строки выбивает ошибку в режиме отладки
SaveLog("Пользователь " + name + " вошел в программу");
}
else
{
Label3->Caption = "Не правильно введен пароль";
Edit1->Text = "";
ActiveControl = DBLookupComboBox1;
ActiveControl = Edit1;
SaveLog("Пользователь " + name + " ввел неверный пароль");
}
}
psw = genpsw(Edit1->Text);
pswb = IBQuery1->FieldByName("PSW")->AsString;
pswb = getdb(pswb);
name = getdb(IBQuery1->FieldByName("NAME")->AsString);
if (pswb == psw)
{
openrul(IBQuery1->FieldByName("PRAVA")->AsInteger);
if(!ruls.active)
{
Label3->Caption = "Данный пользователь не активен\nобратитесь к администратору!";
Edit1->Text = "";
ActiveControl = DBLookupComboBox1;
return;
}
Label1->Caption = name;
Form2->Caption = Form1->Caption + " - пользователь " + name;
Label1->Tag = IBQuery1->FieldByName("ID")->AsInteger;
IBQuery1->Close();
Constraints->MaxHeight = 0;
Constraints->MinHeight = 0;
Constraints->MaxWidth = 0;
Constraints->MinWidth = 0;
Left = 1;
Top = 1;
Width = 1023;
Height = 767;
Form1->WindowState = wsMaximized;
Color = clMedGray;
FormStyle = fsMDIForm; //После этой строки выбивает ошибку в режиме отладки
SaveLog("Пользователь " + name + " вошел в программу");
}
else
{
Label3->Caption = "Не правильно введен пароль";
Edit1->Text = "";
ActiveControl = DBLookupComboBox1;
ActiveControl = Edit1;
SaveLog("Пользователь " + name + " ввел неверный пароль");
}
}
Ну насколько я помню, после возникновения исключения Borland останавливается на строке, где это исключение было выброшено (в режиме отладки). Вот эту строку и смотрите.
Код:
[FONT=monospace]
[/FONT]//Подключение базы данных...................................[FONT=monospace]
[/FONT]IBDatabase1->DatabaseName = basen;
[/FONT]//Подключение базы данных...................................[FONT=monospace]
[/FONT]IBDatabase1->DatabaseName = basen;
база где нибудь отключается?
Цитата: oxotnik333
вот перед этим:
база где нибудь отключается?
Код:
[FONT=monospace]
[/FONT]//Подключение базы данных...................................[FONT=monospace]
[/FONT]IBDatabase1->DatabaseName = basen;
[/FONT]//Подключение базы данных...................................[FONT=monospace]
[/FONT]IBDatabase1->DatabaseName = basen;
база где нибудь отключается?
Нет конечно, я ее использую постоянно.
Вам не кажется что изменение стиля формы настолько серьезный шаг, что после него вызывается обработчик FormShow()?
Цитата: iRain
Нет конечно, я ее использую постоянно.
ну в общем то Phodopus уже ответил на все...
а конструкцию коннекта к БД можно переписать в виде
Код:
if (DataBase->Connected && DataBase->ConnectionOptions != NewConnectionOptions)
{
DataBase->Disconnect();
DataBase->ConnectionOptions = NewConnectionOptions;
DataBase->Connect();
}
{
DataBase->Disconnect();
DataBase->ConnectionOptions = NewConnectionOptions;
DataBase->Connect();
}
Большое спасибо за помощь!!!