Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Login System


chickenfigt1989 - Sa 13.08.11 10:17
Titel: Login System
Hallo
Hab folgenden Code:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
procedure TForm2.AccountSystemClient1LoggedIn(
  AUserLevel: TAccountSystemUserLevel; AExpired: Boolean);
begin
Form1.Caption := 'Farm-House Manager Herzlich Willkommen ' + Form2.AccountSystemClient1.UserName;
if AExpired then
  begin
    ShowMessage('Dein Benutzerkonto ist abgelaufen!');
    Application.Terminate;
  end
  else if AUserLevel = aulDisabled then
  begin
    ShowMessage('Dein Benutzerkonto wurde deaktiviert!');
    Application.Terminate;
  end;
  SaveLoginData;

  Form1.Button1.Enabled:=(AUserLevel = aulEnabled) or (AUserLevel = aulAdmin);

end;



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

uses
  Forms, Controls,
  Unit2 in 'Unit2.pas' {Form2},
  Unit1 in 'Unit1.pas' {Form1};


{$R *.res}

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



wirft mir immer einen fehler aus

Wahrscheinlich weil Form 1 noch gar nicht zu diesen zeitpunkt existiert.
Wie kann ich das beheben?
lg


jaenicke - Sa 13.08.11 12:58

Pack den Status z.B. in eine Property, die du dann im Projektquelltext abfragen und nach dem Erzeugen an das zweite Formular weitergeben kannst.


chickenfigt1989 - Sa 13.08.11 13:44

Und wie mach ich das?


jaenicke - Sa 13.08.11 13:58


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
type
  TSecondForm = class...
  private
    FUserLevel: TUserLevel;
  public
    property UserLevel: TAccountSystemUserLevel read FUserLevel;
  end;

procedure TSecondForm.AccountSystemClient1LoggedIn(
  AUserLevel: TAccountSystemUserLevel; AExpired: Boolean);
begin
  ...
  FUserLevel := AUserLevel;
end;
Jetzt kannst du von außen auf die Property UserLevel zugreifen.


elundril - Sa 13.08.11 17:59

Irre ich mich oder ist Application.Terminate; nicht eig. sehr böse?

lg elundril


jaenicke - Sa 13.08.11 18:01

Nein, es beendet die Anwendung, das ist schon richtig. (Denkst du vielleicht gerade an Halt? ;-))

Allerdings ist es an der Stelle natürlich absolut unnötig, weil schlicht der weitere Start unterbunden werden muss.


chickenfigt1989 - Sa 13.08.11 20:39

Hallo,

Wieso sagt er mir immer

Delphi-Quelltext
1:
[Error] Unit2.pas(28): Undeclared identifier: 'UserLevel'                    

lg


jaenicke - Sa 13.08.11 20:41

Da nur du deinen Quelltext siehst, kannst das im Moment nur du herausfinden... :roll:


Dude566 - Sa 13.08.11 20:41

Weißt du denn, was dir die Fehlermeldung sagt? ;)


chickenfigt1989 - Sa 13.08.11 20:56

Das UserLevel' nicht deklariert ist.


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:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, AccountSystem, StdCtrls, Registry;

type

  TForm2 = class(TForm)
    Label1: TLabel;
    edtUsername: TEdit;
    Label2: TLabel;
    edtPassword: TEdit;
    Button1: TButton;
    Button2: TButton;
    AccountSystemClient1: TAccountSystemClient;
    chkAutoLogin: TCheckBox;
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure SaveLoginData;
    procedure LoadLoginData;
    procedure AccountSystemClient1LoggedIn(
      AUserLevel: TAccountSystemUserLevel; AExpired: Boolean);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
       FUserLevel: TUserLevel;
  public
    { Public declarations }
     property UserLevel: TAccountSystemUserLevel read FUserLevel;
  end;

var
  Form2: TForm2;

implementation

uses Unit1;

{$R *.dfm}

procedure TForm2.FormCreate(Sender: TObject);
begin
LoadLoginData;
end;

procedure TForm2.Button2Click(Sender: TObject);
begin
Application.Terminate;
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
if AccountSystemClient1.Login(edtUsername.Text, edtPassword.Text) then
  begin
    ModalResult := mrOK;
    
      end
  else
    ShowMessage('Falsche Benutzerdaten!');
end;

procedure TForm2.AccountSystemClient1LoggedIn(
  AUserLevel: TAccountSystemUserLevel; AExpired: Boolean);
