Bezeichner nicht gefunden trotz deklaration

Ich kann meinen Fehler einfach nicht finden. Obwohl ich am Anfang einen Bezeichner global deklariert habe, wird er nicht gefunden. hier der Quelltext:

type TBuecher = record
Nummer: real;
Name, Autor, Stichwort: String[35];
Verfuegbar: real;
end;

und später dann:

procedure TForm1.BitBtn1Click(Sender: TObject);
var Buch : TBuecher;
Datei : File of TBuecher;
i : Integer;
begin
AssignFile (Datei,‚Buchliste.dat‘);
Reset(Datei);
i:=0;
repeat
If Edit_Stichwort=Stichwort than
Zeile 151
Inc(i);
Read (Datei,Buch);
with Buch do
begin
Nummer:=i;
StringGrid1.Cells[1,i]:=(Name);
StringGrid1.Cells[2,i]:=(Autor);
StringGrid1.Cells[3,i]:=FloatToStr(Verfuegbar);
end
else
" "
until EOF(Datei);
CloseFile(Datei);
end;

Der Fehler in Zeile 151 lautet: Undefinierter Bezeichner: ‚Stichwort‘

Außerdem noch die Frage, wenn ich gerade dabei bin: Wie kann ich die ganze Prozedur mit while do realisieren? und ihm sagen, dass, wenn if nicht wahr ist, hinter else nichts mehr geschrieben werden soll? Ich gebe zu, ich hab mit Delphi nicht gerade viel Erfahrung, ich bin Schüler. Aber ich dachte, wenn ich " " einfüge heißt das soviel wie nichts schreiben und dann würde er wieder beginnen. Ach so, ich wollte keine Leere Zeile dazwischen haben.

Hallo,

irgendwie hast Du da ein Kuddel-Muddel in der Struktur!

type TBuecher = record
 Nummer: real;
 Name, Autor, Stichwort: String[35];
 Verfuegbar: real;
 end;

warum deklarierst Du Nummer und Verfuegbar als real. Erstens ist der Typ veraltet, man nimmt Single, Double oder Extended (wenn Dein Lehrer etwas anderes behauptet, soll er sich die Delphi-Hilfe zu „real“ anschauen). Zweitens gibt es wohl keine halben verfügbaren Bücher. Also nimmt man Integer. Ausnahme wäre, wenn die Datei, die Du einliest einen real enthält, weil sie mit einem alten Programm geschrieben wurde.

und später dann:

procedure TForm1.BitBtn1Click(Sender: TObject);
var Buch : TBuecher;
 Datei : File of TBuecher;
 i : Integer;
begin
AssignFile (Datei,'Buchliste.dat');
Reset(Datei);
i:=0;
repeat
 If Edit\_Stichwort=Stichwort than 

Woher soll Delphi wissen, wozu das Stichwort gehört? Du hast ja noch nicht mal einen Datensatz eingelesen. Überleg mal, wo diese Zeile (und die nächsten fünf) richtigerweise hinkommen bzw wie sie angeordnet werden. Heißt das übrigens wirklich Edit_Stichwort, oder ist es der Inhalt eines Edit-Feldes. Dann müsste dort nämlich die entsprechende Eigenschaft des Edit-Feldes stehen.

> Inc(i);  
> Read (Datei,Buch);  
> with Buch do  
> begin  
> Nummer:=i;  
> StringGrid1.Cells[1,i]:=(Name);  
> StringGrid1.Cells[2,i]:=(Autor);  
> StringGrid1.Cells[3,i]:=FloatToStr(Verfuegbar);  
> end  
> else

" "

Was soll das tun?

Der Fehler in Zeile 151 lautet: Undefinierter Bezeichner:
‚Stichwort‘

Außerdem noch die Frage, wenn ich gerade dabei bin: Wie kann
ich die ganze Prozedur mit while do realisieren?

