Авторизация пользователя через созданную форму в Delphi

IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.

Модератор: kdv

Toshiba
Сообщения: 11
Зарегистрирован: 29 фев 2008, 14:53

Сообщение Toshiba » 28 мар 2008, 13:39

Я прошу прощение у всех! Знаете в чем была проблема?-в том что я все это запускал из Delphi! если просто exe-шник запускать - то делается то что нужно! Как говорится а слона то не заметил! Судя по всему в самой среде разработки отлов ошибок идет на более высшем уровне

RedAndBlack
Сообщения: 24
Зарегистрирован: 16 авг 2007, 07:18

Сообщение RedAndBlack » 28 мар 2008, 13:41

вообще то да =)
если эксцепт появляется, то делфи сначала покажет его тебе, а далее сделает отработку ошибки так как ты написал =)

stix-s
Заслуженный разработчик
Сообщения: 557
Зарегистрирован: 13 дек 2005, 11:52

Сообщение stix-s » 28 мар 2008, 13:52

Toshiba писал(а):Выгрузку из 1с в IB я уже сделал - так что она может это!
вранье, поди она в файлик кидает, а IB из файлика втягивает

Toshiba
Сообщения: 11
Зарегистрирован: 29 фев 2008, 14:53

Сообщение Toshiba » 28 мар 2008, 14:01

stix-s писал(а):
Toshiba писал(а):Выгрузку из 1с в IB я уже сделал - так что она может это!
вранье, поди она в файлик кидает, а IB из файлика втягивает
код дать?

stix-s
Заслуженный разработчик
Сообщения: 557
Зарегистрирован: 13 дек 2005, 11:52

Сообщение stix-s » 28 мар 2008, 14:04

Toshiba писал(а):
stix-s писал(а):
Toshiba писал(а):Выгрузку из 1с в IB я уже сделал - так что она может это!
вранье, поди она в файлик кидает, а IB из файлика втягивает
код дать?
давай :)

Toshiba
Сообщения: 11
Зарегистрирован: 29 фев 2008, 14:53

Сообщение Toshiba » 28 мар 2008, 14:07

stix-s писал(а):
Toshiba писал(а):
stix-s писал(а):
Toshiba писал(а):Выгрузку из 1с в IB я уже сделал - так что она может это!
вранье, поди она в файлик кидает, а 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();   
	
КонецПроцедуры

stix-s
Заслуженный разработчик
Сообщения: 557
Зарегистрирован: 13 дек 2005, 11:52

Сообщение stix-s » 28 мар 2008, 14:08

код для мазохистов

Код: Выделить всё

while not(db.connected)do
begin
try
 db.open;
except
 ShowMessage('Введи пароль!');
end; 
end;

stix-s
Заслуженный разработчик
Сообщения: 557
Зарегистрирован: 13 дек 2005, 11:52

Сообщение stix-s » 28 мар 2008, 14:11

Toshiba писал(а):ODBC};Pwd=masterkey;UID=SYSDBA;Server=NAME;Database=server:path\xxx.ib";
гыыыыыыы, дык не напрямую а ч.з ADO+ODBC драйвер нужен :)
так я те и Ексель подключу к FB :)

Toshiba
Сообщения: 11
Зарегистрирован: 29 фев 2008, 14:53

Сообщение Toshiba » 28 мар 2008, 14:17

stix-s писал(а):
Toshiba писал(а):ODBC};Pwd=masterkey;UID=SYSDBA;Server=NAME;Database=server:path\xxx.ib";
гыыыыыыы, дык не напрямую а ч.з ADO+ODBC драйвер нужен :)
так я те и Ексель подключу к FB :)
Ну собственно для ADO+ODBC и существуют для соединеня различных типов баз, а также разных форматов БД

RedAndBlack
Сообщения: 24
Зарегистрирован: 16 авг 2007, 07:18

Сообщение RedAndBlack » 28 мар 2008, 14:32

stix-s писал(а):код для мазохистов

Код: Выделить всё

while not(db.connected)do
begin
try
 db.open;
except
 ShowMessage('Введи пароль!');
end; 
end;
хех, так и пишем по сути =)))

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 28 мар 2008, 14:48

у меня при эксепшене приложение выдает сначала 'не законнектились', потом интербейзовское сообщение.
это в среде, всегда так. среда показывает exception.

RedAndBlack
Сообщения: 24
Зарегистрирован: 16 авг 2007, 07:18

Сообщение RedAndBlack » 28 мар 2008, 14:49

kdv писал(а):
у меня при эксепшене приложение выдает сначала 'не законнектились', потом интербейзовское сообщение.
это в среде, всегда так. среда показывает exception.
не, это не в среде было, именно в приложении. то есть ибейзовское появлялось в среде, в приложении мое сообщение, а потом ещё раз в приложении ибейзовское =) я там писал, что разобрался с этим.

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 28 мар 2008, 16:47

Toshiba писал(а):Ну собственно для ADO+ODBC и существуют для соединеня различных типов баз, а также разных форматов БД
Вот видишь, NONE кодировку ты сам заливаешь.

Slavik
Сообщения: 115
Зарегистрирован: 17 янв 2007, 11:52

Сообщение Slavik » 30 мар 2008, 22:14

Столько сообщений по базовым вещам :lol:.

