Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Delphi 5: Problem mit Create bei Ini-Datei... (https://www.delphipraxis.net/134665-delphi-5-problem-mit-create-bei-ini-datei.html)

Fussel9 26. Mai 2009 18:27


Delphi 5: Problem mit Create bei Ini-Datei...
 
Hi, dickes Problem:
Ich bin noch Schüler und habe deshalb nur Delphi5...
Ich wollte für ein Objekt eine Ini-Datei anlegen, damit ich Integer Werte beim Schließen speichern und beim Laden einlesen kann, das Programm soll transportabel sein, daher Ini...

jetzt bekomme ich aber immer direckt nen Fehler wenn ich folgende Zeile rein setze:

Delphi-Quellcode:
constructor Create(const FileName String);
die Zeile ist original aus der Delphi Hilfe... Hab auch schon String durch Integer ersetzt aber selbes Problem, es geht ihm gar nicht um String/Integer er sagt: Undefinierter Bezeichner Create...

Bei der Gelegenheit: Ist es entscheident wo der constructor steht?


Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, jpeg, ExtCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    Image1: TImage;
    Timer1: TTimer;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

var ax,ay :Integer;

var a : Integer;

{$R *.DFM}
constructor Create(const FileName String);

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
Button1.visible:=FALSE;
Button2.visible:=FALSE;
Button3.visible:=FALSE;
Button4.visible:=TRUE;
Button5.visible:=FALSE;
Button6.visible:=FALSE;
Timer1.Enabled:=True;
ax:=543;
ay:=303;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Button1.visible:=FALSE;
Button2.visible:=FALSE;
Button3.visible:=FALSE;
Button4.visible:=FALSE;
Button5.visible:=TRUE;
Button6.visible:=FALSE;
Timer1.Enabled:=True;
ax:=591;
ay:=351;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
Button1.visible:=FALSE;
Button2.visible:=FALSE;
Button3.visible:=FALSE;
Button4.visible:=FALSE;
Button5.visible:=FALSE;
Button6.visible:=TRUE;
Timer1.Enabled:=True;
ax:=623;
ay:=383;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var x , y :Integer;
begin
Randomize;
x:=Random(ax);
y:=Random(ay);
if Button4.visible=True then
begin
  Button4.Left:=x;
  Button4.Top:=y;
end
else
if Button5.visible=True then
begin
  Button5.Left:=x;
  Button5.Top:=y;
end
else
begin
  Button6.Left:=x;
  Button6.Top:=y;
end;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
Timer1.Enabled:=False;
ShowMessage('You Won!');
Button1.visible:=TRUE;
Button2.visible:=TRUE;
Button3.visible:=TRUE;
Button4.visible:=FALSE;
Button5.visible:=FALSE;
Button6.visible:=FALSE;
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
Timer1.Enabled:=False;
ShowMessage('You Won!');
Button1.visible:=TRUE;
Button2.visible:=TRUE;
Button3.visible:=TRUE;
Button4.visible:=FALSE;
Button5.visible:=FALSE;
Button6.visible:=FALSE;
end;

procedure TForm1.Button6Click(Sender: TObject);
begin
Timer1.Enabled:=False;
ShowMessage('You Won!');
Button1.visible:=TRUE;
Button2.visible:=TRUE;
Button3.visible:=TRUE;
Button4.visible:=FALSE;
Button5.visible:=FALSE;
Button6.visible:=FALSE;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
a := ReadInteger('Abschnitt1','Anzahl',0);
a := a+1;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ini.WriteInteger('Abschnitt1','Anzahl',a);
end;

end.

DeddyH 26. Mai 2009 18:31

Re: Delphi 5: Problem mit Create bei Ini-Datei...
 
Der Konstruktor muss schon in der Klassendeklaration deklariert werden. Aber Du könntest doch das FormCreate-Ereignis benutzen, um die Ini zu erzeugen und diese im OnDestroy-Ereignis wieder freigeben.

Fussel9 26. Mai 2009 18:38

Re: Delphi 5: Problem mit Create bei Ini-Datei...
 
Könntest du mir das bitte genauer erklären, kenne mich da gar nicht aus...

soll ich das einfach nur vor implementation setzen oder das hinter type???

bzw. meinst du gar nicht diese unit? aber wenn nicht wie springe ich in Delphi 5?

quendolineDD 26. Mai 2009 18:43

Re: Delphi 5: Problem mit Create bei Ini-Datei...
 
Um den Konstruktor nutzen bzw. zu verändern zu können musst du das in der Implementation der Klasse ändern. Quasi dir eine eigene Klasse erzeugen.
TForm stellt jedoch genug Optionen zur Verfügung, welche du nutzen kannst. Die Ini-Datei kannst du zum Beispiel im OnCreate-Ereignis deiner Form nutzen und diese im OnDestroy-Ereignis wieder freigeben.

DeddyH 26. Mai 2009 18:43

Re: Delphi 5: Problem mit Create bei Ini-Datei...
 
Delphi-Quellcode:
type
  TMyClass = class
  private
    //...
  protected
    //...
  public
    constructor Create(Parameter: Typ); //hier wird der Konstruktor deklariert
  end;

implementation

//und hier implementiert
constructor TMyClass.Create(Parameter: Typ);
begin
  inherited Create;
  //weiterer Code
end;
Ein Konstruktor ist eine spezielle Methode einer Klasse, daher muss er auch zu dieser Klasse gehören und kann nicht einfach irgendwo in den Quelltext geschrieben werden.

Helmi 26. Mai 2009 18:47

Re: Delphi 5: Problem mit Create bei Ini-Datei...
 
Hallo,

ich denke Fussel braucht etwas so was hier

Satty67 26. Mai 2009 18:51

Re: Delphi 5: Problem mit Create bei Ini-Datei...
 
Schießt Ihr nicht alle etwas weit über das Ziel hinaus?

Der Thread-Starter will doch nur auf eine INI-Datei zugreifen, oder?
Delphi-Quellcode:
uses
  ...INIFiles...

[...Form...]
  private
    { Private-Deklarationen }
    INI : TINIFile;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

TForm1.FormCreate(Sender: TObject);
begin
  INI := TIniFile.Create('myInifile.ini'); // nur mal so als Beispiel
[...]
€: OK, Helmi sieht es zum Glück auch so... wieso hatte ich keine rote Box?
€2: DeddyH erst auch, ist aber dann auf den anderen Zug aufgesprungen

quendolineDD 26. Mai 2009 18:52

Re: Delphi 5: Problem mit Create bei Ini-Datei...
 
Ihm fehlt ja aber jegliches grundlegendes Verständnis für den Aufbau einer Klasse und der Deklaration von Methoden und Funktionen.
Zitat:

Schießt Ihr nicht alle etwas weit über das Ziel hinaus?
Dito.
Das meinte ich ja auch oben als ich DeddyH's Beitrag verdeutlichte.

DeddyH 26. Mai 2009 18:59

Re: Delphi 5: Problem mit Create bei Ini-Datei...
 
Ich wollte ihm doch nur klarmachen, was ein Konstruktor ist. Dass er gar keinen braucht, steht doch schon in meiner ersten Antwort.

Satty67 26. Mai 2009 19:02

Re: Delphi 5: Problem mit Create bei Ini-Datei...
 
War ja auch auf keinen Fall böse gemeint, aber in Post #3 siehst Du, was Du angerichtet hast :stupid:

mkinzler 26. Mai 2009 19:07

Re: Delphi 5: Problem mit Create bei Ini-Datei...
 
Zitat:

Zitat von Satty67
War ja auch auf keinen Fall böse gemeint, aber in Post #3 siehst Du, was Du angerichtet hast :stupid:

Er hat doch nur seine offensichtliche Lücken offengelegt

Fussel9 26. Mai 2009 20:01

Re: Delphi 5: Problem mit Create bei Ini-Datei...
 
ok ok ok.... alles klar,
ich weiß was eine Klasse ist,

Delphi-Quellcode:
type
 TRaum = class
   Beschreibung : String;
   Raumname : String;
   Gegenstand : String;
   Gegenstand2 : String;
   Gegenstand3 : String;
   Vor,Links,Rechts,Zurueck : TRaum;
   procedure setAusgaenge(vor,links,rechts,zurueck :TRaum);
 end;
aber ich habe keinen Plan vom speichern.

Ich habe noch nie einen Speicher gebraucht, heute habe ich angefangen mich langsam da reinzulesen, über ein Buch und die Delphi Hilfe...

Die Delphi Hilfe meint ich brauche einen constructor( Ja ich weiß nicht was ein constructor ist... denn auch den habe ich noch NIE benutzt) , ihr meint ich brauche keinen ...

Meine erste Frage: Wo ist die Klasse TIniFile oder TMemIniFile deklariert???
Und Zweitens: Wie kann ich ohne einen constructor arbeiten? Der constructor scheint ja so zu sagen der Zementmischer zu sein und Create(.....) ist das Wasser und das Zementpulver, was herrauskommt kann ich verbauen oder???

Ich meine ich muss erstmal Zement herstellen bevor ich ihn benutzen kann...

Helmi 26. Mai 2009 20:03

Re: Delphi 5: Problem mit Create bei Ini-Datei...
 
hast du dir mal meinen Link angeschaut?
dort ist alles klar beschrieben, wie man eine Ini-Datei erzeugt und Daten/Werte speichert und liest.

DP-Maintenance 26. Mai 2009 20:09

DP-Maintenance
 
Dieses Thema wurde von "mkinzler" von "Datenbanken" nach "Object-Pascal / Delphi-Language" verschoben.
Eien Ini ist keine datenbank. Zudem hat der Thread nun auch nur noch am Rand mit Inifiles zu tun

Fussel9 26. Mai 2009 20:11

Re: Delphi 5: Problem mit Create bei Ini-Datei...
 
Ja dein Link ist wirklich sehr hilfreich danke dafür, aber was bedeutet:
Delphi-Quellcode:
finally
    ini.Free;

und was:


Delphi-Quellcode:
mtInformation

Wo ist dort die Klasse deklariert und wo ist dort ein constructor, bzw. warum wird er nicht benötigt...

muss ich IniFile bei uses selbst einragen?


Und vorallem muss ich die Ini jedes mal neu erstellen wenn ich sie lesen will:

Delphi-Quellcode:
procedure TForm1.Button4Click(Sender: TObject);
var
  ini: TIniFile;
begin
  ini: = TIniFile.Create('WIN.INI');
  try
    ini.ReadSection('Desktop', ListBox1.Items);
  finally
    ini.Free;
  end;
end;
überschreibt das nicht die Ini und somit die darin gespeicherten Daten?

Satty67 26. Mai 2009 20:15

Re: Delphi 5: Problem mit Create bei Ini-Datei...
 
Zitat:

Zitat von Fussel9
muss ich IniFile bei uses selbst einragen?

IniFiles muss Du selber eintragen.

Nur beim Setzen von Komponenten werden i.d.R. die benötigten Units automatisch eingetragen.

mtInformation ist einer der möglichen MessageDlg-Typen. hat im Prinzip mit den INI-Files nichts zu tun, war nur zur Anzeige der Daten.

btw.
Welche Delphi Version verwendest Du? Schon mal daran gedacht, die unbekannten Bezeichner in der Hilfe deines Delphi einzutippen? Die dort gegebenen Beschreibungen sind oft (nicht immer) umfangreich und genau.

mkinzler 26. Mai 2009 20:18

Re: Delphi 5: Problem mit Create bei Ini-Datei...
 
Du solltest dir wirklich ertmal duie Grundlagen anschauen. Zudem gibt es ein F1-Taste, welche dir unbekannte Methoden erklärt.
Mit etwas Englishkenntnissen lässt sich die Funktion der Methode .Free() aber auch so erahnen.

Fussel9 26. Mai 2009 20:22

Re: Delphi 5: Problem mit Create bei Ini-Datei...
 
Sorry aber ich kann mir echt nicht denken was da Befreit werden soll? Oder soll es eine art Clear sein?

mkinzler 26. Mai 2009 20:25

Re: Delphi 5: Problem mit Create bei Ini-Datei...
 
Nein, ist eine Methode der Basisklasse TObject, welche die Instanz aufräumt und dann durch Aufruf des Destruktors freigibt.( Man ruft diesen nie direkt sondern diese Methode auf)

Fussel9 26. Mai 2009 20:28

Re: Delphi 5: Problem mit Create bei Ini-Datei...
 
ah ok und warum ist bei dem Beispiel kein constructor nötig?

das wäre dann auch meine letzte Frage :oops:

mkinzler 26. Mai 2009 20:34

Re: Delphi 5: Problem mit Create bei Ini-Datei...
 
Weil es auch über die Spezielle Eventmethode geht.

Zitat:

das wäre dann auch meine letzte Frage Embarassed
Wenn du weitere Fragen hast, kannst du diese gerne stellen. Dann aber in einem separaten Thread.

Satty67 26. Mai 2009 20:35

Re: Delphi 5: Problem mit Create bei Ini-Datei...
 
constructor ist (banal ausgedrückt) eine procedure mit spezieller Funktion und typischerweise dem Namen create. Der Ausdruck constructor ist in der Klasse definiert und kann Dir bei der Anwendung der (fremden) Klasse soweit mal egal sein.
Delphi-Quellcode:
ini := TIniFile.Create('c:\MyIni.ini');
Die Methode constructor wurde hier mit Create aufgerufen.

Fussel9 26. Mai 2009 20:37

Re: Delphi 5: Problem mit Create bei Ini-Datei...
 
Viellen Dank an alle die mir geholfen haben, stelle mein fertiges Spiel demnächst mal ins Netz, ist nur ein Fang den Button, aber das Speichern brauche ich für eine Art Tamagotschi also viellen Dank.
:thumb:

guidok 27. Mai 2009 08:07

Re: Delphi 5: Problem mit Create bei Ini-Datei...
 
Zitat:

Zitat von Fussel9
ok ok ok.... alles klar,
ich weiß was eine Klasse ist,

Delphi-Quellcode:
type
 TRaum = class
   Beschreibung : String;
   Raumname : String;
   Gegenstand : String;
   Gegenstand2 : String;
   Gegenstand3 : String;
   Vor,Links,Rechts,Zurueck : TRaum;
   procedure setAusgaenge(vor,links,rechts,zurueck :TRaum);
 end;
Wie kann ich ohne einen constructor arbeiten?

Auch hier gibt es einen constructor.

Die in deinem Beispiel deklarierte Klasse ist (da du keinen Vorgänger hinter "class" angegeben hast) ein Nachkomme von TObject und erbt damit den dort deklarierten constructor. Diesen constructor könntest du in deiner Klasse überschreiben (wenn es notwendig ist) oder auch nicht. Auch der destructor "destroy" und die Methode "Free" hast du damit übrigens von TObject geerbt.

Im constructor wird z.B. Speicher angefordert oder Variablen vorbelegt, wenn du eine Instanz des Objektes erzeugst. Deshalb solltest du auch eine Instanz, die du erzeugt hast, an geeigneter Stelle wieder freigeben "Free", um auch evtl. reservierten Speicher wieder freizugeben. Das Theme ist für Delphi enorm wichtig und das solltest du unbedingt verstanden haben.

Christian Seehase 27. Mai 2009 18:30

Re: Delphi 5: Problem mit Create bei Ini-Datei...
 
Moin Zusammen,

was gerade im Zusammenhang mit INI-Dateien noch sehr wichtig ist:
Wird kein Pfad angegeben, so wird versucht die INI-Datei im Windows-Verzeichnis anzulegen, bzw. es wird versucht, sie dort zu finden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:02 Uhr.

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