Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Account Komponente


chickenfigt1989 - Fr 25.03.11 22:37
Titel: Account Komponente
Hallo
Besitze eine Account KOmponente.
Die Loginform ist meine MAin Form und folgendes wird ausgeführt bei klick auf Loginn:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
if AccountSystemClient1.Login(edtUsername.Text, edtPassword.Text) then
  begin
    ModalResult := mrOK;
    Close;
      end
  else
    ShowMessage('Falsche Benutzerdaten!');

Allerdings wird wenn die benutzerdaten stimmen nicht Form1 aufgerufen sondern das programm wird geschloßen.
wo liegt der Fehler bei mir?
lg


elundril - Fr 25.03.11 22:45

vermutung: Weil das ding wo deine Komponente draufliegt das hauptformular ist. wenn du im hauptformular close; aufrufst dann wird das programm geschlossen, nicht nur das fenster. Hat man dir aber glaub ich schon ein paar mal gesagt, demnach: hawara. lern. die. grundlagen.

lg elundril


chickenfigt1989 - Fr 25.03.11 23:05

Nein die Komponente liegt auf Form5
Das kann ich schon mal ausschließen
lg


elundril - Fr 25.03.11 23:13

darf ich fragen was das mit dem hauptformular zu tun hat, wie jetzt dein formular heißt? ich kann 500 Formular erzeugen und je nach lust und laune irgendeins davon zum hauptformular machen. Ich kann Form5 oder Form500 zum Hauptformular machen, je nach dem wie lustig und besoffen ich bin. Alles nur 1 Klick in den Projektoptionen...

lg elundril


Gausi - Fr 25.03.11 23:15

user profile iconchickenfigt1989 hat folgendes geschrieben Zum zitierten Posting springen:
Die Loginform ist meine MAin Form


user profile iconchickenfigt1989 hat folgendes geschrieben Zum zitierten Posting springen:
Nein die Komponente liegt auf Form5


Was denn nun? Mainform oder nicht?


jaenicke - Fr 25.03.11 23:16

user profile iconchickenfigt1989 hat folgendes geschrieben Zum zitierten Posting springen:
Nein die Komponente liegt auf Form5
user profile iconchickenfigt1989 hat folgendes geschrieben Zum zitierten Posting springen:
Die Loginform ist meine MAin Form und folgendes wird ausgeführt bei klick auf Loginn:
Was denn nun? :roll:

Zuerst hast du geschrieben, dass das Loginfenster dein Hauptformular ist, was natürlich ein Fehler wäre. Und jetzt plötzlich doch nicht?


chickenfigt1989 - Fr 25.03.11 23:19

Sorry hab nochmal nachgeschaut.
Hab Form5 zum hauptformular gemacht damit die als erstes kommt.
Wie ruf ich den Form5 als erstes auf ohne das dass das hauptformular ist?
lg


ALF - Fr 25.03.11 23:22

Ich frage mich wie Du in Deinem anderen Prog mit 300 Formen die anderen aufgerufen hast?

ALf


chickenfigt1989 - Fr 25.03.11 23:25

Das andere Programm existiert nicht mehr.
Hab se schon über Form2.show und so aufgerufen
Aber ich will das das login formular nicht das hauptformular ist aber trotzdem beim start als erstes kommt.
lg


ALF - Fr 25.03.11 23:31

Wie währe es zur Abwechslung mal die Forensuche um Hilfe zu bitten für so simple Dinge.

Alf


chickenfigt1989 - Fr 25.03.11 23:32

Und unter welchen wort soll ich suchen?
hab bei 2stunden suchen vorhin nichts gefunden
lg


jaenicke - Fr 25.03.11 23:43

Nach SplashScreen zum Beispiel, das Prinzip ist das gleiche. Kurzfassung: Du musst das Formular einfach im Projektquelltext erzeugen, aufrufen und wieder freigeben.


ALF - Fr 25.03.11 23:44

Das ist jetzt nicht Dein ernst: 'Form2 Form1' einzugeben und Du findest x Beispiele mit Deinem Problem und Lösungen!

Ist das Faulheit bei Dir?

ALF


chickenfigt1989 - Sa 26.03.11 21:01

Ich bekomms einfach nicht hin
Habe in Sourcecode folgendes Probiert:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
Application.CreateForm(TForm5, Form5);
  IF Form5.Showmodal:=mrOK Then Begin
Form2.Free;
  Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TForm2, Form2);
  Application.CreateForm(TForm3, Form3);
  Application.CreateForm(TForm4, Form4);
  Application.Run;

Da kommt immer
[Error] Project1.dpr(17): Type of expression must be BOOLEAN
[Error] Project1.dpr(24): Record, object or class type required
[Error] Project1.dpr(26): 'END' expected but end of file found

