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' , Unit1 in 'Unit1.pas' ;
{$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 FUserLevel: TUserLevel; public 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...
chickenfigt1989 hat folgendes geschrieben : |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| private FUserLevel: TUserLevel; public 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 FUserLevel: TAccountSystemUserLevel; public 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' , Unit1 in 'Unit1.pas' ;
{$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; 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 FUserLevel: TAccountSystemUserLevel; public 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
chickenfigt1989 hat folgendes geschrieben : |
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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!