Ich nehme an, ihr hattet im Unterricht gerade abweisende und nicht abweisende Schleifen. Der Unterschied liegt darin, an welchem Punkt (Anfang oder Ende) die Ausstiegsbedingung abgefragt wird. Im vorliegenden Fall ist die while-Schleife tatsächlich sinnvoller, dabei invertiert sich aber die Bedingung.

und ihm
sagen, dass, wenn if nicht wahr ist, hinter else nichts mehr
geschrieben werden soll?

Wenn man nichts machen will, braucht man auch kein else.

Ich gebe zu, ich hab mit Delphi nicht
gerade viel Erfahrung, ich bin Schüler. Aber ich dachte, wenn
ich " " einfüge heißt das soviel wie nichts schreiben und dann
würde er wieder beginnen.

Dir ist klar, dass das Zeichen " in Delphi keine Bedeutung hat?

Und schau nochmal deine „begin … end“ an. Da stimmt auch noch was nicht.

Gruß, Niels

Danke erst mal für die Antworten. Stichwort wird in einer anderen Prozedur deklariert, wäre also in diesem Fall schon vorhanden. Bei den anderen Sachen danke ich dir. Ich hatte aber schonmal nur if xyz then abc und dann kein else mehr geschrieben und da hat er gemeckert. Vielleicht war es aber da was anderes gewesen. Danke, ich werde die Sachen mal so versuchen. Stimmt, man kann ja nicht irgendwas mit nem String vergleichen, hätte ich wissen müssen, dass man das erst auf ne deklarierte Variable legt. Danke noch mal

Also gut: Ich habe jetzt die meisten Veränderungen vorgenommen. Was ich nur nicht verstehe, wenn ich

procedure TForm1.BitBtn1Click(Sender: TObject);
var Buch : TBuecher;
Datei : File of TBuecher;
i : Integer;
begin
AssignFile (Datei,‚Buchliste.dat‘);
Reset(Datei);
i:=0;
while not EOF(Datei) do
Inc(i);
Read (Datei,Buch);
If Edit_Stichwort.Text=Stichwort than

habe, warum kann er den Bezeichner nicht finden? der müsste doch durch den Record: type TBuecher = record
Nummer: integer;
Name, Autor, Stichwort: String[35];
Verfuegbar: integer;
end;

