![]() |
typisierte Datei zum Speichern fehlerhaft
Guten Morgen,
ich habe folgenden Script zum Speichern von Daten in einer Datei geschrieben und erhalte einen Fehler in Zeile 6. Woran kanns liegen? (Delphi 2005) Vielleicht kann mir jemand helfen. Danke im voraus Technikus
Delphi-Quellcode:
type
Tleistung = record nr:byte; Spannung, Strom, Leistung: double; end; type TDatei= file of TLeistung; {Fehlermeldung: E1025 Sprach-Feature wird nicht unterstützt: 'typisierte oder untypisierte Datei'} procedure TForm1.Button1_SpeichernClick(Sender: TObject); var Messwert: TLeistung; i, anzahl: integer; Datei: TDatei; begin anzahl:=StrToInt(Edit3_Eingabe_anzahl.Text); AssignFile(Datei,'solarz.dat'); Rewrite(Datei); for i:= 1 to anzahl do with Messwert do begin nr:= i; Spannung:= StrToFloat(StringGrid1.Cells[1,i]); Strom:= StrToFloat (StringGrid1.Cells [2,i]); Leistung:=StrToFloat (StringGrid1.Cells [3,i]); Write (Datei,Messwert); end; CloseFile (Datei); end; |
Re: typisierte Datei zum Speichern fehlerhaft
(1) zur Fehlermeldung kann ich Dir leider nichts sagen unter D6 Pro klappt diese Type-Anweisung
(2) verwende nie relative Pfade :idea:
Delphi-Quellcode:
AssignFile(Datei,ExtractFilePath(Application.exeName)+'solarz.dat');
|
Re: typisierte Datei zum Speichern fehlerhaft
nimm mal das 2te Type da weg.
Code:
type
class 1 class2 bei meinem delphi 2005 personal funktionierts übrigens... |
Re: typisierte Datei zum Speichern fehlerhaft
Hallo!
phXql-->Ich habe das zweite type weggelassen, geändert hat sich nichts. koko1999-->AssignFile-habe ich geändert. Gruß Technikus |
Re: typisierte Datei zum Speichern fehlerhaft
Hallo Technikus,
hast du schonmal die Online-Hilfe zum Thema "file of" bzw. "typed file" konsultiert? Muss vielleicht ein neuer Compiler-Schalter verwendet werden? Was ist, wenn du einfach folgendes machst:
Delphi-Quellcode:
Wenn alle Stricke reißen, kannst du noch folgendes probieren:
type
TLeistung = packed record nr: byte; Spannung, Strom, Leistung: double; end; procedure TForm1.Button1_SpeichernClick(Sender: TObject); var Messwert: TLeistung; i, anzahl: integer; Datei: file of TLeistung; ...
Delphi-Quellcode:
Grüße vom marabu
var
Datei: file; begin AssignFile(Datei, 'dateiname.ext'); Rewrite(Datei, SizeOf(TLeistung)); BlockWrite(...) ... end; |
Re: typisierte Datei zum Speichern fehlerhaft
Du darf die Deklaration file of TDatentyp nicht mehr verwenden.
Grund: diese Deklaration ist nicht portabel und deshalb unter .NET nicht mehr zugelassen. Ich würde dann auf TFileStream umschwenken.
Delphi-Quellcode:
PS: vieviele Jahrzehnte wird es noch dauern, bis alle Delphi Programmierer die Finger von AssignFile lassen...
var
fs : TFileStream; begin fs := TFileStream.Create('solarz.dat', fmCreate); try ... fs.WriteBuffer(Messwert, Sizeof(Messwert)); ... finally fs.Free; end; end; |
Re: typisierte Datei zum Speichern fehlerhaft
Hallo marabu,
ich habe beide Varianten eingegeben. Beide funktionieren nicht. Ich habe in der Hilfe unter Standardtypen ganz unten etwas über Dateitypen gelesen. Da wurde es am Beispiel genau so gemacht: type Dateiname= file of Typ. Gruß Technikus |
Re: typisierte Datei zum Speichern fehlerhaft
Hallo Technikus,
habe leider kein D2005 installiert. Deine Beobachtung in der Online-Hilfe beißt sich irgendwie mit der Aussage von Andreas. marabu |
Re: typisierte Datei zum Speichern fehlerhaft
Hallo shmia,
ich weiß mit den drei Punkten nichts anzufangen. Was kommt dort rein, was muss ich aus meinem Quellcode weglassen. Könntest du bitte die Zeilen erklären. Ich bin Anfänger und kenne die Kommandos nicht. Danke Technikus |
Re: typisierte Datei zum Speichern fehlerhaft
Hai ihr,
ich kann den Code ohne Problem in einem W32 Projekt unter D2005 kompilieren. |
Re: typisierte Datei zum Speichern fehlerhaft
Zitat:
Wenn du's anschaust... da wärst du bestimmt seblst drauf gekommen.
Delphi-Quellcode:
procedure TForm1.Button1_SpeichernClick(Sender: TObject);
var Messwert: TLeistung; i, anzahl: integer; fs : TFileStream; begin anzahl:=StrToInt(Edit3_Eingabe_anzahl.Text); fs := TFileStream.Create('solarz.dat', fmCreate); try for i:= 1 to anzahl do with Messwert do begin nr:= i; Spannung:= StrToFloat(StringGrid1.Cells[1,i]); Strom:= StrToFloat (StringGrid1.Cells [2,i]); Leistung:=StrToFloat (StringGrid1.Cells [3,i]); end; fs.WriteBuffer(Messwert, Sizeof(Messwert)); finally fs.Free; end; end; |
Re: typisierte Datei zum Speichern fehlerhaft
Hallo shmia,
ich habe den Code geändert und in der Zeile
Delphi-Quellcode:
die Fehlermeldung: Es gibt keine überladene Version non 'WriteBuffer', die man mit diesen Argumenten aufrufen kann.
fs.WriteBuffer(Messwert, Sizeof(Messwert));
Gruß Technikus |
Re: typisierte Datei zum Speichern fehlerhaft
fs.writesbuffer + F1 und lesen
|
Re: typisierte Datei zum Speichern fehlerhaft
Hallo!
Danke nochmal an shmia ich bin mit meinem Problem noch nicht einen cm weitergekommen.[Delphi 2005 Prof.] Kann mir bitte jemand helfen? Das Compilieren hängt an der Stelle fs.writebuffer...
Delphi-Quellcode:
In der Hilfe finde ich z.B. den Syntax
type TLeistung= record
nr: byte; Spannung, Strom, Leistung: double; end; procedure TForm1.Button1_SpeichernClick(Sender: TObject); var Messwert: TLeistung; i, anzahl: integer; fs : TFileStream; begin anzahl:=StrToInt(Edit3_Eingabe_anzahl.Text); fs := TFileStream.Create('solarz.dat', fmCreate); try for i:= 1 to anzahl do with Messwert do begin nr:= i; Spannung:= StrToFloat(StringGrid1.Cells[1,i]); Strom:= StrToFloat (StringGrid1.Cells [2,i]); Leistung:=StrToFloat (StringGrid1.Cells [3,i]); end; fs.WriteBuffer(Messwert,Sizeof(Messwert)); finally fs.Free; end; end; [Delphi] public procedure WriteBuffer(const Buffer: array of Byte, Count: Integer); Damit kann ich aber nichts anfangen. Vielleicht weiß jemand, was ich wie ändern muss. Danke Technikus |
Re: typisierte Datei zum Speichern fehlerhaft
Hallo Technikus,
ich finde deine binäre Ausgabe nicht gut - die Ausgabe im CSV-Format oder als XML-Datei fände ich dem Anwendungsfall angemessener - aber so sollte es funktionieren:
Delphi-Quellcode:
Grüße vom marabu
type
TLeistung= record nr: byte; Spannung, Strom, Leistung: double; end; procedure TForm1.Button1_SpeichernClick(Sender: TObject); var Messwert: TLeistung; Buffer: array [1..SizeOf(TLeistung)] of byte absolute Messwert; ... begin ... fs.WriteBuffer(Buffer, Sizeof(Buffer)); ... end; |
Re: typisierte Datei zum Speichern fehlerhaft
Zitat:
Auf dem Weg dahin wäre vielleicht DFM ganz brauchbar. Ohne das öffentliche Interface des alten Records zu ändern wäre das möglich:
Delphi-Quellcode:
Nun hast du eine laufende Lösung bis du XML unterstützen willst.
interface
uses Classes, dpCollection; type TLeistung = class(TCollectionItem) private fSpannung : double; fLeistung : double; fStrom : double; fNr : Byte; published property Nr : Byte read fNr write fNr; property Spannung : double read fSpannung write fSpannung; property Strom : double read fStrom write fStrom; property Leistung : double read fLeistung write fLeistung; end; {$DEFINE TYPED_DP_COLLECTION_TEMPLATE} _COLLECTION_ITEM_ = TLeistung; {$INCLUDE dpCollection_tmpl.pas} TLeistungCollection = class(_COLLECTION_) end; implementation {$INCLUDE dpCollection_tmpl.pas} end. Vielleicht baut das einer der "neuen dpCollection-Fritzen" hier in der Zwischenzeit ein. ;)
Delphi-Quellcode:
Nicht gerade elegant, allemale netter als all das record-Gefriemel. :)
var
Leistung : TLeistung; Leistungen : TLeistungCollection; begin Leistungen := TLeistungCollection.Create(); try for i := 1 to 10 do begin Leistung := Leistungen.Add(); Leistung.Nr := i; Leistung.Spannung := ...; end; Leistungen.SaveToFile('Miep.dfm'); finally Leistungen.Free(); end; btw: Die dpCollection gibt's hier: ![]() |
Re: typisierte Datei zum Speichern fehlerhaft
Hallo!
Komme gerade erst von Arbeit, deshalb meine Verspätung. Danke erst mal für die Antworten . marabu--> ich habe den Quelltext so geändert, aber jetzt gibt es eine neue Fehlermeldung:siehe Zeile 8. Kann mir jemand bei der Fehlersuche helfen?
Delphi-Quellcode:
Gruß
type TLeistung= record
nr: byte; Spannung, Strom, Leistung: double; end; procedure TForm1.Button1_SpeichernClick(Sender: TObject); var Messwert: TLeistung; Buffer: array [1..SizeOf(TLeistung)] of byte absolute Messwert; {E2026 Konstantenausdruck erwartet} i, anzahl: integer; fs : TFileStream; begin anzahl:=StrToInt(Edit3_Eingabe_anzahl.Text); fs := TFileStream.Create('solarz.dat', fmCreate); try for i:= 1 to anzahl do with Messwert do begin nr:= i; Spannung:= StrToFloat(StringGrid1.Cells[1,i]); Strom:= StrToFloat (StringGrid1.Cells [2,i]); Leistung:=StrToFloat (StringGrid1.Cells [3,i]); end; fs.WriteBuffer(Buffer,Sizeof(Buffer)); finally fs.Free; end; end; Technikus |
Re: typisierte Datei zum Speichern fehlerhaft
Hallo Technikus,
dein Compiler mag die Art nicht, in der ich die Obergrenze des array angegeben habe. Entweder du findest den Compilerschalter, der den Code so akzeptiert, wie ich ihn dir gegeben habe, oder du änderst den Code nochmal ab:
Delphi-Quellcode:
Grüße vom marabu
procedure TForm1.Button1_SpeichernClick(Sender: TObject);
var Messwert: TLeistung; Buffer: array [1..32] of byte absolute Messwert; ... begin ... fs.WriteBuffer(Buffer, Sizeof(Messwert)); ... |
Re: typisierte Datei zum Speichern fehlerhaft
Hallo marabu,
jetzt meldet er, dass er nicht mit dem "absolute" zurechkommt.
Delphi-Quellcode:
Gruß Technikus
type TLeistung= record
nr: byte; Spannung, Strom, Leistung: double; end; procedure TForm1.Button1_SpeichernClick(Sender: TObject); var Messwert: TLeistung; Buffer: array [1..32] of byte absolute Messwert; {E1030 Ungültige Compileranweisung: 'absolute'} i, anzahl: integer; fs : TFileStream; begin anzahl:=StrToInt(Edit3_Eingabe_anzahl.Text); fs := TFileStream.Create('solarz.dat', fmCreate); try for i:= 1 to anzahl do with Messwert do begin nr:= i; Spannung:= StrToFloat(StringGrid1.Cells[1,i]); Strom:= StrToFloat (StringGrid1.Cells [2,i]); Leistung:=StrToFloat (StringGrid1.Cells [3,i]); end; fs.WriteBuffer(Buffer,Sizeof(Buffer)); finally fs.Free; end; end; |
Re: typisierte Datei zum Speichern fehlerhaft
Welche Delphiversion hast du? Keine Probleme mit D6 und D2005.
|
Re: typisierte Datei zum Speichern fehlerhaft
Hallo Technikus,
dieser thread wird langsam grotesk. Bekommst du keine Hilfestellung über die Online-Hilfe, wenn du F1 drückst und den Cursor auf die Fehlermeldung setzt? Wenn das Schlüsselwort absolute von deinem Compiler (den möchtest du mal in dein DP-Profil eintragen) nicht gemocht wird und du auch keinen Compilerschalter kennst um diese Pingeligkeit abzustellen, dann hilft nur noch das hier:
Delphi-Quellcode:
marabu
procedure TForm1.Button1_SpeichernClick(Sender: TObject);
var Messwert: TLeistung; Buffer: SysUtils.PByteArray; begin Buffer := @Messung; ... fs.WriteBuffer(Buffer^, Sizeof(Messung)); ... end; |
Re: typisierte Datei zum Speichern fehlerhaft
Hmpf...
Ich probier's nochmal... Ich habe das Item etwas angepasst, so dass es einfacher durch Strings zu füllen ist[1], außerdem bekam die Collection eine Überladung von Add, wodurch man easy ein neues Element hinzufügen kann.
Delphi-Quellcode:
Benutzt werden kann das so: (Ist Im EndEffekt dein Code ;) )
interface
uses Classes, dpCollection; type TMesswert = class(TCollectionItem) private fSpannung : double; fLeistung : double; fStrom : double; fNr : Byte; public procedure FromStrings(const aSpannung, aLeistung, aStrom: string); published property Nr : Byte read fNr write fNr; property Spannung : double read fSpannung write fSpannung; property Strom : double read fStrom write fStrom; property Leistung : double read fLeistung write fLeistung; end; {$DEFINE TYPED_DP_COLLECTION_TEMPLATE} _COLLECTION_ITEM_ = TMesswert; {$INCLUDE dpCollection_tmpl.pas} TMesswertCollection = class(_COLLECTION_) public function Add(aNr: Byte; const aSpannung, aLeistung, aStrom: string) : TMesswert; overload; end; implementation uses SysUtils; {$INCLUDE dpCollection_tmpl.pas} { TMesswert } procedure TMesswert.FromStrings(const aSpannung, aLeistung, aStrom: string); begin fSpannung := StrToFloat(aSpannung); fLeistung := StrToFloat(aLeistung); fStrom := StrToFloat(aStrom); end; { TMesswertCollection } function TMesswertCollection.Add(aNr: Byte; const aSpannung, aLeistung, aStrom: string) : TMesswert; begin with inherited Add() do begin Nr := aNr; FromStrings(aSpannung, aLeistung, aStrom); end; end;
Delphi-Quellcode:
Da gibt es kein Recordgefriemel, kein absolute, keine Compiler zickereien und keinen Byten array...
var
Messwerte : TMesswertCollection; i, Anzahl : Integer; begin if not TryStrToInt(AnzahlEdit.Text, Anzahl) then raise EInvalidCast.Create('irgendwas hier') else begin Messwerte := TMesswertCollection.Create(); try with StringGrid do for i := 1 to Anzahl do Messwerte.Add(i, Cells[1, i], Cells[2, i], Cells[3, i]); Messwerte.SaveToFile('solarz.dat'); finally Messwerte.Free(); end; end; end; Auslesen natürlich mit:
Delphi-Quellcode:
Messwerte := TMesswertCollection.Create();
try Messwerte.LoadFromFile('solarz.dat'); for i := 0 to Messwerte.Count - 1 do Messwerte[i]...;// irgendwas mit dem Messwert machen finally Messwerte.Free(); end; [1]du solltest dir aber überlegen, deine Werte _nicht_ im Grid zu halten, sondern dort nur anzuzeigen p.s.: Das Schreiben des Beitrages dauerte doppelt solange, wie das des Codes. Ich bezweifle also, dass es zu "aufwendig" ist. ;) |
Re: typisierte Datei zum Speichern fehlerhaft
Hallo! (Delphi 2005 Prof.)
Da ich mich mit Delphi noch nicht so gut auskenne, bitte ich um Nachsicht. Ich fühle mich langsam schuldig, dass ich euch zur Last falle, vielleicht liegt der Fehler auch weiter oben im Code? Sollte ich den gesamten Quellcode anhängen, den ich bis jetzt in der unit habe? Nochmal zu dem Speicherabschnitt: In der Hilfe finde ich Script, der mir nichts sagt und ich auch nicht verstehe, also ich auch nicht weiß, was ich ändern sollte. marabu, was verstehst du unter "Wenn das Schlüsselwort absolute von deinem Compiler (den möchtest du mal in dein DP-Profil eintragen) nicht gemocht..." ich habe den Quellcode wiederum wie folgt geändert: Fehlermeldung nun: in Zeile 7
Delphi-Quellcode:
Grußtype TLeistung= record nr: byte; Spannung, Strom, Leistung: double; end; procedure TForm1.Button1_SpeichernClick(Sender: TObject); var Messwert: TLeistung; Buffer: SysUtils.PByteArray; {E2003 Undefinierter Bezeichner: 'PByteArray'} i, anzahl: integer; fs : TFileStream; begin anzahl:=StrToInt(Edit3_Eingabe_anzahl.Text); fs := TFileStream.Create('solarz.dat', fmCreate); try for i:= 1 to anzahl do with Messwert do begin Buffer:=@Messwert; nr:= i; Spannung:= StrToFloat(StringGrid1.Cells[1,i]); Strom:= StrToFloat (StringGrid1.Cells [2,i]); Leistung:=StrToFloat (StringGrid1.Cells [3,i]); end; fs.WriteBuffer(Buffer^,Sizeof(Messwert)); finally fs.Free; end; end; Technikus |
Re: typisierte Datei zum Speichern fehlerhaft
Zitat:
Zitat:
Der aktuelle Fehler deutet darauf hin, dass der bei mir in der unit SysUtils definierte Typ PByteArray bei deiner Delphi-Version woanders steckt oder fehlt. Da könnte dir das weiter helfen:
Delphi-Quellcode:
marabu
type TLeistung= record
nr: byte; Spannung, Strom, Leistung: double; end; TByteArray = array [0..32767] of byte; PByteArray = ^TByteArray; procedure TForm1.Button1_SpeichernClick(Sender: TObject); var Messwert: TLeistung; Buffer: PByteArray; ... |
Re: typisierte Datei zum Speichern fehlerhaft
Hallo!
Änderung erfolgt- Fehlermeldung auch geändert.
Delphi-Quellcode:
type TLeistung= record
nr: byte; Spannung, Strom, Leistung: double; end; TByteArray= array [0..32767] of byte; PByteArray= ^TByteArray; procedure TForm1.Button1_SpeichernClick(Sender: TObject); var Messwert: TLeistung; Buffer: PByteArray; {E2410 Unsichere Zeigervariablen, Parameter oder Konstanten sind nur in unsicheren Prozeduren zulässig} i, anzahl: integer; fs : TFileStream; begin anzahl:=StrToInt(Edit3_Eingabe_anzahl.Text); fs := TFileStream.Create('solarz.dat', fmCreate); try for i:= 1 to anzahl do with Messwert do begin Buffer:=@Messwert; nr:= i; Spannung:= StrToFloat(StringGrid1.Cells[1,i]); Strom:= StrToFloat (StringGrid1.Cells [2,i]); Leistung:=StrToFloat (StringGrid1.Cells [3,i]); end; fs.WriteBuffer(Buffer^,Sizeof(Messwert)); finally fs.Free; end; end; |
Re: typisierte Datei zum Speichern fehlerhaft
Technikus, bei mir regt sich der Verdacht, dass du das Projekt nicht als VCL WIN32 angelegt hast.
Kann das sein? marabu |
Re: typisierte Datei zum Speichern fehlerhaft
Hallo marabu!
Sollte ich dir das gesamte Projekt gezipt per mail mal zuschicken? Gruß Technikus |
Re: typisierte Datei zum Speichern fehlerhaft
Hallo marabu!
ich glaube , du hast Recht, dass ich die falsche Formularanwendung .NET habe. Ich werde gesamten Code nochmal unter WIN32 einbinden. Und wenn ich soweit bin, werde ich mich nochmal melden. Danke, Danke erstmal bis dahin Gruß Technikus |
Re: typisierte Datei zum Speichern fehlerhaft
Schau dir mal
![]() :arrow: Einfach unkompliziert :arrow: Einfach erweiterbar :arrow: abwärtskompatibel, wenn bspw. ein feld hinzugefügt wird :arrow: Du kannst lange Strings verwenden :arrow: Du kannst verschachtelte Daten speichern, wie z.B. viele Messreihen (jede Beschreibung & Co. + Messwerte) (Manche müssen eben zu ihrem Glück gezwungen werden ^^) |
Re: typisierte Datei zum Speichern fehlerhaft
Hallo!
Ich habe alles nochmal geschrieben. Und jetzt funktioniert es. Jippi Ich möchte mich in aller Form bei euch bedanken. Ich kanns gar nicht laut genug in die Welt schreien. Diesen Fehler werde ich bestimmt nicht ein zweites Mal machen. Danke Bis zum nächsten Problem Technikus |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:57 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz