Einzelnen Beitrag anzeigen

klausmaus

Registriert seit: 18. Sep 2008
17 Beiträge
 
#27

Re: StringGrid Zeile per Mausclick auslesen

  Alt 5. Okt 2008, 15:35
@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
  Mit Zitat antworten Zitat