C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Пароль, перед загрузкой программы
Wldmr
Отправлено: 31.01.2007, 22:13


Ученик-кочегар

Группа: Участник
Сообщений: 5



Здравствуйте! У меня такая проблема: нужно, чтобы перед открытием программы выводилось окно для ввода статус пользователя (администратор, оператор и т.д.), имя пользователя и пароля. И если они совпадут с хранящимися в базе, то программа откроется. Буду рад если кто поможет.
_NIK_
Отправлено: 01.02.2007, 00:29


Дежурный стрелочник

Группа: Участник
Сообщений: 55



Создай окно для ввода пароля и в FormCreate главного окна пропиши PasswordForm.ShowModal().
Потом в этом окне проверяй пароль, при неправильном вводе можно например Application.Terminate()
Wldmr
Отправлено: 01.02.2007, 20:20


Ученик-кочегар

Группа: Участник
Сообщений: 5



я уже пробовал через ShowModal(), СВ6 выдает ошибку в модуле файл.exe по адресу 000000000.
_NIK_
Отправлено: 01.02.2007, 22:40


Дежурный стрелочник

Группа: Участник
Сообщений: 55



QUOTE (Wldmr @ 01.02.2007, 20:20)
я уже пробовал через ShowModal(), СВ6 выдает ошибку в модуле файл.exe по адресу 000000000.

Да, да...выдает rolleyes.gif
Просто прикол я недавно понял
Если
CODE
PasswordForm->ShowModal();
запихнуть в
CODE
MainForm->onCreate
то вылетает, а вот если в
CODE
MainForm->onShow
?... biggrin.gif

Это потому, что PasswordForm создается после Event MainForm->onCreate();
Но блин, одна дурацкая вещь получается, если окно свернуть в трей, а потом развернуть, то PasswordForm опять появиться sad.gif
Valdemar
Отправлено: 02.02.2007, 08:33


Мастер участка

Группа: Участник
Сообщений: 433



Ошибка получается скорее всего из-за того, что форму для ввода пароля вызываете до того, как она будет создана.
nawok78
Отправлено: 02.02.2007, 17:31


Станционный диспетчер

Группа: Участник
Сообщений: 115



QUOTE

Ошибка получается скорее всего из-за того, что форму для ввода пароля вызываете до того, как она будет создана.

точно! убери твою форму с паролем из числа автоматически создаваемых! и сделай:
CODE

void __fastcall TFMain::OnCreate(TObject *Sender)
{
 TFPassWord *FPassWord = new TFPassWord(NULL);
 if (TFPassWord->ShowModal()!=mrOk)
   FMain->Close();
}


Отредактировано nawok78 — 02.02.2007, 17:33
Wldmr
Отправлено: 02.02.2007, 20:49


Ученик-кочегар

Группа: Участник
Сообщений: 5



[QUOTE]убери твою форму с паролем из числа автоматически создаваемых! и сделай:[QUOTE]

Я так сделал, но после нажатия ОК выдает:

Access violation at address 005240D2 in module 'ozonprod.exe'. Read of address 000002EC.
nawok78
Отправлено: 07.02.2007, 10:16


Станционный диспетчер

Группа: Участник
Сообщений: 115



извини, не на OnCreate а на OnShow
а по поводу ошибки — есть обработчик на нажатие OK?
или смотришь пароль после закрытия формы?
delete FPassWord Нигде не стоит?

[QUOTE]убери твою форму с паролем из числа автоматически создаваемых! и сделай:[QUOTE] — не сработало потому, что у перед второй QUOTE нужен / — как в HTML — тегах.....


Отредактировано nawok78 — 07.02.2007, 10:18
Wldmr
Отправлено: 08.02.2007, 22:26


Ученик-кочегар

Группа: Участник
Сообщений: 5



QUOTE
по поводу ошибки — есть обработчик на нажатие OK?

CODE

