Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi INI-Eintrag vergleichen? (https://www.delphipraxis.net/107254-ini-eintrag-vergleichen.html)

Störtebeker 24. Jan 2008 20:01


INI-Eintrag vergleichen?
 
Hi,

ich habe mir mal die Sachen mit den INIs durchgelesen und dachte mir,
dass ich so auch die Loginabrage für mein Programm realisieren könnte.

Folgendes Schema:
Beim ersten Start des Programmes kommt eine Abrage mit Benutzername
und Passwort. Wenn beide Felder gefüllt sind und auf Ok geklickt wird,
soll ein INI-Eintrag mit Benutzername und Passwort erstellt werden.
Beim nächsten Start des Programmes soll die eigentliche Loginabfrage
kommen, sofern eine INI erstellt wurde. Ist dies nicht der Fall, soll
erneut die "Registrierungabfrage" kommen.

So, zurück zum Login: Nachdem der Benutzer seine Angaben getätigt hat
und auf "Anmelden" klickt, sollen die Werte der Editfelder mit dem
Eintrag der INI verglichen werden und wenn die Werte stimmen, soll das
Programm gestartet werden. Sonst soll eine Fehlermeldung kommen.

Ich glaube, dass ich mit dem Eintragen und Erstellen der INI nicht so
große Probleme haben werde.

ABER:[*] Wie mache ich das, dass bei Programmstart geprüft wird, ob die INI
vorhanden ist und dass dann entweder erneut das
"Registrierungsfenster"(INI exisitert nicht), oder das "Loginfenster"(INI existiert)
kommt?
[*] Und wie muss die IF-Abrage für den Vergleich aussehen?

----------------------------------------------------------------------------------------------------

P.S.: Unkompliziertere Methoden sind natürlich auch erwünscht.

lbccaleb 24. Jan 2008 20:04

Re: INI-Eintrag vergleichen?
 
meinst du sowas hier??
das trägst du dann in oncreate methode der form ein..

Delphi-Quellcode:

if fileexists('meineini.ini') then
  (springe zum Loginfenster)
else (springe zum Registrierungsfenster);

Matze 24. Jan 2008 20:04

Re: INI-Eintrag vergleichen?
 
Hallo,

ähm mittels Delphi-Referenz durchsuchenFileExists kannst du überprüfen, ob eine Datei existiert. Zum Vergleichen der Daten musst du lediglich Name + Passworthash aus der Ini lesen, den Hash des im Formular eingegebenen Passworts generieren und vergleichen (if-Abfrage).

Ich hoffe, ich habe dich richtig verstanden.

Gruß

Störtebeker 29. Jan 2008 22:07

Re: INI-Eintrag vergleichen?
 
Hallo,

also, das Erstellen der INI funzt, wie gewünscht. Nun setzte ich in das "OnCreate" Ereignis folgendes:

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
if fileexists(ExtractFilePath(ParamStr(0))+'ua44.ini') then
Form2.show//Login-Fenster
else
Form1.show;//Registrierungs-Fenster
end;
Nun kommt aber beim Start des Programmes (INI ist vorhanden) eine AccessViolation...

Zitat:

Project Project1.exe raised exception class EAccessViolation with message 'Access Violation at adress 0044A49E in module
'Project1.exe'. Read of adress...
Der Code zum erstellen der INI sieht folgendermasßen aus:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  Ini: TIniFile;
begin
Ini:=TIniFile.Create(ExtractFilePath(ParamStr(0))+'ua44.ini');
try
Ini.WriteString('User','Name', Edit1.Text);
Ini.WriteString('Password','Password', Edit2.Text);
finally
FreeAndNil(Ini);
end;
Form3.showmodal;
end;
Die Form3 ist einfach nur ein Hinweisfenster, dass das Programm neu gestartet werden muss.

Bitte helft mir...

marabu 30. Jan 2008 06:32

Re: INI-Eintrag vergleichen?
 
Moin,

deine Access Violation rührt wahrscheinlich daher, dass zum Zeitpunkt von Form1Create Form2 noch nicht erzeugt wurde, du aber bereits eine Methode der nicht vorhandenen Instanz aufrufst.

Du solltest deine Login- und Register-Dialoge von dem Form-Handling der Application abkoppeln. Ich würde eine eigene Unit vorsehen, in deren Initialisierungsabschnitt die Registrierung und das Login stattfinden kann, bevor die MainForm sichtbar wird.

Grüße vom marabu

peschai 30. Jan 2008 07:34

Re: INI-Eintrag vergleichen?
 
Hallo

Wie Marabu schon anmerkt ...

Mache so etwas nicht im FormCreate, Das solltest du nur für initialisierungen verwenden, aber keine Programmlogik, da hier erst noch "aufgebaut wird".
Besser im FormShow oder noch besser im FormActivate. Aber hier Achtung, diese können mehrfach aufgerufen werden. FormActivate jedesmal wenn du dein Programm aktvierst, also bei einem anderen Programm warst z.b. WindowsExplorer.
Ich verwende in FormAktivate zumeist ein extra angelegte Variable in der Form, worin ich mir Merke ob ich schon einmal hier war

Delphi-Quellcode:
type
  TfrmMain = class(TForm)
    ...
  private
    { Private-Deklarationen }
    oAlreadyActivated : Boolean;
    ...
  public
    { Public-Deklarationen }
    ...
  end;

procedure TfrmMain.FormCreate(Sender: TObject);
begin
  ...
  oAlreadyActivated := False;
  ...
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
  if Not(oAlreadyActivated) then
    begin
      oAlreadyActivated := True;
      // Do your one time activation issues here ...
      ...
    end;
  ...
end;

Störtebeker 30. Jan 2008 10:26

Re: INI-Eintrag vergleichen?
 
Hi nochmal,

sry. für die vielleicht "eigentlich" einfache Frage:

Ich habe jetzt

Delphi-Quellcode:
procedure TForm1.FormActivate(Sender: TObject);
begin
if fileexists(ExtractFilePath(ParamStr(0))+'ua44.ini') then
Form2.show//Login-Fenster
else
Form1.show;//Registrierungs-Fenster
end;
den Code ins FormActivate Ereignis gesetzt. Nun ist es bei dem Code so, dass beide Formen angezeigt werden, das Login-Fenster kommt.
Wenn ich nun dazuschreibe:

Delphi-Quellcode:
procedure TForm1.FormActivate(Sender: TObject);
begin
if fileexists(ExtractFilePath(ParamStr(0))+'ua44.ini') then
begin
Form2.show;//Login-Fenster
Form1.hide
end
else begin
Form1.show;//Registrierungs-Fenster
end;
end;
kommt Delphi mit der Meldung
Zitat:

...Cannot change Visible in onShow or onHide...
Habe es auch schon mit:
Delphi-Quellcode:
Form1.visible:=false;
versucht -> gleicher Fehler.

P.S.:
Gibt es in der DP eigentlich eine Rubrik, wo häufige Fehler beschrieben sind, um solche Fragen auszuschließen?

Störtebeker 30. Jan 2008 18:35

Re: INI-Eintrag vergleichen?
 
So, ich habe es jetzt etwas umständlich und nicht wirklich "perfekt" realisiert.

Ich habe die Loginform einfach etwas größer gemacht, als die Reg-Form, sodass die Reg-Form hinter der Loginform verschwindet und so nicht sichtbar ist.

Nun kommt die IF-Abfrage, bei der ich jetzt wieder scheitere:

Folgendes habe ich versucht, ohne erfolg:

Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject;);
var
  Ini: TIniFile;
begin
if
Edit1.Text:=Ini.ReadString('User', 'Name', '') AND
Edit2.Text:=Ini.ReadString('Password', 'Password', '')
then begin
Form4.ShowModal;
Form2.Hide;
Form1.hide;
end;
end;
Please help....

Ein Vorschlag zu meinem vorherigen, geposteten Problem mit dem "Cannot change visible..." wäre auch sehr hilfreich.

Danke schonmal im Voraus.

Apollonius 30. Jan 2008 19:28

Re: INI-Eintrag vergleichen?
 
In Pascal-Dialekten werden Vergleiche mit '=' durchgeführt, nur Zuweisungen mit ':='. :roll:

Störtebeker 30. Jan 2008 20:49

Re: INI-Eintrag vergleichen?
 
Wenn ich die ":" vor den "=" wegnehme, setzt Delphi den Cursor vor das "=" und mit:

Zitat:

[Error] Operator not applicable to this operand type
>> Mit den Doppelpunkten, kommt dieser Fehler bei dem "THEN BEGIN"


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:25 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz