![]() |
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. |
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); |
Re: INI-Eintrag vergleichen?
Hallo,
ähm mittels ![]() Ich hoffe, ich habe dich richtig verstanden. Gruß |
Re: INI-Eintrag vergleichen?
Hallo,
also, das Erstellen der INI funzt, wie gewünscht. Nun setzte ich in das "OnCreate" Ereignis folgendes:
Delphi-Quellcode:
Nun kommt aber beim Start des Programmes (INI ist vorhanden) eine AccessViolation...
procedure TForm1.FormCreate(Sender: TObject);
begin if fileexists(ExtractFilePath(ParamStr(0))+'ua44.ini') then Form2.show//Login-Fenster else Form1.show;//Registrierungs-Fenster end; Zitat:
Delphi-Quellcode:
Die Form3 ist einfach nur ein Hinweisfenster, dass das Programm neu gestartet werden muss.
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; Bitte helft mir... |
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 |
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; |
Re: INI-Eintrag vergleichen?
Hi nochmal,
sry. für die vielleicht "eigentlich" einfache Frage: Ich habe jetzt
Delphi-Quellcode:
den Code ins FormActivate Ereignis gesetzt. Nun ist es bei dem Code so, dass beide Formen angezeigt werden, das Login-Fenster kommt.
procedure TForm1.FormActivate(Sender: TObject);
begin if fileexists(ExtractFilePath(ParamStr(0))+'ua44.ini') then Form2.show//Login-Fenster else Form1.show;//Registrierungs-Fenster end; Wenn ich nun dazuschreibe:
Delphi-Quellcode:
kommt Delphi mit der Meldung
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; Zitat:
Delphi-Quellcode:
versucht -> gleicher Fehler.
Form1.visible:=false;
P.S.: Gibt es in der DP eigentlich eine Rubrik, wo häufige Fehler beschrieben sind, um solche Fragen auszuschließen? |
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:
Please help....
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; Ein Vorschlag zu meinem vorherigen, geposteten Problem mit dem "Cannot change visible..." wäre auch sehr hilfreich. Danke schonmal im Voraus. |
Re: INI-Eintrag vergleichen?
In Pascal-Dialekten werden Vergleiche mit '=' durchgeführt, nur Zuweisungen mit ':='. :roll:
|
Re: INI-Eintrag vergleichen?
Wenn ich die ":" vor den "=" wegnehme, setzt Delphi den Cursor vor das "=" und mit:
Zitat:
|
Re: INI-Eintrag vergleichen?
Zitat:
|
Re: INI-Eintrag vergleichen?
Moin, Moin.
Ist der Fehler nicht hier zu suchen: Zitat:
Delphi-Quellcode:
oder?
if (Edit1.Text=Ini.ReadString('User', 'Name', '')) AND
(Edit2.Text=Ini.ReadString('Password', 'Password', '')) then begin //... //.. |
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:
|
Re: INI-Eintrag vergleichen?
Moin, Moin.
Na, die Fehlermeldung war schon zu erwarten...
Delphi-Quellcode:
In deinem letzten Codeschnipsel fehlen das INI.Create und die try-finally-Abschnitte. Schau mal in die vorherigen Texte, da steht eigentlich alles drin...
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; Gruß Ralph |
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:
So, nun die Frage, wie ist das mit dem IF, hier als "Kommentar" hinzugefügt
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; 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. |
Re: INI-Eintrag vergleichen?
Zitat:
![]() |
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] |
Re: INI-Eintrag vergleichen?
Zitat:
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:
Dort musst du nun einsteigen:
begin
Application.Initialize; [...] Application.Run; end;
Delphi-Quellcode:
FileExists benötigt SysUtils, also müssen wir die unter Uses einbinden:
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;
Delphi-Quellcode:
Übrigens könnten manche sagen, das sein nicht perfekt, aber ich denke es ist verständlichsten, was wohl eher das Problem ist.
uses
SysUtils, [...]; Application.FormCreate macht übrigens was ähnliches wie du bei TIniFile machen musst:
Delphi-Quellcode:
Diese Funktion mach aber darüberhinaus auch ein paar andere sachen ;)
<Erster Übergabeparamter> := <Zweiter Übergabeparameter>.Create([...]);
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! |
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" |
Re: INI-Eintrag vergleichen?
Zitat:
Du erstellst nämlich nur die Form, die du benötigst ;) MfG xZise |
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:
"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:
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. mfG Störtebeker |
Re: INI-Eintrag vergleichen?
Zitat:
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:
Wo hört die Prozedur auf? Beim vorletzen end; (Markieren um Lösung anzuzeigen)
procedure ....
begin if a = b then begin Showmessage(); end; end; [...] end; |
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