Guten Morgen Ralph,
die Neugier hat mich nicht losgelassen. Du hattest recht, mit ein paar kleinen Änderungen läuft deine Prozedur prima durch. Habe noch ein kleines Problem, für das ich nach 3 Stunden probieren noch keine Lösung habe:
Beim Refill wird der dem gelöschten Datensatz nachfolgende Datensatz doppelt im StringGrid ausgegeben. In der Rebuild-Datei (und auch in 'Hilf') ist alles i.O.
Beim Schließen der Datei lasse ich das StringGrid entsprechend der Anzahl der Einträge leeren. Wg. dem doppelten Datensatz bleibt dann aber der letzte im StringGrid stehen und ist dann beim erneuten öffnen der Datei natürlich immer noch da.
Wäre super, wenn du mir noch ein letztes Mal helfen könntest. Irgendwie bin ich blind und finde den Fehler nicht. Meines Erachtens sollte er ja in der Refill-Prozedur stecken.
Nachfolgend der aktuelle Quelltext deiner Löschprozedur. Die kommentierten Zeilen habe ich geändert.
Delphi-Quellcode:
procedure TForm1.DatenLoeschenClick(Sender: TObject);
var DelPos : Integer;
ChemDatH : TChemDat; //nicht mehr global
function NamePos(Name:String):Integer;
begin
Result:=-1;
//assignfile(ChemDat,Dateiname+'.dat'); //Fehlermeldung - nach auskommentieren i.O.
reset(ChemDat);
while not Eof(ChemDat) do begin
read(ChemDat,Chem);
if Chem.Name=Name then begin
Result:=FilePos(ChemDat)-1; //Filepos -1 (löscht sonst nachfolgenden Satz)
Break
end
end;
closefile(ChemDat)
end;
procedure DeleteRecord(DelIdx:Integer);
var RecIdx : Integer;
begin
//assignfile(ChemDat,Dateiname+'.dat'); //Fehlermeldung - nach auskommentieren i.O.
reset(ChemDat);
assignfile(ChemDatH,'Hilf');
rewrite(ChemDatH);
RecIdx:=-1;
while not Eof(ChemDat) do begin
read(ChemDat,Chem);
inc(RecIdx);
if RecIdx<>DelIdx then
begin
write(ChemDatH,Chem)
end;
end;
closefile(ChemDat);
closefile(ChemDatH);
end;
procedure RebuildDataFile;
begin
assignfile(ChemDat,Dateiname); //+'.dat' entfernt , da er sonst lauter dat anhängt
rewrite(ChemDat);
assignfile(ChemDatH,'Hilf');
reset(ChemDatH);
while not(eof(ChemDatH)) do begin
read(ChemDatH,Chem);
write(ChemDat,Chem);
end;
closefile(ChemDat);
closefile(ChemDatH);
// erase(ChemdatH) nur auskommentiert, um Inhalt zu checken
end;
procedure RefillGrid;
var i : Integer;
begin
assignfile(ChemDat,Dateiname);
reset(ChemDat);
for i:=1 to FileSize(ChemDat) do begin
read(ChemDat,Chem);
with StringGrid1 do
with Chem do begin
Cells[1,i]:=IntToStr(BNum);
Cells[2,i]:=Name;
Cells[3,i]:=IntToStr(Bestand);
Cells[4,i]:=Datum
end
end;
closefile(ChemDat);
end;
begin
DelPos:=NamePos(EditName.Text);
if DelPos>=0 then begin
DeleteRecord(DelPos);
RebuildDataFile;
RefillGrid
end ;
EditNr.Clear;
EditName.Clear;
EditZugang.Text:=IntToStr(0);
EditAbgang.Text:=IntToStr(0);
DateTimePicker1.Date:=Date();
end;
Übrigens habe ich deine Prozedur zum Anlass genommen, das Programm zu überarbeiten. Mittlerweile ist mir klar, warum das Proggi, je länger es wurde, umso mehr Fehlermeldungen produzierte. Habe rigoros reset und closeFile benutzt. Und schon verringerte sich die Fehlerzahl.
Beste Grüße
Michael
PS: hatte beim nochmaligen durchlesen gerade `ne Idee fürs RefillGrid: vorher alles leeren(habe RowCount festgelegt). Dann sollte es doch leer sein. Probiere es aber erst heute nachmittag aus.