Assign....
-
- Beiträge: 143
- Registriert: Mo 30. Mär 2020, 12:37
Assign....
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....
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....
- kralle
- Lazarusforum e. V.
- Beiträge: 1200
- Registriert: Mi 17. Mär 2010, 14:50
- OS, Lazarus, FPC: Manjaro Linux, Mint und Windows 10 ,Lazarus 3.99, FPC-Version: 3.3.1
- CPU-Target: 64Bit
- Wohnort: Bremerhaven
- Kontaktdaten:
Re: Assign....
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
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: MX Linux, Linux Mint und Windows 10
FPC-Version: 3.3.1 , Lazarus 3.99
+ Delphi XE7SP1
FPC-Version: 3.3.1 , Lazarus 3.99
+ Delphi XE7SP1
-
- Beiträge: 143
- Registriert: Mo 30. Mär 2020, 12:37
Re: Assign....
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...
)
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...

- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1647
- Registriert: Do 9. Jun 2011, 09:42
- OS, Lazarus, FPC: Lazarus Fixes FPC Stable
- CPU-Target: 32/64Bit
- Wohnort: Echzell
Re: Assign....
Poste doch mal den kompletten Quellcode, damit man es nachvollziehen kann. An dem obigen Code ist ausser nicht vorhandener Fehlerbehandlung nichts zu bemängeln.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...)
-
- Beiträge: 1063
- 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....
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...)
Tja.. ich bin raus
-
- Beiträge: 143
- Registriert: Mo 30. Mär 2020, 12:37
Re: Assign....
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
- af0815
- Lazarusforum e. V.
- Beiträge: 6784
- 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....
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.
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).
-
- Beiträge: 179
- 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....
Lade einmal das Projekt als zip-Datei hoch, damit man das testen kann, ohne selbst die Form anlegen zu müssen.Joachim Raap hat geschrieben: So 6. Nov 2022, 13:48 Hier der komplette Code; der Ausschnitt findet sich in Procedure "BTSpeichernClick"
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.
- 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....
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
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
-
- Beiträge: 143
- Registriert: Mo 30. Mär 2020, 12:37
Re: Assign....
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)
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)
-
- Beiträge: 143
- Registriert: Mo 30. Mär 2020, 12:37
Re: Assign....
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...
Deswegen kam ich auf die Idee, daß das wohl an den Einstellungen was nicht stimmt...
- 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....
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.
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.
-
- Beiträge: 143
- Registriert: Mo 30. Mär 2020, 12:37
Re: Assign....
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.....
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.....
- 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....
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
-
- Beiträge: 143
- Registriert: Mo 30. Mär 2020, 12:37
Re: Assign....
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.
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.