begin
Form1.Caption := 'Farm-House Manager Herzlich Willkommen ' + Form2.AccountSystemClient1.UserName;
if AExpired then
  begin
    ShowMessage('Dein Benutzerkonto ist abgelaufen!');
    Application.Terminate;
  end
  else if AUserLevel = aulDisabled then
  begin
    ShowMessage('Dein Benutzerkonto wurde deaktiviert!');
    Application.Terminate;
  end;
  SaveLoginData;

  Form1.Button1.Enabled:=(AUserLevel = aulEnabled) or (AUserLevel = aulAdmin);
  FUserLevel := AUserLevel;

end;

procedure TForm2.SaveLoginData;
var
  Reg: TRegistry;
begin
  Reg := TRegistry.Create;
  try
    Reg.RootKey := HKEY_CURRENT_USER;
    if Reg.OpenKey('Software\' + Application.Title + ' ' + ExtractFileName(Application.ExeName), True) then
    begin
      Reg.WriteString('UserName', edtUsername.Text);
      Reg.WriteString('Password', edtPassword.Text);
      Reg.WriteBool('AutoLogin', chkAutoLogin.Checked);
      Reg.CloseKey;
    end;
  finally
    Reg.Free;
  end;
end;

procedure TForm2.LoadLoginData;
var
  Reg: TRegistry;
begin
  Reg := TRegistry.Create;
  try
    Reg.RootKey := HKEY_CURRENT_USER;
    if Reg.OpenKey('Software\' + Application.Title + ' ' + ExtractFileName(Application.ExeName), False) then
    begin
      edtUsername.Text := Reg.ReadString('UserName');
      edtPassword.Text := Reg.ReadString('Password');
      chkAutoLogin.Checked := Reg.ReadBool('AutoLogin');
      Reg.CloseKey;
    end;
  finally
    Reg.Free;
  end;
end;

end.


jaenicke - Sa 13.08.11 20:59

Ja, da habe ich mich verschrieben. Aber das hättest du bei dem Fehler doch wohl sehen können, dass dein Typ anders heißt...
user profile iconchickenfigt1989 hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
  private
    { Private declarations }
       FUserLevel: TUserLevel;
  public
    { Public declarations }
     property UserLevel: TAccountSystemUserLevel read FUserLevel;
  end;


chickenfigt1989 - Sa 13.08.11 21:00

Oh da hab ich selber nich drauf geschaut hab üebrsehn das meine Komponente anders heißt


chickenfigt1989 - Sa 13.08.11 21:06


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:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, AccountSystem, StdCtrls, Registry;

type

  TForm2 = class(TForm)
    Label1: TLabel;
    edtUsername: TEdit;
    Label2: TLabel;
    edtPassword: TEdit;
    Button1: TButton;
    Button2: TButton;
    AccountSystemClient1: TAccountSystemClient;
    chkAutoLogin: TCheckBox;
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure SaveLoginData;
    procedure LoadLoginData;
    procedure AccountSystemClient1LoggedIn(
      AUserLevel: TAccountSystemUserLevel; AExpired: Boolean);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
       FUserLevel: TAccountSystemUserLevel;
  public
    { Public declarations }
     property UserLevel: TAccountSystemUserLevel read FUserLevel;
  end;

var
  Form2: TForm2;

implementation

uses Unit1;

{$R *.dfm}

procedure TForm2.FormCreate(Sender: TObject);
begin
LoadLoginData;
end;

procedure TForm2.Button2Click(Sender: TObject);
begin
Application.Terminate;
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
if AccountSystemClient1.Login(edtUsername.Text, edtPassword.Text) then
  begin
    ModalResult := mrOK;
    
      end
  else
    ShowMessage('Falsche Benutzerdaten!');
end;

procedure TForm2.AccountSystemClient1LoggedIn(
  AUserLevel: TAccountSystemUserLevel; AExpired: Boolean);
begin
Form1.Caption := 'Farm-House Manager Herzlich Willkommen ' + Form2.AccountSystemClient1.UserName;
if AExpired then
  begin
    ShowMessage('Dein Benutzerkonto ist abgelaufen!');
    Application.Terminate;
  end
  else if AUserLevel = aulDisabled then
  begin
    ShowMessage('Dein Benutzerkonto wurde deaktiviert!');
    Application.Terminate;
  end;
  SaveLoginData;

  Form1.Button1.Enabled:=(FUserLevel = aulAdmin) or (FUserLevel = aulAdmin);


end;

procedure TForm2.SaveLoginData;
var
  Reg: TRegistry;
begin
  Reg := TRegistry.Create;
  try
    Reg.RootKey := HKEY_CURRENT_USER;
    if Reg.OpenKey('Software\' + Application.Title + ' ' + ExtractFileName(Application.ExeName), True) then
    begin
      Reg.WriteString('UserName', edtUsername.Text);
      Reg.WriteString('Password', edtPassword.Text);
      Reg.WriteBool('AutoLogin', chkAutoLogin.Checked);
      Reg.CloseKey;
    end;
  finally
    Reg.Free;
  end;
end;

procedure TForm2.LoadLoginData;
var
  Reg: TRegistry;
begin
  Reg := TRegistry.Create;
  try
    Reg.RootKey := HKEY_CURRENT_USER;
    if Reg.OpenKey('Software\' + Application.Title + ' ' + ExtractFileName(Application.ExeName), False) then
    begin
      edtUsername.Text := Reg.ReadString('UserName');
      edtPassword.Text := Reg.ReadString('Password');
      chkAutoLogin.Checked := Reg.ReadBool('AutoLogin');
      Reg.CloseKey;
    end;
  finally
    Reg.Free;
  end;
end;

end.


Was ist hier den noch Falsch?

Er wirft mir immer noch eine Fehlermeldung aus.

lg


glotzer - Sa 13.08.11 21:07

wie war das mit copy& paste?...

ach und:

Zitat:
Er wirft mir immer noch eine Fehlermeldung aus.

muss ja sehr toll sein, vieleicht solltest du ja schreiben WELCHE es ist?


jaenicke - Sa 13.08.11 21:12

Auf den ersten Blick sehe ich ohne die Fehlermeldung zu kennen erst einmal nur, dass du FUserLevel benutzt, aber nie zuweist.


chickenfigt1989 - Sa 13.08.11 21:27

Das hier kommt:


jaenicke - Sa 13.08.11 21:29

Weil du immer noch auf Form1 zugreifst statt nur den Status in FUserLevel zu packen und dann aus dem Projektquelltext heraus abzurufen...


chickenfigt1989 - Sa 13.08.11 21:38

Ja aber wie mach ich das ich des ?


jaenicke - Sa 13.08.11 21:44

:roll:

Delphi-Quelltext
1:
2:
3:
4:
5:
program Project1;

[...]

  Form2.UserLevel


chickenfigt1989 - Sa 13.08.11 21:48

Und wo muss ich das hinmachen?


jaenicke - Sa 13.08.11 21:53

Na, zuerst zeigst du das zweite Formular an und wenn der Benutzer mit Ok bestätigt hat (die Abfrage hast du ja schon), dann holst du dir darüber das Ergebnis. Dann kannst du mit dem UserLevel weiterarbeiten.


chickenfigt1989 - Sa 13.08.11 22:13

Ok dann mal anders.
Mein erster Code wirft mir ja nen Fehler aus weil es zu den Zeitpunkt noch keine Form 1 gibt.
Früher hab ich es irgendwie geschafft das Form2 vor Form 1 angezeigt wird ohne diesen code

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
Application.Initialize;
  Application.CreateForm(TForm2, Form2);
IF Form2.ShowModal=mrOK Then Begin
Form2.Free;
Application.CreateForm(TForm1, Form1);
  Application.Run;


Weil früher funktionierte es ja auch


chickenfigt1989 - So 14.08.11 03:05

Hab es nun so:

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

uses
  Forms, Controls,
  Unit2 in 'Unit2.pas' {Form2},
  Unit1 in 'Unit1.pas' {Form1};


{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TForm2, Form2);
IF Form2.ShowModal=mrOK Then Begin
Form2.Free;
Application.CreateForm(Form2.FUserLevel);
  Application.Run;

end;


Es kommt:
[Error] Unit2.pas(81): Record, object or class type required

Bin am verzweiflen :(


jaenicke - So 14.08.11 09:29

Leg dir in deinem anderen Formular genauso eine Property an. Der verpasst du noch einen Setter, in dem du dann den Button entsprechend behandelst.


chickenfigt1989 - So 14.08.11 09:46

Wenn ich nun noch wüsste was ein setter ist bzw. wie man den anlegt :(


Xion - So 14.08.11 10:55

Eine Setter dient zum Setzen.

Da Delphi in der Hinsicht sehr komfortabel ist, wird das durch das property schon realisiert.


Delphi-Quelltext
1:
2:
3:
4:
 private
       FUserLevel: TUserLevel;
  public
     property UserLevel: TUserLevel read FUserLevel write FUserLevel;


Das hinter read ist der Getter und das hinter write ist der Setter. Super ist, dass hier Delphi schon alles macht. Wenn man jetzt tatsächlich mal einen Setter selber schreiben muss geht das so:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
 private
       FUserLevel: TUserLevel;
       procedure SetUserLevel(v: TUserLevel);
  public
     property UserLevel: TUserLevel read FUserLevel write SetUserLevel;

[...]

procedure TWhatever.SetUserLevel(v: TUserLevel);
begin
  if v<>nil then
  FUserLevel:=v; //ACHTUNG: Hier nicht UserLevel:=v; zuweisen, sonst hat man ne Endlosschleife
end;


So könnte man z.B. gucken, ob das Objekt v vom Typ TUserLevel ungleich nil ist, und nur dann zuweisen. Als Beispiel.


chickenfigt1989 - So 14.08.11 14:46


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:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, AccountSystem, StdCtrls, Registry;

type

  TForm2 = class(TForm)
    Label1: TLabel;
    edtUsername: TEdit;
    Label2: TLabel;
    edtPassword: TEdit;
    Button1: TButton;
    Button2: TButton;
    AccountSystemClient1: TAccountSystemClient;
    chkAutoLogin: TCheckBox;
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure SaveLoginData;
    procedure LoadLoginData;
    procedure AccountSystemClient1LoggedIn(
      AUserLevel: TAccountSystemUserLevel; AExpired: Boolean);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
       FUserLevel: TAccountSystemUserLevel;
  public
    { Public declarations }
    property AccountSystemUserLevel: TAccountSystemUserLevel read FUserLevel write FUserLevel;
  end;

var
  Form2: TForm2;

implementation

uses Unit1;

{$R *.dfm}

procedure TForm2.FormCreate(Sender: TObject);
begin
LoadLoginData;
end;

procedure TForm2.Button2Click(Sender: TObject);
begin
Application.Terminate;
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
if AccountSystemClient1.Login(edtUsername.Text, edtPassword.Text) then
  begin
    ModalResult := mrOK;
    
      end
  else
    ShowMessage('Falsche Benutzerdaten!');
end;

procedure TForm2.AccountSystemClient1LoggedIn(
  AUserLevel: TAccountSystemUserLevel; AExpired: Boolean);
begin
Form1.Caption := 'Farm-House Manager Herzlich Willkommen ' + Form2.AccountSystemClient1.UserName;
if AExpired then
  begin
    ShowMessage('Dein Benutzerkonto ist abgelaufen!');
    Application.Terminate;
  end
  else if AUserLevel = aulDisabled then
  begin
    ShowMessage('Dein Benutzerkonto wurde deaktiviert!');
    Application.Terminate;
  end;
  SaveLoginData;

  FUserLevel.Button1.Enabled:=(FUserLevel = aulAdmin) or (FUserLevel = aulAdmin);


end;

procedure TForm2.SaveLoginData;
var
  Reg: TRegistry;
begin
  Reg := TRegistry.Create;
  try
    Reg.RootKey := HKEY_CURRENT_USER;
    if Reg.OpenKey('Software\' + Application.Title + ' ' + ExtractFileName(Application.ExeName), True) then
    begin
      Reg.WriteString('UserName', edtUsername.Text);
      Reg.WriteString('Password', edtPassword.Text);
      Reg.WriteBool('AutoLogin', chkAutoLogin.Checked);
      Reg.CloseKey;
    end;
  finally
    Reg.Free;
  end;
end;

procedure TForm2.LoadLoginData;
var
  Reg: TRegistry;
begin
  Reg := TRegistry.Create;
  try
    Reg.RootKey := HKEY_CURRENT_USER;
    if Reg.OpenKey('Software\' + Application.Title + ' ' + ExtractFileName(Application.ExeName), False) then
    begin
      edtUsername.Text := Reg.ReadString('UserName');
      edtPassword.Text := Reg.ReadString('Password');
      chkAutoLogin.Checked := Reg.ReadBool('AutoLogin');
      Reg.CloseKey;
    end;
  finally
    Reg.Free;
  end;
end;

end.


Er sagt mir aber immer noch
[Error] Unit2.pas(81): Record, object or class type required


jaenicke - So 14.08.11 16:06

user profile iconchickenfigt1989 hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
  FUserLevel.Button1.Enabled:=(FUserLevel = aulAdmin) or (FUserLevel = aulAdmin);                    
Was möchtest du denn mit dieser Zeile bezwecken?
Den Button, der irgendwo im UserLevel versteckt sein könnte, ansprechen? :shock:


chickenfigt1989 - So 14.08.11 16:42

Ich will das nur Leute die als admin eingeloggt sind, diesen Button sehen.
lg