1. Чтобы форма логина была своя, её родимую самому и надо нарисовать в том же Delphi, и вызывать потом при необходимости. А чтобы она не исчезала с глаз пользователя при ошибке соединения, достаточно повесить обсуждавшуюся выше процедуру подключения на кнопку [Ok] (без цикла). Только не надо этой кнопке присваивать mrOk. Его надо присваивать свойству ModalResult формы при удачном логине в процедуре соединения.

2. Чтобы Delphi не перхватывал ошибки коннекта в режиме отладки, добавь EDatabaseError в список игнорируемых исключений на страничке настроек "Debugger Options / Language Exceptions".

P.S. Все проблемы в итоге свелись к недостаточному умению/опыту работы со средой разработки Delphi. Кстати, с какой-то из версий в Delphi появилась возможноть запуска приложения из IDE без отладчика.

Lars
Сообщения: 86
Зарегистрирован: 21 дек 2005, 16:34

Сообщение Lars » 28 апр 2008, 19:49

У самого долго была эта проблема. Потом просёк, что надо уничтожать вовремя форму и не отображать ошибку в тру

Смотри, вот такой метод у ГЛАВНОЙ формы

Код: Выделить всё


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;
[/quote]

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 29 апр 2008, 02:35

Разрешите пройтись по коду, дабы неокрепшие умы новичков не пострадали.
1.

Код: Выделить всё

    if frmLogin.cmbGroup.ItemIndex <> -1 then 
       sRole:=frmLogin.cmbGroup.KeyItems[frmLogin.cmbGroup.ItemIndex  ] 
    else 
       sRole:='';
делает то же самое, что и

Код: Выделить всё

sRole := frmLogin.cmbGroup.Items[frmLogin.cmbGroup.ItemIndex] 
2.

Код: Выделить всё

if DM.DatabaseConnect(db.ConnectParams.UserName,sRole, '', sError ) = False then
Сравнение булевского значения с True и False моветон.
Должно быть:

Код: Выделить всё

if not DM.DatabaseConnect(db.ConnectParams.UserName,sRole, '', sError ) then
3. Использование Halt здесь неуместно.
Читаем документацию:
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:

Код: Выделить всё

  case ErrorValue.IBErrorCode of
  335544344:
    begin 
    end; 
  335544472: 
    begin 
    end; 
  335544375:
    begin 
    end;
5. А вот это уже порнография:

Код: Выделить всё

MessageBoxA(Self.Handle,Pchar('Неизвестная ошибка времени выполнения' + #13#13 + 'Номер ошибки:'+ IntToStr(ErrorValue.IBErrorCode) + #13#13 +'Текст ошибки:' + ErrorValue.IBMessage) ,sErrorMessage, MB_ICONSTOP+MB_OK);
MessageDlg() не используете по идеологическим соображениям?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 29 апр 2008, 03:07

Вдогонку. Большинство участников форума не занимаются публикацией таких кусков кода. И не из чувства стыда за собственный код, а как минимум, понимая, что у каждого есть свой стиль кодирования, и выдранный из конкретного проекта кусок кода должен быть достаточно примитивным, чтобы быть пригодным к использованию другим человеком и в другом проекте.

Lars
Сообщения: 86
Зарегистрирован: 21 дек 2005, 16:34

Сообщение Lars » 29 апр 2008, 06:41

CyberMax писал(а):

Код: Выделить всё

MessageBoxA(Self.Handle,Pchar('Неизвестная ошибка времени выполнения' + #13#13 + 'Номер ошибки:'+ IntToStr(ErrorValue.IBErrorCode) + #13#13 +'Текст ошибки:' + ErrorValue.IBMessage) ,sErrorMessage, MB_ICONSTOP+MB_OK);
MessageDlg() не используете по идеологическим соображениям?
Порнография в использовании "ручного" склеивания строк или использования Messagebox? MessageDlg() использует не переведенные названия кнопок.
CyberMax писал(а): Сравнение булевского значения с True и False моветон.
Считаю, что это религиозный спор.
CyberMax писал(а): sRole := frmLogin.cmbGroup.Items[frmLogin.cmbGroup.ItemIndex]
В обычном Combobox выдаст ошибку при -1 индексе. Такое может быть, если пользователь не выбрал ничего, либо стер значение.
И еще - это не обычный ComboBox, а из Ehlib.

С if согласен, можно было использовать и case.

И напоследок, в своем глазу, как говорится... А посмотреть на суть проблемы никто не ставил задачу. Ведь кода никто не посоветовал человеку.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 29 апр 2008, 09:09

Ведь кода никто не посоветовал человеку.
объяснять надо алгоритм, а не код. Если человек не сможет преобразовать алгоритм в код, то он не программист.

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Сообщение hvlad » 29 апр 2008, 11:02

Lars писал(а):
CyberMax писал(а): sRole := frmLogin.cmbGroup.Items[frmLogin.cmbGroup.ItemIndex]
В обычном Combobox выдаст ошибку при -1 индексе. Такое может быть, если пользователь не выбрал ничего, либо стер значение.
И еще - это не обычный ComboBox, а из Ehlib.
В обычном Combobox есть Text.
Если ты показываешь кому-то пример, то он не должен содержать не относящихся к теме не стандартных компонент.
Нормальные пацаны никогда не обращаются к контролам формы не в её методах. RTMF property.

:lol:

Ответить