@taaktaak
Sorry, hat ein bisschen länger gedauert.
Dein Hinweis zur Globalisierung hat insofern geholfen, dass ich einen anderen Fehler beseitigen konnte.
Da du den Quelltext für Fehlerfrei erachtet hast, bin ich nochmal alles durchgegangen und siehe da, der Fehler lag woanders.
Beim Löschen schließe ich die Datei. Der nachfolgende Aufruf im Programm erwartet aber eine geöffnete Datei.
Da ich Probleme mit dem Umbenennen hatte bin ich wieder zur ursprünglichen Variante zurückgekehrt. Funktioniert theoretisch. Folgendes Problem:
-Reihenfolge der eingegebenen Datensätze: zeile1 / zeile2 / losch/ zeile3 / zeile4
-nach Aufruf der Löschprozedur für Datensatz losch lautet die Reihenfolge: zeile2 / zeile2 / losch/ zeile3 / zeile4
-in der Hilf-Datei steht die Reihenfolge: zeile2 / losch/ zeile3 / zeile4
Schlußfolgerung: In der ChemDat wurde statt des 3.Datensatzes der 1. gelöscht und der 2. Datensatz als 1. eingetragen.
Vielleicht kannst du rausfinden wo es da hakt.
Hier zunächst die Prozedur für die verwendete Suchfunktion:
Delphi-Quellcode:
procedure suchNam(Name:string; var ex:boolean; var Position:SmallInt);
//Chemikaliensuche nach Namen
begin
seek(ChemDat,0);
while not Eof(ChemDat) do
begin
read(ChemDat,Chem);
If Name=Chem.Name then begin
ex:=true;
Position:=Filepos(ChemDat)-1;
end;
end;
end;
Folg. Quellcode soll löschen (Hab mal kommentiert, was ich damit erreichen will):
Delphi-Quellcode:
procedure TForm1.DatenLoeschenClick(Sender: TObject);
var such:string; exist:boolean; Stelle:SmallInt; i:SmallInt;
z,s:Integer;
ChemDatH: TChemDat;
begin
Stelle:=0;
seek(ChemDat,0);
Assignfile(ChemDatH,'Hilf');
rewrite(ChemDatH);
such:=EditName.Text;
suchNam(Chem.Name, exist, Stelle); //Aufruf Suchprozedur (s.o.)
If exist then
for i:=0 to Stelle-1 do
begin
seek(ChemDat,0);
read(ChemDat,Chem) ; //Bis zur gesuchten Stelle (Name aus Edits)
write(ChemDatH,Chem); //Bis dahin gelesenes in die Hilfsdatei schreiben
end;
seek(ChemDat,Stelle+1); // zu löschenden Datensatz überspringen
while not eof (Chemdat) do
begin
read(ChemDat,Chem); //Rest lesen und schreiben
write(ChemDatH,Chem);
end;
seek(ChemDatH,0);
read(ChemdatH,Chem); // HilfsDatei auslesen
seek(ChemDat,0);
write(ChemDat,Chem); //ChemDat neu schreiben
CloseFile(ChemDatH);
//Erase(ChemDatH);
seek(ChemDat,0);
for i:=0 to FileSize(ChemDat)-1 do
begin
StringGrid1.Cells[0,i]:=IntToStr(FilePos(ChemDat));
read(ChemDat,Chem);
with Chem do //komplette ChemDat lesen und im StringGrid ausgeben
begin
StringGrid1.Cells[1,i+1]:=IntToStr(Chem.BNum);
StringGrid1.Cells[2,i+1]:=Chem.Name;
StringGrid1.Cells[3,i+1]:=IntToStr(Chem.Bestand);
StringGrid1.Cells[4,i+1]:=Chem.Datum;
end;
Die Hilfsdatei habe ich nach deinem Tipp lokal definiert. Die ChemDat muss m.E. global bleiben, da viele Prozeduren darauf zugreifen.
Gruß Michael