Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.04.2011, 08:05   #1
U_r0ck
 
Регистрация: 19.12.2010
Сообщений: 6
По умолчанию Замена диалога запроса имени пользователя

Здравствуйте, уважаемые форумчане!
Прошу подсобить в моём обучении. На данный момент изучаю делфи, и поэтому возникли вопросы, которых совсем чуть-чуть. Уверен, что вы мне поможете. Вообщем, я изучаю сей документ, в котором мне не ясны некоторые моменты, а точнее - порядок действий.
Исходя из содержания документа - я должен создать новое приложение, добавить на него компонент IBDatabase (база у меня на Firebird), и поместить туда компонент IBTransaction. Для того, чтобы активировать таблицу в "теле" программы, судя по мануалу нужно прописать следующий код:

Код:
 IBDatabase1.Params.Clear;
  IBDatabase1.LoginPrompt:=False;
  IBDatabase1.DatabaseName:='servername:c:\dir\data.gdb';
  IBDatabase1.Params.Add('user_name=SYSDBA');
  IBDatabase1.Params.Add('password=masterkey');
  IBDatabase1.Params.Add('lc_ctype=win1251');
  IBDatabase1.Connected:=True;
Первый вопрос: куда именно его прописывать? после begin? или где?

Пункт следующий... После активации базы, мануал предлагает нам создать собственный диалог авторизации в базе... Цитирую:
Код:
Выше уже было сказано, что можно использовать свой диалог для запроса имени пользователя и пароля. Его можно "вставить" в качестве замены стандартного, при LoginPrompt:=True. Пример:

procedure TForm1.IBDatabase1Login(Database: TIBDatabase; LoginParams: TStrings);
 var
   dlg: TDBLoginDialog; // созданный вами диалог
 begin
   dlg:=TDBLoginDialog.Create(Application);
   if dlg.ModalResult = mrOK then      
     with LoginParams do 
       begin        
         Values['USER_NAME'] := User_Name;
         Values['PASSWORD'] := User_Pass;
         // другие параметры, например role_name, lc_ctype и т.д., если необходимо
       end;
   dlg.Free;
 end;

Динамическое создание диалога не обязательно, но желательно, чтобы он зря не занимал в приложении память, тем более что диалог этот обычно вызывается 1 раз при старте приложения.
А вот тут совсем ничего не понятно. Большая просьба расписать этот пункт более подробно, как для чайника.
Прошу отнестись с пониманием. Я правда пытался вникнуть, и юзал поиск, но данные манипуляции не обвенчались успехом.
С уважением.
U_r0ck вне форума Ответить с цитированием
Старый 30.04.2011, 19:14   #2
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

В упомянутом мануале есть более простой способ соединения с базой:
Цитата:
Если воспользоваться редактором свойств TIBDatabase (двойной клик на компоненте), то упомянутые свойства будут заполнены автоматически.
...
Соединиться с базой можно установив один раз параметры при помощи вышеописанного диалогового окна.
По второму вопросу.
Создать новую форму (File -> New -> Form).
Свойство Name = DBLoginDialog;
Cвойство BorderStyle = bsDialog.
Кинуть на форму два TLabel и два TEdit;
И кнопку BitBtn, в свойстве Kind указать bkОК.
Открыть через меню Progect -> Options. Закладка Forms. Убрать эту новую форму из списка Auto-create forms.

Выделить на форме компонент IBDatabase1. Перейти в Object Inspector на закладку Events. Щелкнуть два раза в правой колонки против события OnLogin. В тексте программы появиться заготовка процедуры обработки события, которая приведена в цитате. Скопировать в тело процедуры пример и заменить:
Код:
         Values['USER_NAME'] := Edit1.Text;
         Values['PASSWORD'] := Edit2.Text;
Только зачем заменять стандартный диалог, непонятно.

