Delphi-PRAXiS

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"

Hansa 30. Jan 2008 21:32

Re: INI-Eintrag vergleichen?
 
Zitat:

Zitat von Apollonius
In Pascal-Dialekten werden Vergleiche mit '=' durchgeführt, nur Zuweisungen mit ':='. :roll:

Er wollte dir damit lediglich sagen, dass das eine AND da nicht hingehört. 8)

taaktaak 30. Jan 2008 21:37

Re: INI-Eintrag vergleichen?
 
Moin, Moin.

Ist der Fehler nicht hier zu suchen:
Zitat:

if
Edit1.Text:=Ini.ReadString('User', 'Name', '') AND
Edit2.Text:=Ini.ReadString('Password', 'Password', '')
then begin
Es muss doch so aussehen...
Delphi-Quellcode:
if (Edit1.Text=Ini.ReadString('User', 'Name', '')) AND
   (Edit2.Text=Ini.ReadString('Password', 'Password', '')) then begin
          //...
          //..
oder?

Störtebeker 30. Jan 2008 21:46

Re: INI-Eintrag vergleichen?
 
Danke, taaktaak. Jetzt startet das Programm schonmal, aber es scheint jetzt einen anderen Fehler zu geben, denn nun wird mir die folgende Fehlermeldung "vor die Augen geworfen":

Zitat:

Project Project1.exe raised exception class EAccessViolation with message 'Access violation at adress 004536AA in module Project1.exe' Read of adress...
Wat nu?

taaktaak 31. Jan 2008 08:46

Re: INI-Eintrag vergleichen?
 
Moin, Moin.

Na, die Fehlermeldung war schon zu erwarten...

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;
In deinem letzten Codeschnipsel fehlen das INI.Create und die try-finally-Abschnitte. Schau mal in die vorherigen Texte, da steht eigentlich alles drin...
Gruß Ralph

Störtebeker 31. Jan 2008 15:18

Re: INI-Eintrag vergleichen?
 
Erstmal Danke für die Hinweise. Jetzt aber nochmal eine Verständnisfrage:

Ich will ja aus der INI lesen, dass heißt, sie ist bereits vorhanden. Und trotzdem das "Ini.Create"??

Code:

Delphi-Quellcode:
 procedure TForm2.Button1Click(Sender: TObject);
var
  Ini: TIniFile;
begin
//If
Ini:=TIniFile.Create(ExtractFilePath(ParamStr(0))+'ua44.ini');
try
(Edit1.Text=Ini.ReadString('User', 'Name', '')) AND
(Edit2.Text=Ini.ReadString('Password', 'Password', ''))
finally
FreeAndNil(Ini);
end;
//then begin
Form4.ShowModal;
Form2.Hide;
Form1.hide;
end;
So, nun die Frage, wie ist das mit dem IF, hier als "Kommentar" hinzugefügt

Wie ich vielleicht vorher hätte sagen sollen, sind die INIs "Neuland" für mich und daher muss ich öffters mal nachfragen. :oops:
Naja, das mit dem Erstellen der INI mit "WriteString..." ging zwar gnz gut. Aber jetzt beim Auslesen hängt es halt. SRY.

Die Muhkuh 31. Jan 2008 15:20

Re: INI-Eintrag vergleichen?
 
Zitat:

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

Klar

DeddyH 31. Jan 2008 15:21

Re: INI-Eintrag vergleichen?
 
TIniFile ist eine Klasse und muss daher erst instanziiert werden, deshalb ist das Create notwendig.

[edit] @Manuel :lol: , Spaßvogel :zwinker: [/edit]

xZise 31. Jan 2008 17:31

Re: INI-Eintrag vergleichen?
 
Zitat:

Zitat von Störtebeker
Erstmal Danke für die Hinweise. Jetzt aber nochmal eine Verständnisfrage:

Ich will ja aus der INI lesen, dass heißt, sie ist bereits vorhanden. Und trotzdem das "Ini.Create"??

Naja, da es sich bei Delphi um eine Objekt orientierte Sprache handelt, gibt es Objekte, die Dinge auslagern und kapseln, damit der Programmierer nachher sich nur noch um seine Arbeit kümmern muss.
Nun wenn du "Ini : TIniFile" deklarierst, dann sagst du damit Delphi, dass hier ein Objekt ist. Normalerweise zeigt dieses Objekt aber ins nil (not in list, oder auch latein für "nichts"). Deshalb muss du das Objekt erstellen.
Du kannst dir das so vorstellen, wir haben 2 GB (oder mher, je nach Betriebssystem) Knetmasse ^^, den sogenannten Arbeitsspeicher.
Und du hast eine Schablone oder Form, das sogenannte TIniFile.
Und für die Variable haben wir einen Teller.
Nun ist der Teller beim Programmstart normalerweise leer (nur abgeswaschen muss er nicht sein ;) ).
Wenn du nun z.B. die Farbe oder die Besonderheiten wissen willst, bekommst du eine EAccessViolation ("Zugriffsverletzung"), da du nicht auf die Eigenschaften zugreifen kannst.
Deshalb erstellst du dein Objekt.
Also nimmst du dir einen Klumpen Arbeitsspeicher und stechst das aus mithilfe der Form.
Das ist das erstellen eines Objektes: <Objektvariable> := <Objektklasse>.Create[...]
Jetzt kannst z.B. die Knete anmalen, oder verzieren.

