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. |
Да, да...выдает
Просто прикол я недавно понял
Если CODE | PasswordForm->ShowModal(); | запихнуть в то вылетает, а вот если в ?...
Это потому, что PasswordForm создается после Event MainForm->onCreate();
Но блин, одна дурацкая вещь получается, если окно свернуть в трей, а потом развернуть, то PasswordForm опять появиться
|
|
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
|
По-моему такие вещи проще делать в главном модуле проекта:
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;
}
|
ДАЛОЙ ГЕМОРОЙ
к тому же последний пользовательтут еще и храниться в ини файле
и программа не дает возможности поббора пароля так как вылетает после третьей ошибки
FConnect форма с запросом пароля
F_Vibor форма основной программы
FConnect открываешь как главную и все
QUOTE | ДАЛОЙ ГЕМОРОЙ |
Отредактировано LordConst — 09.02.2007, 11:51
|
|