Последний раз редактировалось Прик; 30.04.2011 в 19:45.
Прик вне форума Ответить с цитированием
Старый 01.05.2011, 19:48   #3
raf999
 
Регистрация: 01.05.2011
Сообщений: 6
По умолчанию

Уточните, пожалуйста, название формы "DBLoginDialog" имеет принципиальное значение в данном случае?
И во втором варианте нужно ли прописывать "IBDatabase1.Connected:=True"?

Последний раз редактировалось raf999; 01.05.2011 в 20:04.
raf999 вне форума Ответить с цитированием
Старый 01.05.2011, 20:02   #4
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Никакого значения имя формы не имеет, называйте как хотите.
Свойство формы Name.
Прик вне форума Ответить с цитированием
Старый 01.05.2011, 22:32   #5
raf999
 
Регистрация: 01.05.2011
Сообщений: 6
По умолчанию

И все же не могу понять что делаю не так.
Когда убираю создание формы из auto-create то форма вообще не открывается, просто проигрывается в холостую.
Когда в auto-create создание формы прописано окно открывается, но нажатие на кнопку ок никаких результатов не дает, никаких сообщений

Код прописан как на примере:
Код:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, DB, IBDatabase;

type
  TDBLoginDialog = class(TForm)
    IBDatabase1: TIBDatabase;
    Edit1: TEdit;
    Edit2: TEdit;
    BitBtn1: TBitBtn;
    procedure IBDatabase1Login(Database: TIBDatabase; LoginParams: TStrings);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  dlg: TDBLoginDialog;
implementation
{$R *.dfm}
procedure TDBLoginDialog.IBDatabase1Login(Database: TIBDatabase;
  LoginParams: TStrings);
begin
 begin
   dlg:=TDBLoginDialog.Create(Application);
   if dlg.ModalResult = mrOK then
     with LoginParams do
       begin
         Values['USER_NAME'] := edit1.Text;
         Values['PASSWORD'] := edit2.Text;
         end;
   IBDatabase1.Connected:=True;
   dlg.Free;
 end;
end;
end.

Последний раз редактировалось Stilet; 06.05.2011 в 07:23.
raf999 вне форума Ответить с цитированием
Старый 01.05.2011, 22:56   #6
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

В примере недвусмысленно показано, что диалог надо создавать в главной форме (Form1), а не в том же диалоге. Сам себя диалог создавать не может.
И пож., будьте внимательны. В посте #2 сказано что и как делать.
Этот диалог создается в той форме, на которой расположен компонент IBDatabase1.

Теорию почитать бы надо.
Прик вне форума Ответить с цитированием
Старый 02.05.2011, 04:16   #7
raf999
 
Регистрация: 01.05.2011
Сообщений: 6
По умолчанию

Да, действительно как-то не обратил на это внимание.
Теперь все стало на свое место. Большое спасибо за помощь!
raf999 вне форума Ответить с цитированием
Старый 02.05.2011, 16:30   #8
U_r0ck
 
Регистрация: 19.12.2010
Сообщений: 6
По умолчанию

Всем спасибо за ответы.

Поясните, что я делаю не так...
Я открываю делфи, создаётся новый проект, с уже готовой формой (form1). Кликаю на File -> New -> Form. Создаётся form2, на которой я начинаю формировать диалог:
Свойство Name = DBLoginDialog;
Cвойство BorderStyle = bsDialog.
Кидаю на форму два TLabel и два TEdit;
И кнопку BitBtn, в свойстве Kind указываю bkОК.
Захожу в Project -> Options. Закладка Forms. Убираю новую форму (DBLoginDialog) из списка Auto-create forms.

Затем, перехожу на form1, и кидаю на неё компонент IBDatabase. Открываю свойства, и в эвенте OnLogin пишу

