Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Passwortabfrage ins Programm einbauen


TheNeon - Mi 01.08.07 13:00
Titel: Passwortabfrage ins Programm einbauen
Hallo zusammen,

ich habe sicherlich nach den faöschen Wörtern gesucht, daher nix gefunden .... also hier meine Problemschilderung:

Ich habe mein Programm fertig und möchte jetzt jedoch noch VOR dem eigentlichen Programmstart eine Passwort-Abfrage machen. Dazu habe ich bereits ein zweites Formular erstellt, doch schaffe ich es einfach nicht, dass beim richtigen Passwort das Formular mit der Abfrage komplett verschwindet und das Hauptprogramm gestartet wird. Ebenso wenig funktioniert das reibungslose Schließen bei falscher Eingabe.

Kann wer helfen? user defined image



Gruß
TheNeon


Chryzler - Mi 01.08.07 13:07

Zeig mal deinen Code den du bis jetzt hast.


TheNeon - Mi 01.08.07 13:22

das was ich bisher habe ist eigentlich peinlich, da ich keine Ahnung habe, wie ich das realisieren kann, was ich will:

PROJEKT

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
program Schwupp;

uses
  Forms,
  Main in 'Main.pas' {F_Main},
  Passwortabfrage in 'Passwortabfrage.pas' {F_Passwortabfrage};

{$R *.res}

begin
  Application.Initialize;
  Application.Title := 'Schwupp';
  Application.CreateForm(TF_Main, F_Main);
  Application.CreateForm(TF_Passwortabfrage, F_Passwortabfrage);
  Application.Run;
end.


PASSWORTABFRAGE

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
var
  F_Passwortabfrage: TF_Passwortabfrage;

implementation

uses
  Main;

{$R *.dfm}

procedure TF_Passwortabfrage.Button_BestaetigenClick(Sender: TObject);
begin
  if EDIT_Passwort.Text <> 'passwort' then begin
    Close;
  end;
end;

procedure TF_Passwortabfrage.Button_AbbrechenClick(Sender: TObject);
begin
  Close;
end;

procedure TF_Passwortabfrage.EDIT_PasswortKeyUp(Sender: TObject;
  var Key: Word; Shift: TShiftState);
begin
  if Key = VK_Return then begin
    Button_BestaetigenClick(nil);
  end;
  if Key = VK_ESCAPE then begin
    Button_AbbrechenClick(nil);
  end;
end;

end.


MAIN

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TF_Main.FormCreate(Sender: TObject);
var
  i: Integer;
begin
  F_Passwortabfrage := TF_Passwortabfrage.Create(F_Main);
  try
    F_Passwortabfrage.ShowModal;
  finally
    F_Passwortabfrage.Free;
  end;

[...]



Was mir praktisch gesehen fehlt ist, dass ist von der Passwortabfrage praktisch Rückmeldungen kriege ... oder?

Bin an einem Punkt wo jegliche Versuche nix gebracht haben :( ... ist bestimmt aber nicht so schwer user defined image


chrisw - Mi 01.08.07 13:24

Du könntest im Projectcode (Project/View Source) das Programmform in Abhängigket des "Passwort-Form" "createn" !
So ähnlich:
Bsp:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
uses ....,Controls,


{$R *.res}
begin
  Application.Initialize;
  Application.CreateForm(TPasswortForm, PasswortForm);
  case PasswortForm.ShowModal of 
    mrOK : begin  //Passwort richtig
             PasswortForm.Free;
             Application.CreateForm(TProgramForm,ProgramForm);
           end;
    mrCancel : PasswortForm.Free; //Passwort falsch / Programm wird beendet
  end;
  Application.Run;
end;


TheNeon - Mi 01.08.07 13:43

Okay, soweit verstehe ich es. Was ich nur nicht hinkriege ist das Ergebnis abhängig vom Passwort zu machen, denn wenn ich nach Passworteingabe "Self.Close" mache, dann wird immer mrCancel ausgelöst user defined image


Chryzler - Mi 01.08.07 13:56

Versuch mal statt Self.Close einfach Application.Terminate zu nehmen.


TheNeon - Mi 01.08.07 14:07

user defined image klappt alles nicht, denn wenn ich es so mache, dann wird beim Abbrechen das Programm trotzdem gestartet und direkt danach terminiert.
Wenn das Passwort richtig ist, wird das Programm gestartet, doch im Vordergrund erscheint wieder die Passwortabfrage.

user defined image


passiv - Mi 01.08.07 14:10

nimm self.hide und hauptform.show


JayEff - Mi 01.08.07 15:12

user profile iconTheNeon hat folgendes geschrieben:
wenn ich nach Passworteingabe "Self.Close" mache, dann wird immer mrCancel ausgelöst
Wer ShowModal benutzt sollte mit dem ModalResult umgehen können. Einfach bei der richtigen Eingabe des Passworts nicht Close; sondern ModalResult := mrOK; benutzen, bei falscher Eingabe mrCancel.
Und dass Application.Terminate nicht die Hauptform anzeigt sondern das Programm schließt, ist irgendwie ... klar.
Vielleicht wär dieser Code in der Projektdatei besser...:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
Uses
    Forms,
    Unit1 In 'Unit1.pas' {Form1}//<--Hauptform
    Unit2 In 'Unit2.pas' {Form2}//<--Passwortform
    Controls; //Für mrOK. Alternativ mrOK mit 1 ersetzen.


Begin
    Application.Initialize;
    Application.CreateForm(TForm2, Form2);
    If Form2.ShowModal = mrOK Then
    Begin
        Form2.Free;
        Application.CreateForm(TForm1, Form1);

        Form1.Show;
        Application.Run;
    End
    Else
        Application.Terminate;
End.

Bevor das hier in eine Diskusion über Sicherheit ausartet: Ich weiß, dass man so gut wie überhaupt keine Sicherheit vor Crackern erreichen kann. Man kann z.B. einfach den jump der if-Abfrage von jnz in jz oder ähnliches ändern und schwupps erhalte ich Zugriff, sobald ich das *falsche* passwort eingebe, anstatt umgekehrt. Aber darum gehts hier ja nicht ;)


TheNeon - Mi 01.08.07 16:28

user defined image

Danke, so klappt es. Wusste nicht, dass man mit ModalResult was zurückgeben kann - ist ja genau das was ich suchte.
Das mit dem Terminate hast du aber falsch verstanden ;)

Bzgl. der Sicherheit reicht es mir, soll nur eine kleine Sicherheit sein :)

user defined image