deklariert sein, oder nicht? mit read (Datei,Buch) lese ich doch die vorher gespeicherte Datei ein, oder? Und im Record habe ich das definiert. Oder muss ich Stichwort unbedingt vorher einen Bezeichner zuweisen? (Bringt aber auch nichts, habe ich schon getestet.

Hallo,

Da sind immer noch ein paar Fehler drin (hast Du den Quelltext mit Copy-and-Paste aus dem Original genommen oder abgeschrieben?)

procedure TForm1.BitBtn1Click(Sender: TObject);
var Buch : TBuecher;
Datei : File of TBuecher;
i : Integer;
begin
AssignFile (Datei,‚Buchliste.dat‘);
Reset(Datei);
i:=0;

fehlt in der folgenden Zeile nicht noch ein Wort? Spätestens, wenn Du das Programm zum Laufen gebracht hast, wird es sich in der Unendlichkeit verlieren.

while not EOF(Datei) do

Inc(i);
Read (Datei,Buch);

Was ist in der folgenden Zeile „than“ (wird im Quellcode bestimmt nicht fett dargestellt, oder?)

If Edit_Stichwort.Text=Stichwort than

habe, warum kann er den Bezeichner nicht finden? der müsste
doch durch den Record: type TBuecher = record
Nummer: integer;
Name, Autor, Stichwort: String[35];
Verfuegbar: integer;
end;

deklariert sein, oder nicht? mit read (Datei,Buch)
lese ich doch die vorher gespeicherte Datei ein, oder? Und im
Record habe ich das definiert.
Oder muss ich Stichwort
unbedingt vorher einen Bezeichner zuweisen? (Bringt aber auch
nichts, habe ich schon getestet.

Wo deklarierst Du TBuecher?
Woher soll das programm wissen wo „Stichwort“ zugehört?

Gruß, Niels

so, hier der Quelltext, vielleicht git das ne bessere Verständlichkeit über das was ich machen wollte.

_unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, Grids;

type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Edit_Name: TEdit;
Edit_Autor: TEdit;
StringGrid1: TStringGrid;
BitBtn1: TBitBtn;
BitBtn3: TBitBtn;
BitBtn4: TBitBtn;
BitBtn5: TBitBtn;
Label5: TLabel;
Edit_Buchanzahl: TEdit;
Button1: TButton;
Button2: TButton;
Label6: TLabel;
Edit_Anzahl_eingeben: TEdit;
Edit_Stichwort: TEdit;
Label4: TLabel;
procedure BitBtn3Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure BitBtn4Click(Sender: TObject);
procedure BitBtn5Click(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

type TBuecher = record
Nummer: integer;
Name, Autor, Stichwort: String[35];
Verfuegbar: integer;
end;

procedure TForm1.BitBtn3Click(Sender: TObject);
begin
close
end;

procedure TForm1.FormCreate(Sender: TObject);
var i:Integer;
begin
with StringGrid1 do
StringGrid1.Cells[0,0]:=‚Nummer‘;
StringGrid1.Cells[1,0]:=‚Buchname‘;
StringGrid1.Cells[2,0]:=‚Autor‘;
StringGrid1.Cells[3,0]:=‚Verfügbar‘;
StringGrid1.Cells[4,0]:=‚Kategorie‘;
begin
for i:=1 to 100 do
StringGrid1.Cells[0,i]:=IntToStr(i);
end;
end;

procedure TForm1.Button1Click(Sender: TObject); //soll runterrechnen, funktioniert auch
var a,e: integer;
begin
a:=strtoint(Edit_Buchanzahl.Text);
e:=a-1;
Edit_Buchanzahl.Text:=inttostr(e);
end;

procedure TForm1.Button2Click(Sender: TObject);
var a,e: integer; //Soll Hochrechnen, funktioniert
begin
a:=strtoint(Edit_Buchanzahl.Text);
e:=a+1;
Edit_Buchanzahl.Text:=inttostr(e);
end;

procedure TForm1.BitBtn4Click(Sender: TObject);_ //Soll Bearbeiten, testen nicht möglich, da Datei nicht öffnet
var Buch : TBuecher;
Datei : File of TBuecher ;
i : Integer ;
a : Integer ;

begin
a:=StrToInt(Edit_Anzahl_eingeben.Text);
AssignFile(Datei,‚Buchliste.dat‘);
Reset(Datei);
for i:=a to a do
begin
StringGrid1.Cells[1,i]:=Edit_Name.Text;
StringGrid1.Cells[2,i]:=Edit_Autor.Text;
StringGrid1.Cells[3,i]:=Edit_Buchanzahl.Text;
StringGrid1.Cells[4,i]:=Edit_Stichwort.Text;
with Buch do
begin
Nummer:=i;
Name:=(StringGrid1.Cells[1,i]);
Autor:=(StringGrid1.Cells[2,i]);
Verfuegbar:=StrToInt(StringGrid1.Cells[3,i]);
Stichwort:=(StringGrid1.Cells[4,i]);
Write(Datei,Buch);
CloseFile(Datei);
end;
end;

end;

procedure TForm1.BitBtn5Click(Sender: TObject); soll öffnen, funktioniert nicht, liegt aber wahrscheinlich am Fehlen einer Datei, sodass mein Programm nicht sauber geöffnet wird
_var Buch : TBuecher;
Datei : File of TBuecher;
i : Integer;

begin
AssignFile (Datei,‚Buchliste.dat‘);
Reset(Datei);
i:=0 ;
repeat
Inc(i);
Read (Datei,Buch);
with Buch do
begin
Nummer:=i;
StringGrid1.Cells[1,i]:=(Name);
StringGrid1.Cells[2,i]:=(Autor);
StringGrid1.Cells[3,i]:=IntToStr(Verfuegbar);
StringGrid1.Cells[4,i]:=(Stichwort);
end;
until EOF(Datei);
CloseFile(Datei);
end;

procedure TForm1.BitBtn1Click(Sender: TObject);_ Hier meine Suchfunktion
_var Buch : TBuecher;
Datei : File of TBuecher;
i : Integer;
begin
AssignFile (Datei,‚Buchliste.dat‘);
Reset(Datei);
i:=0;
begin
while not EOF(Datei) do
Read (Datei,Buch);
Inc(i);
If Edit_Stichwort.Text=StringGrid1.Cells[4,i] then
with Buch do
begin
Nummer:=i;
StringGrid1.Cells[1,i]:=(Name);
StringGrid1.Cells[2,i]:=(Autor);
StringGrid1.Cells[3,i]:=FloatToStr(Verfuegbar);
StringGrid1.Cells[4,i]:=(Stichwort);
end;
CloseFile(Datei);
end;

end;
end._

Ich glaub, ich seh den Wald vor Bäumen nicht, was kann ich denn noch machen? Ich muss das alles Dienstag am laufen haben und nichts läuft.

so, hier der Quelltext, vielleicht git das ne bessere
Verständlichkeit über das was ich machen wollte.

mal als erstes: gib Deinen Komponenten sprechende Namen! Mit BitBtn3 kann niemand was anfangen. Besser wäre btnEnde o.ä.
Genauso ist es besser als Variable „Anzahl“ zu nehmen statt „a“. Soviel Zeit muss sein. Das macht den Code lesbarer (vor allem für andere) und die Codevervollständigung von Delphi nimmt Dir die Schreibarbeit ab.
Übrigens: Gemäß Delphi-Styleguide sollten die Bezeichner keine Unterstriche enthalten.

_unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms,
Dialogs, StdCtrls, Buttons, Grids;

type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Edit_Name: TEdit;
Edit_Autor: TEdit;
StringGrid1: TStringGrid;
BitBtn1: TBitBtn;
BitBtn3: TBitBtn;
BitBtn4: TBitBtn;
BitBtn5: TBitBtn;
Label5: TLabel;
Edit_Buchanzahl: TEdit;
Button1: TButton;
Button2: TButton;
Label6: TLabel;
Edit_Anzahl_eingeben: TEdit;
Edit_Stichwort: TEdit;
Label4: TLabel;
procedure BitBtn3Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure BitBtn4Click(Sender: TObject);
procedure BitBtn5Click(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

type TBuecher = record
Nummer: integer;
Name, Autor, Stichwort: String[35];
Verfuegbar: integer;
end;

procedure TForm1.BitBtn3Click(Sender: TObject);
begin
close
end;_

Bis auf den Prozedurnamen OK.

procedure TForm1.FormCreate(Sender: TObject);
var i:Integer;
begin
with StringGrid1 do

kann es sein, dass da ein „begin“ fehlt und natürlich das dazugehörige „end“? Das macht im Moment nur deshalb nichts aus, weil Du im nachfolgenden immer StringGrid1 wiederholst (was das „with“ eigentlich überflüssig macht).

StringGrid1.Cells[0,0]:=‚Nummer‘;
StringGrid1.Cells[1,0]:=‚Buchname‘;
StringGrid1.Cells[2,0]:=‚Autor‘;
StringGrid1.Cells[3,0]:=‚Verfügbar‘;
StringGrid1.Cells[4,0]:=‚Kategorie‘;
begin

Das „begin“ ist verrutscht!

for i:=1 to 100 do
StringGrid1.Cells[0,i]:=IntToStr(i);
end;
end;

procedure TForm1.Button1Click(Sender: TObject); //soll
runterrechnen, funktioniert auch
var a,e: integer;
begin
a:=strtoint(Edit_Buchanzahl.Text);
e:=a-1;
Edit_Buchanzahl.Text:=inttostr(e);
end;

bisschen kompliziert, aber OK.

procedure TForm1.Button2Click(Sender: TObject);
var a,e: integer; //Soll Hochrechnen, funktioniert
begin
a:=strtoint(Edit_Buchanzahl.Text);
e:=a+1;
Edit_Buchanzahl.Text:=inttostr(e);
end;

s.o.

procedure TForm1.BitBtn4Click(Sender: TObject); //Soll
Bearbeiten, testen nicht möglich, da Datei nicht öffnet
var Buch : TBuecher;
Datei : File of TBuecher ;
i : Integer ;
a : Integer ;

begin
a:=StrToInt(Edit_Anzahl_eingeben.Text);
AssignFile(Datei,‚Buchliste.dat‘);

Gib hier mal den gesamten Pfad ein!

Reset(Datei);

Wenn Du nur schreiben willst verwende besser Rewrite.

for i:=a to a do
begin
StringGrid1.Cells[1,i]:=Edit_Name.Text;
StringGrid1.Cells[2,i]:=Edit_Autor.Text;
StringGrid1.Cells[3,i]:=Edit_Buchanzahl.Text;
StringGrid1.Cells[4,i]:=Edit_Stichwort.Text;

ist es Absicht, dass Du das Stringrid und die Datei komplett mit demselben Buch füllst?

with Buch do
begin
Nummer:=i;
Name:=(StringGrid1.Cells[1,i]);
Autor:=(StringGrid1.Cells[2,i]);
Verfuegbar:=StrToInt(StringGrid1.Cells[3,i]);
Stichwort:=(StringGrid1.Cells[4,i]);
Write(Datei,Buch);
CloseFile(Datei);

findest Du nicht, dass Du die Datei etwas früh wieder schließt? Willst Du das nicht erst machen, nachdem Du alle Bücher geschrieben hast?

end;
end;

end;

procedure TForm1.BitBtn5Click(Sender: TObject); soll
öffnen, funktioniert nicht, liegt aber wahrscheinlich am
Fehlen einer Datei, sodass mein Programm nicht sauber geöffnet
wird
_var Buch : TBuecher;
Datei : File of TBuecher;
i : Integer;

begin
AssignFile (Datei,‚Buchliste.dat‘);_

Auch hier wieder: kompletten Pfad angeben!

Reset(Datei);
i:=0 ;
repeat

hier sollte eine abweisende Schleife genommen werden (while)!

Inc(i);
Read (Datei,Buch);
with Buch do
begin
Nummer:=i;

Dir ist aber klar, dass Du die Nummer schon aus der Datei eingelesen hast? Ist es Absicht, sie hier wieder zu überschreiben?

StringGrid1.Cells[1,i]:=(Name);
StringGrid1.Cells[2,i]:=(Autor);
StringGrid1.Cells[3,i]:=IntToStr(Verfuegbar);
StringGrid1.Cells[4,i]:=(Stichwort);
end;

lass mal bei 1, 2 und 4 die Klammern weg.

:until EOF(Datei);

CloseFile(Datei);
end;

procedure TForm1.BitBtn1Click(Sender: TObject); Hier
meine Suchfunktion
var Buch : TBuecher;
Datei : File of TBuecher;
i : Integer;
begin
AssignFile (Datei,‚Buchliste.dat‘);

s.o.

Reset(Datei);
i:=0;
begin

das „begin“ ist verrutscht!

while not EOF(Datei) do
Read (Datei,Buch);
Inc(i);
If Edit_Stichwort.Text=StringGrid1.Cells[4,i] then
with Buch do
begin
Nummer:=i;
StringGrid1.Cells[1,i]:=(Name);
StringGrid1.Cells[2,i]:=(Autor);
StringGrid1.Cells[3,i]:=FloatToStr(Verfuegbar);
StringGrid1.Cells[4,i]:=(Stichwort);
end;
CloseFile(Datei);
end;

Das „end“ ist verrutscht!

end;
end.

Ich glaub, ich seh den Wald vor Bäumen nicht, was kann ich
denn noch machen? Ich muss das alles Dienstag am laufen haben
und nichts läuft.

wird schon noch klappen!

Gruß, Niels