var
dlg: TDBLoginDialog; // созданный вами диалог
begin
dlg:=TDBLoginDialog.Create(Applicat ion);
if dlg.ModalResult = mrOK then
with LoginParams do
begin
Values['USER_NAME'] := dlg.Edit1.Text;
Values['PASSWORD'] := dlg.Edit2.Text;
// другие параметры, например role_name, lc_ctype и т.д., если необходимо
end;
dlg.Free;
IBDatabase1.Connected:=True;

Значит, теперь хочу, чтобы процедура выполнялась при создании Form1. В свойство Form1 - OnCreate пишу - IBDatabase1Login (пробовал также, TForm1.IBDatabase1Login - Delphi ругается на not enough actual parameters. Что я делаю не так?

Полный листинг программы:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IBDatabase, DB, StdCtrls;

type
  TForm1 = class(TForm)
    IBDatabase1: TIBDatabase;
    IBTransaction1: TIBTransaction;
    procedure IBDatabase1Login(Database: TIBDatabase;
      LoginParams: TStrings);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
implementation
    uses unit2;
{$R *.dfm}

procedure TForm1.IBDatabase1Login(Database: TIBDatabase;
  LoginParams: TStrings);
  var
  dlg: TDBLoginDialog; // созданный вами диалог
begin
   dlg:=TDBLoginDialog.Create(Application);
   if dlg.ModalResult = mrOK then
     with LoginParams do
       begin
         Values['USER_NAME'] := dlg.Edit1.Text;
         Values['PASSWORD'] := dlg.Edit2.Text;
         // другие параметры, например role_name, lc_ctype и т.д., если необходимо
       end;
   dlg.Free;
   IBDatabase1.Connected:=True;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   TForm1.IBDatabase1Login;
end;

end.
U_r0ck вне форума Ответить с цитированием
Старый 02.05.2011, 17:30   #9
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Две ошибки найдены.
Код:
  if dlg.ModalResult = mrOK then
должно быть заменено на
  if dlg.ShowModal = mrOK then //и Д. Кузьменко (читай, "гуру") бывает ошибается.
Код:
   dlg.Free;
//   IBDatabase1.Connected:=True; //эта строка должна быть перенесена в
OnCreat главной формы (где находится IBDatabase1). Здесь же она приводит к бесконечному циклу соединения с БД.

Более никакие телодвижения не нужны (тем более TForm1.IBDatabase1Login).
Это событие (OnLogin) автоматически срабатывает при соединении с БД.
Т.е. когда происходит присвоение:
Код:
  IBDatabase1.Connected:=True;

Последний раз редактировалось Прик; 02.05.2011 в 17:34.
Прик вне форума Ответить с цитированием
Старый 05.05.2011, 17:25   #10
raf999
 
Регистрация: 01.05.2011
Сообщений: 6
По умолчанию

Народ, подскажите, ни у кого не возникает ошибки при закрытии формы диалога методом free? Структуру диалога немного другую использую, но судя по логике если ошибка у меня возникает и тут она должна быть.
Есть предположение, что ошибка возникает из-за того, что когда делается запись в коде, типа Values['USER_NAME'] := dlg.Edit1.Text, то реально переписывается указатель и при очистке методом free loginParams.Values['USER_NAME'] реально смотрит на адрес памяти, куда указывал объект dlg.edit1.text. Скажите у меня у одного такая ошибка и правильные ли предположения? При закрытии окна диалога .close все нормально
raf999 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запуск программы от имени другого пользователя... EraM Общие вопросы Delphi 3 12.05.2011 11:07
Запрашивание имени пользователя и сохранение конфигурации Viresta Общие вопросы Delphi 1 27.12.2010 01:05
При установке ловушки на клавиатуру зависают приложения, запущенные от имени другого пользователя. _Lamer Visual C++ 2 22.11.2010 10:01
Определение имени пользователя из сервиса Garacio_cain Общие вопросы Delphi 2 10.12.2009 17:17
Прочесс без имени пользователя delphin100 Общие вопросы Delphi 0 29.10.2008 06:45