Das heißt, ein TIniFile.Create heißt nicht zwingend das die Datei erstellt wird, sondern, dass das Objekt erstellt wird.

Übrigens die Sache wegen der Zwei Formulare.

Da kannst du verschiedenen Ansätzen folgen, welche aber an sich ähnlich sind:
Und zwar testest du, bevor du etwas erstellst, ob die Datei existiert.

Ich hätte es jetzt im Projektcode gemacht.
Also Quelltext des Projektes öffnen, und dann sollte dort sowas stehen:
Delphi-Quellcode:
begin
  Application.Initialize;
  [...]
  Application.Run;
end;
Dort musst du nun einsteigen:
Delphi-Quellcode:
begin
  Application.Initialize;
  // Alles was hier stand auskommentieren!

  // Nun testen, ob die Datei vorhanden ist:
  if FileExists(...) then
  // Wenn die Datei existiert: Loginfenster erstellen
    Application.FormCreate({Hier musst du nun Form1 o.ä. reinschreiben}, {Hier das ganze mit einem T davor})
  else
  // Ansonsten das Registierungsfenster erstellen
    Application.FormCreate({Hier musst du nun Form1 o.ä. reinschreiben}, {Hier das ganze mit einem T davor})
  Application.Run;
end;
FileExists benötigt SysUtils, also müssen wir die unter Uses einbinden:
Delphi-Quellcode:
uses
  SysUtils,
  [...];
Übrigens könnten manche sagen, das sein nicht perfekt, aber ich denke es ist verständlichsten, was wohl eher das Problem ist.

Application.FormCreate macht übrigens was ähnliches wie du bei TIniFile machen musst:
Delphi-Quellcode:
<Erster Übergabeparamter> := <Zweiter Übergabeparameter>.Create([...]);
Diese Funktion mach aber darüberhinaus auch ein paar andere sachen ;)

Nun sollte es funktionieren.
Aber nicht vergessen: Das, was du vorher hattest, dann löschen (oder wenn du dir nicht sicher bist: auskommentieren).

MfG
xZise

PS: Ich hoffe ich konnte helfen!

Störtebeker 31. Jan 2008 20:27

Re: INI-Eintrag vergleichen?
 
Danke, xZise für die deine Idee, wird dadurch möglicherweise auch mein Problem mit dem "Cannot change visible..." gelöst?

Dank der vielen hilfreichen Tipps funktioniert das mit der INI mitlerweile.

Das einzige was jetzt noch stört ist der besagte Fehler mit dem "Visible"

xZise 31. Jan 2008 21:17

Re: INI-Eintrag vergleichen?
 
Zitat:

Zitat von Störtebeker
Danke, xZise für die deine Idee, wird dadurch möglicherweise auch mein Problem mit dem "Cannot change visible..." gelöst?

Jap genau:
Du erstellst nämlich nur die Form, die du benötigst ;)

MfG
xZise

Störtebeker 31. Jan 2008 22:07

Re: INI-Eintrag vergleichen?
 
Jo, xZise, :thumb: :thumb: (Ich glaube ich brauche nicht schreiben, was ich damit meine).

Es funzt super, nur musste ich den Code etwas umändern, als du es vorgeschlagen hast (minimal):

Delphi-Quellcode:
begin
  Application.Initialize;
  if FileExists(ExtractFilePath(ParamStr(0))+'...') then begin
  Application.CreateForm(TForm2, Form2);
  end
  else begin
  Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TForm3, Form3);
  end;
  Application.Run;

end.
"Die Form mit dem T, also TForm, gehört vor das Komma, das Form ohne T gehört dann hinter das Komma. Und ich musste aus "THEN" --> "THEN BEGIN" machen, aus dem "ELSE" ein "ELSE BEGIN" und die entsprechenden "ENDs" dazufügen. Aber es geht und daswegen nochmal: :thumb:

mfG
Störtebeker

xZise 1. Feb 2008 14:28

Re: INI-Eintrag vergleichen?
 
Zitat:

Zitat von Störtebeker
[...]"Die Form mit dem T, also TForm, gehört vor das Komma, das Form ohne T gehört dann hinter das Komma. Und ich musste aus "THEN" --> "THEN BEGIN" machen, aus dem "ELSE" ein "ELSE BEGIN" und die entsprechenden "ENDs" dazufügen. Aber es geht und daswegen nochmal: :thumb:[...]

Okay, ich war mir da nicht sicher ;)
Und mit den begin und ends sehe ich eigentlich so als selbstverständlich ;)

MfG
xZise

PS: Ich nerv auch meine Mitschüler damit, aber ich würde wenigstens ein bisschen einrücken ;) Das spart unnötige Fehlersuche:
Delphi-Quellcode:
procedure ....
begin
if a = b then
begin
  Showmessage();
end;
end;
[...]
end;
Wo hört die Prozedur auf? Beim vorletzen end; (Markieren um Lösung anzuzeigen)

pilic 16. Feb 2008 18:46

Re: INI-Eintrag vergleichen?
 
Antowrt kommt zwar ziemlich spät, aber du musstest begin und end nur einfügen, weil vor einem else kein Semikolon stehen darf.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:58 Uhr.

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