Авторизация пользователя через созданную форму в Delphi
Модератор: kdv
-
- Сообщения: 24
- Зарегистрирован: 16 авг 2007, 07:18
stix-s писал(а):давайToshiba писал(а):код дать?stix-s писал(а):вранье, поди она в файлик кидает, а IB из файлика втягиваетToshiba писал(а):Выгрузку из 1с в IB я уже сделал - так что она может это!
Код: Выделить всё
Процедура Контрагенты()
objConnection = СоздатьОбъект("ADODB.Connection");
СтрПодключения = "Driver={Easysoft IB6 ODBC};Pwd=masterkey;UID=SYSDBA;Server=NAME;Database=server:path\xxx.ib";
Попытка
objConnection.Open(СтрПодключения);
Исключение
Сообщить(ОписаниеОшибки());
Предупреждение("Не удалось подключиться к IB ...")
КонецПопытки;
objRecordset = СоздатьОбъект("ADODB.Recordset");
objRecordsetLine = СоздатьОбъект("ADODB.Recordset");
objRecordset.ActiveConnection = objConnection;
objRecordsetDelete = СоздатьОбъект("ADODB.Recordset");
cпр =создатьобъект("Справочник.Контрагенты");
спр.выбратьэлементы();
пока спр.получитьэлемент()=1 цикл
если спр.этогруппа()=1 тогда
продолжить;
конецесли;
л=0;
НачатьТранзакцию();
стрзапрос="insert into KONTRAGENT(KONTR,NOMER_1C,BASE_IB) values('"+сокрЛП(спр.наименование)+"','"+сокрЛП(спр.код)+"','NONE')";
Попытка
objRecordset.open(стрЗапрос);
Исключение
сообщить("Код не уникален");
ОтменитьТранзакцию();
л=1;
КонецПопытки;
если л=0 тогда
ЗафиксироватьТранзакцию();
конецесли;
конеццикла;
//objRecordset.Close();
objConnection.close();
КонецПроцедуры
код для мазохистов
Код: Выделить всё
while not(db.connected)do
begin
try
db.open;
except
ShowMessage('Введи пароль!');
end;
end;
-
- Сообщения: 24
- Зарегистрирован: 16 авг 2007, 07:18
хех, так и пишем по сути =)))stix-s писал(а):код для мазохистовКод: Выделить всё
while not(db.connected)do begin try db.open; except ShowMessage('Введи пароль!'); end; end;
-
- Сообщения: 24
- Зарегистрирован: 16 авг 2007, 07:18
не, это не в среде было, именно в приложении. то есть ибейзовское появлялось в среде, в приложении мое сообщение, а потом ещё раз в приложении ибейзовское =) я там писал, что разобрался с этим.kdv писал(а):это в среде, всегда так. среда показывает exception.у меня при эксепшене приложение выдает сначала 'не законнектились', потом интербейзовское сообщение.
Столько сообщений по базовым вещам .
1. Чтобы форма логина была своя, её родимую самому и надо нарисовать в том же Delphi, и вызывать потом при необходимости. А чтобы она не исчезала с глаз пользователя при ошибке соединения, достаточно повесить обсуждавшуюся выше процедуру подключения на кнопку [Ok] (без цикла). Только не надо этой кнопке присваивать mrOk. Его надо присваивать свойству ModalResult формы при удачном логине в процедуре соединения.
2. Чтобы Delphi не перхватывал ошибки коннекта в режиме отладки, добавь EDatabaseError в список игнорируемых исключений на страничке настроек "Debugger Options / Language Exceptions".
P.S. Все проблемы в итоге свелись к недостаточному умению/опыту работы со средой разработки Delphi. Кстати, с какой-то из версий в Delphi появилась возможноть запуска приложения из IDE без отладчика.
1. Чтобы форма логина была своя, её родимую самому и надо нарисовать в том же Delphi, и вызывать потом при необходимости. А чтобы она не исчезала с глаз пользователя при ошибке соединения, достаточно повесить обсуждавшуюся выше процедуру подключения на кнопку [Ok] (без цикла). Только не надо этой кнопке присваивать mrOk. Его надо присваивать свойству ModalResult формы при удачном логине в процедуре соединения.
2. Чтобы Delphi не перхватывал ошибки коннекта в режиме отладки, добавь EDatabaseError в список игнорируемых исключений на страничке настроек "Debugger Options / Language Exceptions".
P.S. Все проблемы в итоге свелись к недостаточному умению/опыту работы со средой разработки Delphi. Кстати, с какой-то из версий в Delphi появилась возможноть запуска приложения из IDE без отладчика.
У самого долго была эта проблема. Потом просёк, что надо уничтожать вовремя форму и не отображать ошибку в тру
Смотри, вот такой метод у ГЛАВНОЙ формы
Главная форма создает окно регистрации, она же его и уничтожает!
Главная фича в том, что обработчик сидит в TFIBErrorHandler.
А там отлавливаю номер ошибки
[/quote]
Смотри, вот такой метод у ГЛАВНОЙ формы
Код: Выделить всё
procedure TfrmMain.DbOpen();
var sRole, sUserName, sError, ADatabase:String;
begin
//
frmLogin := TfrmLogin.Create(Application);
if frmLogin.ShowModal = mrOK then
begin
//кто в базу пришел
db.DatabaseName := ReadParam('database', 'DatabaseName', '');
db.ConnectParams.UserName := frmLogin.edtUserName.Text;
db.ConnectParams.Password := frmLogin.edtUserPwd.Text;
if frmLogin.cmbGroup.ItemIndex <> -1 then
sRole:=frmLogin.cmbGroup.KeyItems[frmLogin.cmbGroup.ItemIndex ]
else
sRole:='';
DB.ConnectParams.RoleName := sRole;
try
DB.Open;
if Assigned(frmLogin) then
frmLogin.Free;
if DM.DatabaseConnect(db.ConnectParams.UserName,sRole, '', sError ) = False then halt;
except on E:Exception do
begin
//ShowMEssage(e.Message);
end;
end;
end
else
begin
Halt;
end;
end;
Главная фича в том, что обработчик сидит в TFIBErrorHandler.
А там отлавливаю номер ошибки
Код: Выделить всё
keOther:
begin
Lasterror := 'keOther';
//не найден файл базы данных
if ErrorValue.IBErrorCode = 335544344 then
begin
MessageBoxA(Self.Handle, PChar('Невозможно подключиться к базе данных.' +#13#13 + 'Причина ошибки:' +#13+ 'Не найден файл базы данных!'), sErrorConnect, MB_ICONEXCLAMATION+MB_Ok);
DoRaise:=false;
//WriteLog('Приложение аварийно завершено!');
halt;
end;
//неверно указано имя пользователя и пароль
if ErrorValue.IBErrorCode=335544472 then
begin
MessageBoxA(Self.Handle, PChar('Невозможно подключиться к базе данных.' + #13#13+ 'Причина ошибки:' +#13+ 'Неверно указано имя пользователя или пароль.'), sErrorConnect, MB_OK + MB_ICONERROR);
//DoRaise:=False;
if Assigned(frmLogin) then
frmLogin.Free;
DBOpen;
exit;
end;
//база данных не доступна
if ErrorValue.IBErrorCode=335544375 then
begin
MessageBoxA(Self.Handle, PAnsiChar('Доступ к базе данных закрыт!' + #13#13 + 'Возможная причина: не запущен сервер Firebird!'), sErrorConnect, MB_ICONEXCLAMATION+MB_OK);
frmLogin.Free;
//WriteLog('Приложение аварийно завершено!');
Halt;
end;
MessageBoxA(Self.Handle,Pchar('Неизвестная ошибка времени выполнения' + #13#13 + 'Номер ошибки:'+ IntToStr(ErrorValue.IBErrorCode) + #13#13 +'Текст ошибки:' + ErrorValue.IBMessage) ,sErrorMessage, MB_ICONSTOP+MB_OK);
end;
Разрешите пройтись по коду, дабы неокрепшие умы новичков не пострадали.
1.
делает то же самое, что и
2.
Сравнение булевского значения с True и False моветон.
Должно быть:
3. Использование Halt здесь неуместно.
Читаем документацию:
4. Код подобный этому:
делается через Case:
5. А вот это уже порнография:
MessageDlg() не используете по идеологическим соображениям?
1.
Код: Выделить всё
if frmLogin.cmbGroup.ItemIndex <> -1 then
sRole:=frmLogin.cmbGroup.KeyItems[frmLogin.cmbGroup.ItemIndex ]
else
sRole:='';
Код: Выделить всё
sRole := frmLogin.cmbGroup.Items[frmLogin.cmbGroup.ItemIndex]
Код: Выделить всё
if DM.DatabaseConnect(db.ConnectParams.UserName,sRole, '', sError ) = False then
Должно быть:
Код: Выделить всё
if not DM.DatabaseConnect(db.ConnectParams.UserName,sRole, '', sError ) then
Читаем документацию:
Кто сказал, что невозможность подключится к базе - это ненормальная и, как видим дальше, "аварийная" ситуация?Halt performs an abnormal termination of a program and returns to the operating system.
To perform a normal termination of a Delphi application, call the Terminate method on the global Application object.
4. Код подобный этому:
Код: Выделить всё
if ErrorValue.IBErrorCode = 335544344 then
begin
end;
if ErrorValue.IBErrorCode=335544472 then
begin
end;
if ErrorValue.IBErrorCode=335544375 then
begin
end;
Код: Выделить всё
case ErrorValue.IBErrorCode of
335544344:
begin
end;
335544472:
begin
end;
335544375:
begin
end;
Код: Выделить всё
MessageBoxA(Self.Handle,Pchar('Неизвестная ошибка времени выполнения' + #13#13 + 'Номер ошибки:'+ IntToStr(ErrorValue.IBErrorCode) + #13#13 +'Текст ошибки:' + ErrorValue.IBMessage) ,sErrorMessage, MB_ICONSTOP+MB_OK);
Вдогонку. Большинство участников форума не занимаются публикацией таких кусков кода. И не из чувства стыда за собственный код, а как минимум, понимая, что у каждого есть свой стиль кодирования, и выдранный из конкретного проекта кусок кода должен быть достаточно примитивным, чтобы быть пригодным к использованию другим человеком и в другом проекте.
Порнография в использовании "ручного" склеивания строк или использования Messagebox? MessageDlg() использует не переведенные названия кнопок.CyberMax писал(а):MessageDlg() не используете по идеологическим соображениям?Код: Выделить всё
MessageBoxA(Self.Handle,Pchar('Неизвестная ошибка времени выполнения' + #13#13 + 'Номер ошибки:'+ IntToStr(ErrorValue.IBErrorCode) + #13#13 +'Текст ошибки:' + ErrorValue.IBMessage) ,sErrorMessage, MB_ICONSTOP+MB_OK);
Считаю, что это религиозный спор.CyberMax писал(а): Сравнение булевского значения с True и False моветон.
В обычном Combobox выдаст ошибку при -1 индексе. Такое может быть, если пользователь не выбрал ничего, либо стер значение.CyberMax писал(а): sRole := frmLogin.cmbGroup.Items[frmLogin.cmbGroup.ItemIndex]
И еще - это не обычный ComboBox, а из Ehlib.
С if согласен, можно было использовать и case.
И напоследок, в своем глазу, как говорится... А посмотреть на суть проблемы никто не ставил задачу. Ведь кода никто не посоветовал человеку.
В обычном Combobox есть Text.Lars писал(а):В обычном Combobox выдаст ошибку при -1 индексе. Такое может быть, если пользователь не выбрал ничего, либо стер значение.CyberMax писал(а): sRole := frmLogin.cmbGroup.Items[frmLogin.cmbGroup.ItemIndex]
И еще - это не обычный ComboBox, а из Ehlib.
Если ты показываешь кому-то пример, то он не должен содержать не относящихся к теме не стандартных компонент.
Нормальные пацаны никогда не обращаются к контролам формы не в её методах. RTMF property.