Einzelnen Beitrag anzeigen

klausmaus

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

Re: StringGrid Zeile per Mausclick auslesen

  Alt 10. Okt 2008, 00:37
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.
  Mit Zitat antworten Zitat