Hab auch unter Uses Controls eingefügt.
Wo liegt der fehler?
lg


jaenicke - Sa 26.03.11 21:19

Die allerersten Grundlagen... :roll:
user profile iconchickenfigt1989 hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
Application.CreateForm(TForm5, Form5);
  IF Form5.Showmodal:=mrOK Then Begin
Davon abgesehen ist deine Logik bestechend:
user profile iconchickenfigt1989 hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
3:
4:
5:
Application.CreateForm(TForm5, Form5);
  IF Form5.Showmodal:=mrOK Then Begin
Form2.Free;
  Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TForm2, Form2);
Also mal auf deutsch:
Erstelle Form5 (und setze es als Hauptformular, da du es mit Application.CreateForm erstellst), dann zeige es an und wenn mit Ok bestätigt wurde gib Form2 frei. Öh... Form2? Wie jetzt, das gibt es doch noch gar nicht?
Na gut, weiter: Erstelle Form1, Form2... Moment, sollte das nicht gerade erst freigegeben werden?
...
:autsch:


chickenfigt1989 - So 27.03.11 18:08

Hallo
Habs jetzt so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TForm5, Form5);
  IF Form5.Showmodal:=mrOK Then Begin
Form1.Free;
  Application.CreateForm(TForm2, Form2);
  Application.CreateForm(TForm3, Form3);
  Application.CreateForm(TForm4, Form4);
  Application.Run;

Allerdings kommt immer:
[Error] Project1.dpr(1 8): Type of expression must be BOOLEAN
[Error] Project1.dpr(24): Record, object or class type required
[Error] Project1.dpr(26): 'END' expected but end of file found

Ich weis echt nimmer Weiter.
Die suche hat mir auch nicht geholfen.

Lg


elundril - So 27.03.11 18:27

GRUNDLAGEN

Delphi-Quelltext
1:
2:
  IF Form5.Showmodal:=mrOK Then Begin
Form1.Free;


gut, folgenden lösungsvorschlag:
erstmal: Fenster aufmachen, frischluft hilft immer beim denken.
dann: Du startest den Computer, rufst Delphi auf, prägst dir das bild ganz genau ein wie es aussieht. Dann fährst du den Computer wieder runter und schmeißt das ding so weit es geht aus dem Fenster hinaus, machst das Fenster wieder zu und kaufst dir erst wieder nen PC wenn du gelernt hast das manche menschen einfach die finger von dingen lassen sollten, wenn sie zu faul/unmotiviert/ oder sonstwas sind um mal sich auf ihren hintern zu setzen und zu lernen. Und wenn das mal der fall sein sollte, dann kauf dir wieder nen PC aber bitte, bitte, installier nie wieder Delphi.

lg elundril


chickenfigt1989 - So 27.03.11 18:31

meinte nicht Form1.free; sondern Form5.free;
aber kommen imemr ncoh die gleichen fehlermeldungen
lg


jaenicke - So 27.03.11 18:33

user profile iconelundril hat folgendes geschrieben Zum zitierten Posting springen:
wenn sie zu faul/unmotiviert/
Und dazu kommt noch eine gehörige Portion Dummheit, anders kann ich mir das echt nicht erklären, schließlich hatte ich den Fehler ja schon genau markiert, und trotzdem wurde genau die Stelle gleich gelassen. Vielleicht als Info: Der IQ des Nutzers sollte höher als die Compilerversion von Delphi sein, das sollte mal in die Systemvoraussetzungen rein... :roll:

Um die sinnlose Diskussion zu beenden:
Ein Vergleich passiert mit einem Gleichheitszeichen, mehr nicht.


chickenfigt1989 - So 27.03.11 18:38

Auch wenn ich es so mache:

Delphi-Quelltext
1:
IF Form5.Showmodal=mrOK Then Begin                    

Kommt:
[Error] Project1.dpr(18): Undeclared identifier: 'mrOK'
[Error] Project1.dpr(24): Record, object or class type required
[Error] Project1.dpr(26): 'END' expected but end of file found

lg


elundril - So 27.03.11 18:44

weil die Units bei den uses fehlen in dem mrOK definiert ist. Ins blaue reingeraten wohl die unit Dialogs.

lg elundril


jaenicke - So 27.03.11 18:44

Ja, dann überleg einmal woran das liegen kann... da fehlt eine Unit in der uses Klausel.


chickenfigt1989 - So 27.03.11 18:46

Daran kann es nicht liegen weil bei Form1 und Form5 ist die Unit Dialogs in den Uses drin.
Bei Form 5 wenn man auf Login klickt passiert das:

Delphi-Quelltext
1:
2:
3:
if AccountSystemClient1.Login(edtUsername.Text, edtPassword.Text) then
  begin
    ModalResult := mrOK;

