[ mish_ns @ 26.08.2010. 17:48 ] @
Pozdrav svima...

Po uzoru na
Login forma

napravio sam login formu...i malo je modifikovao.

Interesuje me kako proveriti da li je pritisnuto dugme za zatvaranje forme (gornji desni ugao X) ???

Posto sam prethodni primer modifikovao ovako:

Code:

var
 i:integer;
begin
  i:=1;
  zatvori:=false;
  repeat
  if TfrmLogin.DoLogin then
  begin
    Application.Initialize;
    //Application.MainFormOnTaskbar := True;
    Application.CreateForm(TfrmGlavna, frmGlavna);
    Application.Run;
  end
  else
    ShowMessage('Login name or password incorrect. Attempt: '+IntToStr(3-i));
    i:=i+1;
  until i>3;
end.


To znaci da prilikom logovanja korisnik ima sansu da tri puta pogresi nakon cega se zatvara aplikacija...
E sad posto ne znam kako da proverim da li je korisnik kliknuo na close forme, onda se i posle klika na dugme X prikazuje poruka!

Ili mozda neko ima bolju ideju za login formu???

Hvala!!!
[ mish_ns @ 26.08.2010. 18:39 ] @
Evo jos jedne ideje deluje mi mnogo jednostavnije.....

Postaviti login formu u autocreate.

Na nju staviti dugme npr. Login i Cancel.

Code:

procedure TfrmLogin.btnIzlazClick(Sender: TObject);
begin
    Close;
end;

procedure TfrmLogin.btnLoginClick(Sender: TObject);
var
  frmMain: TfrmGlavna;
begin
    IBQuery1.SQL.Text:='select * from login where korisnicko=:kor and lozinka=:loz';
    IBQuery1.ParamByName('kor').Value:= edKorisnicko.Text;
    IBQuery1.ParamByName('loz').Value:= edLozinka.Text;
    IBQuery1.Open;
    if not IBQuery1.IsEmpty then begin
      frmLogin.Hide;
      frmMain:=TfrmGlavna.Create(nil);
      frmMain.ShowModal;
      frmMain.Free;
      frmLogin.Close;
    end
    else
    begin
      edKorisnicko.Clear;
      edLozinka.Clear;
      ShowMessage('Pokusajte ponovo');
    end;

end;


Ako je ikome ovo pomoglo nek javi :)
[ savkic @ 26.08.2010. 19:29 ] @
> napravio sam login formu...i malo je modifikovao.
> Interesuje me kako proveriti da li je pritisnuto dugme za zatvaranje forme (gornji desni ugao X) ???

Recimo handlovanjem WM_SYSCOMMAND u toj formi, ali to tebi nije ni potrebno.

> if TfrmLogin.DoLogin then
> begin
> To znaci da prilikom logovanja korisnik ima sansu da tri puta pogresi nakon cega se zatvara aplikacija...
> E sad posto ne znam kako da proverim da li je korisnik kliknuo na close forme, onda se i posle klika na dugme X prikazuje poruka!

DoLogin metoda treba da vraća True ako i samo ako je login uspešno prošao, u svim drugim slučajevima (samim tim i prostim zatvaranjem forme) vratiće False.
[ mish_ns @ 26.08.2010. 20:00 ] @
Citat:

DoLogin metoda treba da vraća True ako i samo ako je login uspešno prošao, u svim drugim slučajevima (samim tim i prostim zatvaranjem forme) vratiće False.


Tacno, ali posto sam uradio ovako:

Code:

class function TfrmLogin.DoLogin:bool;
begin

with TfrmLogin.Create(nil) do
   try
     Result := ShowModal = mrOk;
   finally
     Free;
   end;
end;


onda bas i ne radi kako treba...

Kad kliknem direktno na X, trebalo bi da se zatvori forma i prekine repeat petlja bez ispisa poruke, a ovde sve dok tri puta ne kliknem na close ne zatvara formu...i uvek ispisuje poruku.

Sto znaci da funkcija u principu radi dobro samo bi trebalo malo izmeniti glavni program???

[ savkic @ 26.08.2010. 20:15 ] @
> Kad kliknem direktno na X, trebalo bi da se zatvori forma i prekine repeat petlja bez ispisa poruke, a ovde sve dok tri puta ne kliknem na
> close ne zatvara formu...i uvek ispisuje poruku.
> Sto znaci da funkcija u principu radi dobro samo bi trebalo malo izmeniti glavni program???

Tek sam sada video da si repeat ubacio u dpr, odakle ti samo takva ideja ;) Repeat i sve vezano za login treba da bude u login formi, dakle kada korisnik unese name/pass i klikne na ok dugme, ti proveriš da li je ispravna šifra, ako nije povećaš brojač za jedan, eventualno izdaš neku poruku, izbrišeš uneto i čekaš korisnika. Ako je prekoračen broj pokušaja samo pozoveš Close.
[ mish_ns @ 26.08.2010. 20:34 ] @
Citat:
Tek sam sada video da si repeat ubacio u dpr, odakle ti samo takva ideja ;)


Ha, ha...svasta coveku pada na pamet kad radi ceo dan...

Ne vredi, pokusao sam da uradim po tvom predlogu ali ne ide...
Probacu sutra, pa se cujemo....Hvala u svakom slucaju....
[ mish_ns @ 27.08.2010. 08:09 ] @
Pozdrav...evo mog resenja :)

Ovo je kod za login button
Code:

var
  nema: boolean;
begin
  IBQuery1.SQL.Text:='select * from login';
  IBQuery1.Open;
  nema:= false;
  brojac:=brojac+1;
  while not IBQuery1.Eof do begin
    if (edKorisnicko.Text=IBQuery1.FieldByName('korisnicko').AsString) and
       (edLozinka.Text=IBQuery1.FieldByName('lozinka').AsString) then
    begin
      ModalResult := mrOK;
      nema:=false;
      break;
    end
    else
    begin
     //ModalResult := mrAbort;
     nema:= true;
   end;
  IBQuery1.Next;
  end;
   if (nema=true) and IBQuery1.Eof then
   begin
      ShowMessage('Morate uneti validno korisnicko ime i lozinku!'+#10+
                  'Imate jos '+IntTostr(3-brojac)+' pokusaja za logovanje');
   end;
  IBQuery1.Close;
  CloseForm;// procedura koja proverava globalnu promenljivu brojac, ako je brojac=3 zarvara se aplikacija
end;


Pretpostavljam da postoji elegantnije resenje :)

savkic, ako imas vremena iskomentarisi, a zanima me i ova provera iz naslova teme kako se radi.
Hvala!
[ savkic @ 27.08.2010. 13:17 ] @
> IBQuery1.SQL.Text:='select * from login';
Code:

WHERE
  USER_NAME = 'UserName' AND 
  PASS           = 'Pass';

Lakše je dodati i WHERE sekciju kako bi se odmah izdvojio samo onaj slog koji odgovara unetom korisniku.

> brojac:=brojac+1;

Ustaljena konvencija je da se poljima (promenljivama) klase dodeljuje F kao prefiks. Dakle, FBrojac.

> if (nema=true)

Dovoljno je, if Nema then ...

> a zanima me i ova provera iz naslova teme kako se radi.

Pogledaj http://www.elitesecurity.org/t391791-0#2524414, to je za minimizovanje forme, ti treba provera za SC_CLOSE.
[ mish_ns @ 27.08.2010. 13:27 ] @
Da u pravu si...hvala za sugestije!