Delphi-PRAXiS
Seite 2 von 3     12 3      

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)

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:51 Uhr.
Seite 2 von 3     12 3      

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