void __fastcall TFormPass::RzBitBtnOKClick(TObject *Sender)
{
 if (Trim(eLogin->Text).Length()<3)
 {
   Application->MessageBoxA("Èìÿ ïîëüçîâàòåëÿ äîëæíî ñîäåðæàòü íå ìåíåå 3 ñèìâîëîâ.","Âíèìàíèå",MB_OK+MB_ICONWARNING);
   return;
 }
 if (Trim(ePass->Text).Length()<3)
 {
   Application->MessageBoxA("Ïàðîëü äîëæåí ñîäåðæàòü íå ìåíåå 3-åõ ñèìâîëîâ.","Âíèìàíèå",MB_OK+MB_ICONWARNING);
   return;
 }
 TIniFile *usif=new TIniFile(dir+"users.dat");
 TStringList *strl=new TStringList();
 usif->ReadSections(strl);
  //ââîäèìûé ïîëüçîâàòåëü
       String usname;
       String usp;
 usname = eLogin->Text;
 usp = ePass->Text;

 for (int i=0; i<strl->Count; i++)
 {
   if (usif->ReadBool(strl->Strings[i],"del",false)) continue;
   username = usif->ReadString(strl->Strings[i],"login","");//Trim(eLogin->Text);
   String p = usif->ReadString(strl->Strings[i],"pass","");
   grup = usif->ReadInteger(strl->Strings[i],"grp",0);
   if ( username == usname )
   { if ( p == usp )
     {
       String s = frMain->Caption + "   Ïîëüçîâàòåëü: ";
       switch (grup)
       {
         case 0: s += "Îïåðàòîð "; break;
         case 1: s += "Êîíòðîëëåð "; break;
         case 2: s += "Àäìèíèñòðàòîð "; break;
       }
       s += username;
       frMain->Caption = s;
//        FormPass->Visible = false;
//        Close();
       break;
     }else
     {
       Application->MessageBoxA("Íåâåðíûé ïàðîëü","Âíèìàíèå",MB_OK+MB_ICONWARNING);continue;
     }
   }
   if (i == strl->Count — 1)
   Application->MessageBoxA("Ïîëüçîâàòåëü íå çàðåãåñòðèðîâàí, îáðàòèòåñü ê àäìèíèñòðàòîðó","Âíèìàíèå",MB_OK+MB_ICONWARNING);
 }
delete strl;
delete usif;

}


QUOTE
delete FPassWord Нигде не стоит?

delete FPass нет.

при нажатии ОК форма пароля остается, а основная не появляется. В основной форме есть обработчик таймера, программа на него "выходит" и потом открывает снова форму пароля. Не знаю как закрыть ее и открыть основную.
Valdemar
Отправлено: 09.02.2007, 08:52


Мастер участка

Группа: Участник
Сообщений: 433



Поставьте для кнопки Оk ModalResult=mrOk. Тогда при нажатии на нее модальная форма закроется.
nawok78
Отправлено: 09.02.2007, 10:41


Станционный диспетчер

Группа: Участник
Сообщений: 115



CODE

ModalResult=mrCancel;//Тут ставится что пароль не тот
if (Trim(eLogin->Text).Length()<3)
{
Application->MessageBoxA("Имя пользователя должно содержать не менее 3 символов.","Внимание",MB_OK+MB_ICONWARNING);
return;
}
if (Trim(ePass->Text).Length()<3)
{
Application->MessageBoxA("Пароль должен содержать не менее 3-ех символов.","Внимание",MB_OK+MB_ICONWARNING);
return;
}

а там где убеждаешься что пароль-логин совпали ставишь
CODE

ModalResult=mrOk;
return;


Отредактировано nawok78 — 09.02.2007, 10:49
Shagg
Отправлено: 09.02.2007, 10:52


Дежурный стрелочник

Группа: Участник
Сообщений: 69



wink.gif По-моему такие вещи проще делать в главном модуле проекта:
CODE

