Assign....

Für Fragen von Einsteigern und Programmieranfängern...
Joachim Raap
Beiträge: 143
Registriert: Mo 30. Mär 2020, 12:37

Assign....

Beitrag von Joachim Raap »

Hallo, nach einem Ausflug in die Welt des FileStream bin ich nicht mehr in der Lage, in normale Dateien zu speichern; hier ein kleiner Code

procedure TFMGruppen.BTSpeichernClick(Sender: TObject); //prüfen
begin
if not Zeile
then Fehlermeldung(90)
else if (GrpSatz1.GrpNr>0) and (GrpSatz1.GrpName<>'')
then begin
AssignFile(GrpDat,'gruppen.dat');
rewrite(GrpDat);
write(GrpDat,GrpSatz1);
showmessage(IntToStr(filesize(GrpDat)));
CloseFile(GrpDat);

GrpDat ist ein File of records und GrpSatz1 enthält einen Record.
Ich weiß nun wirklich nicht mehr, was falsch läuft - Filesize ist immer 0....

Benutzeravatar
kralle
Lazarusforum e. V.
Beiträge: 994
Registriert: Mi 17. Mär 2010, 14:50
OS, Lazarus, FPC: Linux Mint 20 , FPC 3.3.1 , Lazarus 2.1.0 -Win10 & XE7Pro
CPU-Target: 64Bit
Wohnort: Bremerhaven
Kontaktdaten:

Re: Assign....

Beitrag von kralle »

Moin,

a) wird die Datei 'gruppen.dat' überhaupt geschrieben?
b) Ist Filesize nicht nur für Dateien wie 'gruppen.dat'?
c) Kann Filesize vielleicht nur die Filegröße ermitteln wenn die zuschreibende Datei geschlossen ist - also nach dem Close?

Gruß HEiko
OS: Manjaro Linux, Debian und Windows 10
FPC-Version: 3.2.2 , Lazarus 3.0
+ Delphi XE7SP1

Joachim Raap
Beiträge: 143
Registriert: Mo 30. Mär 2020, 12:37

Re: Assign....

Beitrag von Joachim Raap »

Hallo,
a) ja, die Datei ist vorhanden.
b) nö, FileSize braucht den Bezeichner, sonst werde ich angemeckert
c) bei der Abfrage nach dem close ändert sich am Ergebnis nichts

ich habe ehe so den Verdacht, daß irgendein "uses" fehlt oder eine Kompilereinstellung vorzunehmen ist.... (Vielleicht wird ja auch nur Weihnachten gespeichert... :evil: )

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1436
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Assign....

Beitrag von fliegermichl »

Joachim Raap hat geschrieben:
So 6. Nov 2022, 10:51
Hallo,
a) ja, die Datei ist vorhanden.
b) nö, FileSize braucht den Bezeichner, sonst werde ich angemeckert
c) bei der Abfrage nach dem close ändert sich am Ergebnis nichts

ich habe ehe so den Verdacht, daß irgendein "uses" fehlt oder eine Kompilereinstellung vorzunehmen ist.... (Vielleicht wird ja auch nur Weihnachten gespeichert... :evil: )
Poste doch mal den kompletten Quellcode, damit man es nachvollziehen kann. An dem obigen Code ist ausser nicht vorhandener Fehlerbehandlung nichts zu bemängeln.

charlytango
Beiträge: 845
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: Assign....

Beitrag von charlytango »

Joachim Raap hat geschrieben:
So 6. Nov 2022, 10:51
ich habe ehe so den Verdacht, daß irgendein "uses" fehlt oder eine Kompilereinstellung vorzunehmen ist.... (Vielleicht wird ja auch nur Weihnachten gespeichert... :evil: )

Tja.. ich bin raus

Joachim Raap
Beiträge: 143
Registriert: Mo 30. Mär 2020, 12:37

Re: Assign....

Beitrag von Joachim Raap »

Hier der komplette Code; der Ausschnitt findet sich in Procedure "BTSpeichernClick"

Code: Alles auswählen