Und da geht auch das mrOk

lg


jaenicke - So 27.03.11 18:51

Dann brauchst du ja dort nur schauen welche Unit es ist, woher die Konstante kommt...


chickenfigt1989 - So 27.03.11 18:53

Habe jetzt die Gleichen Units eingebunden wie bei Form1, da wo das mrOk geht aber leider ohne Erfolg.

lg


jaenicke - So 27.03.11 18:57

Dann hast du wohl die Unit Controls vergessen. Außerdem kannst du auch ID_OK aus der Unit Windows direkt nutzen.


chickenfigt1989 - So 27.03.11 18:58

Wenn ich ID_OK benutze kommt
[Error] Project1.dpr(18): Undeclared identifier: 'ID_OK'
Hab folgende Units eingebunden:

Delphi-Quelltext
1:
2:
3:
4:
5:
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, XPMan, ExtCtrls, jpeg, mmsystem, ComCtrls,
  sSkinManager, sButton, IdBaseComponent, IdComponent, IdTCPConnection,
  IdTCPClient, IdHTTP, IdAuthentication, Menus, URLMon, shellapi, JvGIF,
  JvComponentBase, JvTrayIcon, AccountSystem, Registry, sCheckBox;


,lg


jaenicke - So 27.03.11 19:05

Dann poste doch einmal den gesamten Quelltext in der Datei...


chickenfigt1989 - So 27.03.11 19:07

Quelltext Form5:

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:
125:
126:
127:
unit Unit5;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, XPMan, ExtCtrls, jpeg, mmsystem, ComCtrls,
  sSkinManager, sButton, IdBaseComponent, IdComponent, IdTCPConnection,
  IdTCPClient, IdHTTP, IdAuthentication, Menus, URLMon, shellapi, JvGIF,
  JvComponentBase, JvTrayIcon, AccountSystem, Registry, sCheckBox;

  
type
  TForm5 = class(TForm)
    AccountSystemClient1: TAccountSystemClient;
    edtUsername: TEdit;
    edtPassword: TEdit;
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Button2: TButton;
    CheckBox1: TsCheckBox;
    procedure Button1Click(Sender: TObject);
    procedure AccountSystemClient1LoggedIn(
      AUserLevel: TAccountSystemUserLevel; AExpired: Boolean);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure SaveLoginData;
    procedure LoadLoginData;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form5: TForm5;
  implementation

uses Unit1, Unit2;

{$R *.dfm}

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


procedure TForm5.AccountSystemClient1LoggedIn(
  AUserLevel: TAccountSystemUserLevel; AExpired: Boolean);
begin
Form1.Caption := 'Farmerama Wecker Version 1.5 Herzlich Willkommen ' + Form5.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;



end;

procedure TForm5.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', Checkbox1.Checked);
      Reg.CloseKey;
    end;
  finally
    Reg.Free;
  end;
  SaveLoginData;
  
    end;




procedure TForm5.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');
      Checkbox1.Checked := Reg.ReadBool('AutoLogin');
      Reg.CloseKey;
    end;
  finally
    Reg.Free;
  end;
   end;
procedure TForm5.Button2Click(Sender: TObject);
begin
Application.terminate;
end;

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

end.


Lg


jaenicke - So 27.03.11 19:12

Und was hat die Unit jetzt mit dem Projektquelltext zu tun, in dem der Fehler auftritt? :gruebel: :autsch:


chickenfigt1989 - So 27.03.11 19:13

Hier tritt der Fehler auf:

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:
program Project1;

uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1},
  Unit2 in 'Unit2.pas' {Form2},
  Unit3 in 'Unit3.pas' {Form3},
  Unit4 in 'Unit4.pas' {Form4},
  Unit5 in 'Unit5.pas' {Form5};

{$R *.res}

begin
  Application.Initialize;
  Application.Title := 'Farmerama Wecker';
  Application.CreateForm(TForm2, Form2);
  Application.CreateForm(TForm5, Form5);
  IF Form5.Showmodal=ID_OK Then Begin
Form5.Free;
  Application.CreateForm(TForm1, Form1);
   Application.CreateForm(TForm3, Form3);
  Application.CreateForm(TForm4, Form4);
  Application.Run;
end.


jaenicke - So 27.03.11 19:18

Das heißt du hast dort wo die Unit gebraucht worden wäre, diese immer noch nicht in die Unit gepackt und wunderst dich dann, dass es immer noch nicht geht? Na, herzlichen Glückwunsch an dein logisches Denkvermögen... :roll:

Wie gesagt, schreib die Unit in die uses... in diesem Fall jetzt die Unit Windows...


chickenfigt1989 - So 27.03.11 19:20