project.cpp:
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR pszCmdLine, int)
{
 try
 {
   Application->Initialize();
   TLoginForm *f = new TLoginForm(NULL);
   if (f->ShowModal != mrOk) return 1;
   delete f;
   Application->CreateForm(__classid(TMainForm), &MainForm);
 }
 ...
}

проверка пароля выполняется в форме LoginForm, которая возвращает mrOk если пароль правильный.
nawok78
Отправлено: 09.02.2007, 10:52


Станционный диспетчер

Группа: Участник
Сообщений: 115



а если еще так:

CODE

void __fastcall TFMain::OnCreate(TObject *Sender)
{
 TFPassWord *FPassWord = new TFPassWord(NULL);
 TModalResult mr = FPassWord->ShowModal();
 delete FPassWord;
 FPassWord=NULL;

 if (mr!=mrOk)
   Close();
}
LordConst
Отправлено: 09.02.2007, 11:49


Ученик-кочегар

Группа: Участник
Сообщений: 10



CODE

#include <vcl.h>
#include <stdio.h>
#include <inifiles.hpp>

#pragma hdrstop

#include "Connect.h"
#include "Menu.h"
#include "Vibor.h"
#include "stdio.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TFConnect *FConnect;
int i=0;
//---------------------------------------------------------------------------
__fastcall TFConnect::TFConnect(TComponent* Owner)
: TForm(Owner)
{
TIniFile *ini;
ini = new TIniFile( ChangeFileExt( Application->ExeName, ".INI" ) );
LEName->Text = ini->ReadString( "Database", "Name", "Администратор" );
LEDatabase->Text = ini->ReadString( "Database", "Database", "Base" );
LEServer->Text = ini->ReadString( "Database", "Server", "(local)" );
delete ini;

}
//---------------------------------------------------------------------------

void __fastcall TFConnect::BCanselClick(TObject *Sender)
{
Hide();
Application->MessageBoxA("Вы не вошли в систему","Внимание",MB_OK);
Close();
}
//---------------------------------------------------------------------------
void __fastcall TFConnect::BOkClick(TObject *Sender)
{
i++;
ADODatabase->ConnectionString="Provider=SQLOLEDB.1;";
ADODatabase->ConnectionString=ADODatabase->ConnectionString+"Password="+LEPassword->Text+";";
ADODatabase->ConnectionString=ADODatabase->ConnectionString+"Persist Security Info=False;";
ADODatabase->ConnectionString=ADODatabase->ConnectionString+"User ID="+LEName->Text+";";
ADODatabase->ConnectionString=ADODatabase->ConnectionString+"Initial Catalog="+LEDatabase->Text+";";
ADODatabase->ConnectionString=ADODatabase->ConnectionString+"Data Source="+LEServer->Text;
try
{
ADODatabase->Connected=true;
}
catch(...)
{
if (i<3)
{
Application->MessageBoxA("Ошибка подключения к базе данных","Внимание",MB_OK);
return;
}
else
{
Application->MessageBoxA("Вы не вошли в систему","Внимание",MB_OK);
Close();
}
}
F_Vibor->Show();
FConnect->Hide();

TIniFile *ini;
ini = new TIniFile(ChangeFileExt( Application->ExeName, ".INI" ) );
ini->WriteString( "Database", "Name", LEName->Text );
ini->WriteString( "Database", "Database", LEDatabase->Text );
ini->WriteString( "Database", "Server", LEServer->Text );

delete ini;
}



ДАЛОЙ ГЕМОРОЙ wizard.gif
к тому же последний пользовательтут еще и храниться в ини файле
и программа не дает возможности поббора пароля так как вылетает после третьей ошибки
FConnect форма с запросом пароля

F_Vibor форма основной программы

FConnect открываешь как главную и все smile.gif

QUOTE
ДАЛОЙ ГЕМОРОЙ wizard.gif


Отредактировано LordConst — 09.02.2007, 11:51

Вернуться в Вопросы программирования в C++Builder