unit BI_Gruppen;

 {$mode objfpc}{$H+}

 interface

 uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ComCtrls, StdCtrls, fgl;

 type

  TGrpSatz = record
   GrpNr: integer;
   GrpName: string[25];
   GrpAnlage: string[8];
   GrpKtn: integer;
   GrpMonUms: currency;
   GrpJahresUms: currency;
   Aktiv: boolean;
  end;

  TFMGruppen = class(TForm)
   BTNeueGrp: TButton;
   BTLoeschen: TButton;
   BTSpeichern: TButton;
   BTAbbruch: TButton;
   BTEnde: TButton;

   EDTGrpNr: TEdit;
   EDTGrpName: TEdit;
   EDTGrpAnlage: TEdit;
   EDTGrpKtn: TEdit;
   EDTGrpMonUms: TEdit;
   EDTGrpJahresUms: TEdit;

   LBLGrpNr: TLabel;
   LBLGrpName: TLabel;
   LBLGrpAnlage: TLabel;
   LBLGrpKtn: TLabel;
   LBLGrpMonUms: TLabel;
   LBLGrpJahresUms: TLabel;
   LBLGrpMeldung: TLabel;

   LVGruppen: TListView;

   procedure BTAbbruchClick(Sender: TObject);
   procedure BTEndeClick(Sender: TObject);
   procedure BTLoeschenClick(Sender: TObject);
   procedure BTNeueGrpClick(Sender: TObject);
   procedure BTSpeichernClick(Sender: TObject);
   procedure EDTGrpNameClick(Sender: TObject);
   procedure EDTGrpNameExit(Sender: TObject);
   procedure EDTGrpNrClick(Sender: TObject);
   procedure EDTGrpNrExit(Sender: TObject);
   procedure FormShow(Sender: TObject);
   procedure LVGruppenClick(Sender: TObject);
   procedure Zeile_sichtbar(janein: boolean);
   procedure StartwerteEDT;
   procedure LVAnzeigen;
   procedure Fehlermeldung(Fehlercode:byte);

   private

   public
  end;

 const
  GrpDatName='gruppen.dat';

 var
  FMGruppen: TFMGruppen;
  GrpSatz1,GrpSatz2: TGrpSatz;
  GrpDat: file of TGrpSatz;
  Zeile: boolean;
  Fehlercode: Integer;


 implementation

 {$R *.lfm} {$I-}

 procedure Datei;                                                 //o.k.
  begin
   if not FileExists(GrpDatName) then
    begin
     assign(GrpDat,GrpDatName);
     rewrite(GrpDat);
     close(GrpDat);
     showmessage('Die Datei "gruppen.dat" wurde angelegt.'+#13#10+'Denken Sie an eine regelmäßige Sicherung!!');
    end;
  end;

 procedure TFMGruppen.LVGruppenClick(Sender: TObject);            //prüfen
  begin
   if LVGruppen.Selected<>nil
    then begin
          //Füllen der Editfelder mit dem ausgewählten Datensatz
          EDTGrpNr.Text:=LVGruppen.Selected.Caption;               //Inhalt der 1. Spalte
          EDTGrpNr.Enabled:=false;
          EdtGrpName.Text:=LVGruppen.Selected.Subitems[0];         //Inhalt der 2. Spalte
          EDTGrpAnlage.Text:=LVGruppen.Selected.SubItems[1];       //Inhalt der 3. Spalte
          EDTGrpKtn.Text:=LVGruppen.Selected.SubItems[2];          //Inhalt der 4. Spalte
          EDTGrpMonUms.Text:=LVGruppen.Selected.SubItems[3];       //Inhalt der 5. Spalte
          EDTGrpJahresUms.Text:=LVGruppen.Selected.SubItems[4];    //Inhalt der 6. Spalte
          if not Zeile then Zeile_sichtbar(true);
         end
    else Fehlermeldung(10);
  end;

 procedure TFMGruppen.Zeile_sichtbar(janein: boolean);            //o.k.
  begin
   case janein of
     true: begin
            LBLGrpNr.Visible:=true;
            LBLGrpName.Visible:=true;
            LBLGrpAnlage.Visible:=true;
            LBLGrpKtn.Visible:=true;
            LBLGrpMonUms.Visible:=true;
            LBLGrpJahresUms.Visible:=true;

            EDTGrpNr.Visible:=true;
            EDTGrpName.Visible:=true;
            EDTGrpAnlage.Visible:=true;
            EDTGrpKtn.Visible:=true;
            EDTGrpMonUms.Visible:=true;
            EDTGrpJahresUms.Visible:=true;
            Zeile:=true;
           end;
    false: begin
            LBLGrpNr.Visible:=false;
            LBLGrpName.Visible:=false;
            LBLGrpAnlage.Visible:=false;
            LBLGrpKtn.Visible:=false;
            LBLGrpMonUms.Visible:=false;
            LBLGrpJahresUms.Visible:=false;

            EDTGrpNr.Visible:=false;
            EDTGrpName.Visible:=false;
            EDTGrpAnlage.Visible:=false;
            EDTGrpKtn.Visible:=false;
            EDTGrpMonUms.Visible:=false;
            EDTGrpJahresUms.Visible:=false;
            Zeile:=false;
           end;
   end;
  end;

 procedure TFMGruppen.LVAnzeigen;                                 //o.k.
  var
   Item: TListItem;
   i: integer;

  begin
   i:=0;
   assignFile(GrpDat,GrpDatName);
   reset(GrpDat);
    while not EOF do
     begin
      seek(GrpDat,i);
      read(GrpDat,GrpSatz1);
      //ListView befüllen
      Item:=FMGruppen.LVGruppen.Items.Add;
      Item.Caption:=IntToStr(GrpSatz1.GrpNr);              //Index=0
      Item.SubItems.Add(GrpSatz1.GrpName);                 //Index=1
      Item.SubItems.Add(GrpSatz1.GrpAnlage);               //Index=2
      Item.SubItems.Add(GrpSatz1.GrpKtn.ToString);         //Index=3
      Item.SubItems.Add(CurrToStr(GrpSatz1.GrpMonUms));    //Index=4
      Item.SubItems.Add(CurrToStr(GrpSatz1.GrpJahresUms)); //Index=5
      inc(i);
     end;
   closeFile(GrpDat);
  end;

 procedure TFMGruppen.StartwerteEDT;                              //o.k.
  begin
   EDTGrpNr.Text:='';
   EDTGrpName.Text:='';
   //EDTGrpAnlage.Text:=FormatDateTime('dd.mm.yy', now);
   //EDTGrpKtn.Text:='0';
   //EDTGrpMonUms.Text:='0,00€';
   //EDTGrpJahresUms.Text:='0,00€';
  end;

 procedure StartWerteRec;                                         //o.k.
  begin
   GrpSatz1.GrpNr:=0;
   GrpSatz1.GrpName:='';
   GrpSatz1.GrpAnlage:=FormatDateTime('dd.mm.yy', now);
   GrpSatz1.GrpKtn:=0;
   GrpSatz1.GrpMonUms:=0;
   GrpSatz1.GrpJahresUms:=0;
   GrpSatz1.Aktiv:=true;
  end;

 procedure TFMGruppen.FormShow(Sender: TObject);                  //o.k.
  begin
   Datei;                  //prüfen ob Gruppendatei existiert
   LVAnzeigen;             //ListView füllen
   StartwerteEDT;          //Editfelder initialisieren
   StartwerteRec;          //Reordfelder initialisieren
   Zeile_sichtbar(false);  //Eingabezeile ausblenden
  end;

 procedure TFMGruppen.BTEndeClick(Sender: TObject);               //o.k.
  begin
   close;
  end;

 procedure TFMGruppen.BTAbbruchClick(Sender: TObject);            //o.k.
  begin
   StartWerteEDT;
   Zeile_sichtbar(false);
   Fehlermeldung(99);
  end;

 procedure TFMGruppen.BTNeueGrpClick(Sender: TObject);            //o.k.
  begin
   StartWerteRec;
   StartwerteEDT;
   EDTGrpNr.Enabled:=true;
   Zeile_sichtbar(true);
   Fehlermeldung(99);
  end;

 procedure TFMGruppen.BTSpeichernClick(Sender: TObject);          //prüfen
  begin
   if not Zeile
    then Fehlermeldung(90)
    else if (GrpSatz1.GrpNr>0) and (GrpSatz1.GrpName<>'')
          then begin
                FileMode:=1;             //0=Read only 1=Write only 2=Read/Write
                AssignFile(GrpDat,GrpDatName);
                reset(GrpDat);
                //seek(GrpDat, filesize(GrpDat));
                write(GrpDat,GrpSatz1);
showmessage(IntToStr(filesize(GrpDat)));
                CloseFile(GrpDat);
                LVAnzeigen;
                Fehlermeldung(1);
                StartwerteEDT;
                StartWerteRec;
               end
          else Fehlermeldung(10);
  end;

 procedure TFMGruppen.BTLoeschenClick(Sender: TObject);           //prüfen
  begin
   if not Zeile
    then Fehlermeldung(90);
  end;

 procedure TFMGruppen.EDTGrpNrClick(Sender: TObject);             //o.k.
  begin
   Fehlermeldung(99);
  end;

 procedure TFMGruppen.EDTGrpNrExit(Sender: TObject);              //o.k.
  begin
   if (EDTGrpNr.Text<>'') and (StrToInt(EDTGrpNr.Text)>0)
    then GrpSatz1.GrpNr:=StrToInt(EDTGrpNr.Text)
    else Fehlermeldung(10);
  end;

 procedure TFMGruppen.EDTGrpNameClick(Sender: TObject);           //o.k.
  begin
   Fehlermeldung(99);
  end;

 procedure TFMGruppen.EDTGrpNameExit(Sender: TObject);            //o.k.
  begin
   if (EDTGrpName.Text<>'')
    then GrpSatz1.GrpName:=EDTGrpName.Text
    else Fehlermeldung(10);
   end;

 procedure TFMGruppen.Fehlermeldung(FehlerCode:byte);             //o.k.
  begin
   case Fehlercode of
     //Fehler für Dateizugriffe: 1-9
     1: LBLGrpMeldung.Caption:='Die Eingaben/Veränderungen sind gespeichert';
     2: LBLGrpMeldung.Caption:='Es sind noch keine Einträge vorhanden';

     //Fehler für Eingabefehler: 10-20
    10: LBLGrpMeldung.Caption:='Die Eingaben sind ungültig bzw. fehlerhaft';
    11: LBLGrpMeldung.Caption:='Daten sind unvollständig';
    12: LBLGrpMeldung.Caption:='Es wurden keine Veränderungen vorgenommen';

     //Fehler allgemein:         90-99}
    90: LBLGrpMeldung.Caption:='Die Funktion ist in diesem Zustand nicht möglich';
    99: LBLGrpMeldung.Caption:='';
   end;
  end;


en

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6217
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Assign....

Beitrag von af0815 »

Man kann erwarten, das die Datei erst nach dem Close auf den Dateiträger vollständig geschrieben wird (oder flush'en).

Ansonsten, wie schon charlytango richtig gesagt hat - ich bin da gar nicht rein.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

TBug
Beiträge: 177
Registriert: Mi 2. Sep 2015, 11:09
OS, Lazarus, FPC: Lazaurus 2.2.4 FPC 3.2.2
CPU-Target: Windows 32/64bit

Re: Assign....

Beitrag von TBug »

Joachim Raap hat geschrieben:
So 6. Nov 2022, 13:48
Hier der komplette Code; der Ausschnitt findet sich in Procedure "BTSpeichernClick"
Lade einmal das Projekt als zip-Datei hoch, damit man das testen kann, ohne selbst die Form anlegen zu müssen.

Ausserdem ist es zu empfehlen, die Fehlermeldungs-Indikatoren für "Fehlermeldung(99);" als Konstanten anzulegen, damit das Ganze wartungsfreundlich bleibt. Wer weis schon nach 6 Monaten noch, was der Fehler 99 bedeutet.

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Assign....

Beitrag von Winni »

Hi!

Erstens : ja, es muss erst ein closefle ausgeführt werden, bevor die Dateigröße auf der Festplatte verewigt wird.

Zweitens: es gibt filesize zweimal.

Zum ersten das aus dem System, das oben benutzt wird. Aber Achtung; Das gibt die Anzahl in der Größe des Datentyps zurück, bei einem File of iInteger also die Anzahl der Integers.

Bequemer ist das filesize aus der unit fileUtil.
Das benötigt nur den Dateinamen und keinen FilePointer. Und es gibt die Größe in Bytes zurück.

Winni

Joachim Raap
Beiträge: 143
Registriert: Mo 30. Mär 2020, 12:37

Re: Assign....

Beitrag von Joachim Raap »

Hallo;
ich nehme an, das "closefle" closefile heißen soll. Die Datei wird in der Procedure "Datei" angelegt und später auf vorhandensein geprüft (merkwürdigerweise akzeptiert er hier ein einfaches "assign" - sonst will er assignfile haben). Hier ist auch ein "close" vorhanden.

Auf das Vorhandensein von 2xfilesize bin ich noch nicht gestossen (Einsteiger) - hat doch aber nichts damit zu tun, daß der nicht speichert?? (oder)

Joachim Raap
Beiträge: 143
Registriert: Mo 30. Mär 2020, 12:37

Re: Assign....

Beitrag von Joachim Raap »

Nachtrag: neuerdings wird "file not open" (oder so ähnlich) auch beim kompilieren angemeckert - war vorher nicht der Fall. Ich habe diese Meldung zunächst mit {$I-] ausgeblendet.
Deswegen kam ich auf die Idee, daß das wohl an den Einstellungen was nicht stimmt...

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Assign....

Beitrag von Winni »

Hi!

Für eine Datei benötigst Du assignFile.

Das wurde von Delphi erfunden, weil assign was ganz anders ist.

Winni

PS.:Ich würde ansichts Deine vielen grundlegenden Fragen empfehlen dass du dir erstmal die Grundlagen von Delphi/Lazarus reinziehst.

Joachim Raap
Beiträge: 143
Registriert: Mo 30. Mär 2020, 12:37

Re: Assign....

Beitrag von Joachim Raap »

Hey, ich möchte keinen falschen Eindruck erwecken; ich denke aber schon, daß ich Grundlagen kenne (wenn auch ein wenig eingerostet).
Hier ist das Problem, daß speichern bislang funktioniert hat - aber eben nur bislang; nun aber eben nicht mehr.
Der Code mit assgin (assignfile) ist ja wohl o.k. aber er speichert nicht. Auch in einem kleinen Hilfsprogramm das nichts weiter macht als eine Eingabe speichern soll verweigert seinen Dienst. Daher eben die Annahme, daß ich irgendweine Einstellung verbogen habe.....

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Assign....

Beitrag von Winni »

Joachim Raap hat geschrieben:
So 6. Nov 2022, 17:40
Der Code mit assgin (assignfile) ist ja wohl o.k. aber er speichert nicht.

ASSINGFILE, nicht assign in Lazarus.

Das sind z.B. Delphi Grundlagen

Mann oh Mann

Joachim Raap
Beiträge: 143
Registriert: Mo 30. Mär 2020, 12:37

Re: Assign....

Beitrag von Joachim Raap »

1. ja, das ist längst geändert (wohl nicht in der geschickten Version)
2. es wird immer noch nicht gespeichert - auch mit Mann oh Mann nicht.....

Na ja, die einen sind beleidigt, weil man den Filestream für die eigene Entwicklung für ungeeignet hält, die anderen haben vorschneller Urteile und so muß ich mir einen neuen Regenschirm suchen. Vielen Dank auch und schönes Restwochenende.

Antworten