Oke Dankeschön hab sie eingebunden.
Das programm startet jetzt nur wenn ich mich einlogge wird immernoch das Programm beendet
lg


jaenicke - So 27.03.11 19:25

Benenne halt erst einmal deine Formulare anständig, dann kann dir vielleicht auch jemand dabei helfen. :roll:


chickenfigt1989 - So 27.03.11 20:11

Hab ein anders Problem.
Hab auf der Login Form einen Button wo man sich registrieren kann.
Hab in den Button geschrieben:
frmNewUser.show;
Allerdings wenn ich das anklicken will kommt immer eine Access Violation.
Delphi hinterlegt folgendes in ROt:
IF Form5.Showmodal=mrOK Then Begin
Form1.Free;

lg


jaenicke - So 27.03.11 20:17

Weil das Formular da noch nicht erzeugt ist. Das ist ein Problem, weil du dich auf die automatische Erzeugung der Formulare durch Delphi verlässt anstatt das selbst zu machen.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
var 
  NewUserForm: TfrmNewUser;
begin
  NewUserForm := TfrmNewUser.Create(Self);
  try
    NewUserForm.ShowModal;
  finally
    NewUserForm.Free;
  end;


Wie du im Projektquelltext leicht siehst, wird dieses Formular ja erst nach dem Quelltext erzeugt, in dem du es verwendest.


Gausi - So 27.03.11 20:20

Ich möchte an der Stelle eine Verwarnung aussprechen:

Wenn hier nicht bald etwas mehr Eigeninitiative erkennbar wird, dann wird dieses Topic für 24h gesperrt, damit der Threadersteller etwas Zeit zum Nachdenken hat.

Bitte bei folgenden Antworten berücksichtigen. Danke.


chickenfigt1989 - So 27.03.11 20:28

Oke ich lass die Form jetzt selbst erstellen mit Klick auf den Button Neuer Benutzer.
Wie soll ich das dann mit den Code machen der beim Onklick ereigniss des Buttons auf der
Form NewUser ist? Kann ich den Drin lassen oder muss ich des irgendwie anders lösen?
lg


jaenicke - So 27.03.11 20:32

Der gehört da nicht hin, ganz einfach. Das Formular fragt die Daten vom Benutzer ab und gibt dir zurück, ob der Benutzer Ok geklickt hat. Eben in ModalResult.

Wenn er Ok geklickt hat, nimmst du die Daten aus dem Formular und machst damit etwas. Aber nicht in dem Code im Formular, sondern dort wo du das Formular aufgerufen hast.


chickenfigt1989 - So 27.03.11 20:40

Wenn ich auf den Button Neuen Benutzer klicke, wird die Form NewUser aufgerufen mit dem Code den du vorher gepostet hast. Das Formular wird aufgerufen und Funktioniert.
Allerdings wenn ich einen Neuen Benutzer anlegen will meckert der Compiler bei :

Delphi-Quelltext
1:
data.AddFormField('email', frmNewUser.edtMail.Text);                    

Und es kommt eine Access Violation
lg


HenryHux - So 27.03.11 20:44

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Vielleicht als Info: Der IQ des Nutzers sollte höher als die Compilerversion von Delphi sein

Ich glaube das sollte man glatt mal als Signatur nehmen :D :D


ALF - So 27.03.11 20:50

Auf welcher Form befindet sich was?

Delphi-Quelltext
1:
data.AddFormField('email', frmNewUser.edtMail.Text);                    
das ist bei Dir nie so richtig klar. Wie soll man da Helfen?
Und Access Violation sagt meistens das was nicht da ist!

ALf


chickenfigt1989 - So 27.03.11 21:13

Oke Habe nun auf meiner Login Form einen BUtton mit Neuer benutzer.
Da wenn man draufklickt wird die Form NewUser erstelllt mit :

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
var 
  NewUserForm: TfrmNewUser;
begin
  NewUserForm := TfrmNewUser.Create(Self);
  try
    NewUserForm.ShowModal;
  finally
    NewUserForm.Free;
  end;


Wenn ich nun auf den Button Neuer Benutzer klicke, kommt das gewünschte Formular.
Da wenn ich alles ausfülle und auf Benutzer anlegen klicke kommt eine Acces Violation wie in Sccreen gezeigt. und der Compiler färbt diese Zeile rot ein:


Delphi-Quelltext
1:
data.AddFormField('email', frmNewUser.edtMail.Text);                    


Dieser Code liegt auf der NewUser Form wenn man auf den Button Benutzer anlegen Klickt.

lg


Gausi - So 27.03.11 21:18

Ich mach hier jetzt mal zu. Du solltest dir einfach mal gründlich überlegen, was du da machst, und was für Formen du verwendest. Morgen abend gehts hier weiter.