Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi typisierte Datei zum Speichern fehlerhaft (https://www.delphipraxis.net/51627-typisierte-datei-zum-speichern-fehlerhaft.html)

shmia 16. Aug 2005 09:38

Re: typisierte Datei zum Speichern fehlerhaft
 
Zitat:

Zitat von Technikus
ich weiß mit den drei Punkten nichts anzufangen. Was kommt dort rein, was muss ich aus meinem Quellcode weglassen.

Statt write schreibst du fs.WriteBuffer.
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;

Technikus 16. Aug 2005 09:52

Re: typisierte Datei zum Speichern fehlerhaft
 
Hallo shmia,

ich habe den Code geändert und in der Zeile
Delphi-Quellcode:
fs.WriteBuffer(Messwert, Sizeof(Messwert));
die Fehlermeldung: Es gibt keine überladene Version non 'WriteBuffer', die man mit diesen Argumenten aufrufen kann.
Gruß Technikus

Kroko1999 16. Aug 2005 10:01

Re: typisierte Datei zum Speichern fehlerhaft
 
fs.writesbuffer + F1 und lesen

Technikus 21. Aug 2005 19:25

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:
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;
In der Hilfe finde ich z.B. den Syntax
[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

marabu 21. Aug 2005 20:30

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:
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;
Grüße vom marabu

Robert_G 21. Aug 2005 20:49

Re: typisierte Datei zum Speichern fehlerhaft
 
Zitat:

Zitat von marabu
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:

Jupp. XML wäre wohl das Ziel. (CSV halte ich für ziemlich haarig...)
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:
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.
Nun hast du eine laufende Lösung bis du XML unterstützen willst.
Vielleicht baut das einer der "neuen dpCollection-Fritzen" hier in der Zwischenzeit ein. ;)
Delphi-Quellcode:
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;
Nicht gerade elegant, allemale netter als all das record-Gefriemel. :)

btw: Die dpCollection gibt's hier: dpCollectiondpCollection

Technikus 22. Aug 2005 16:01

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:
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;
Gruß
Technikus

marabu 22. Aug 2005 16:45

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:
procedure TForm1.Button1_SpeichernClick(Sender: TObject);
var
  Messwert: TLeistung;
  Buffer: array [1..32] of byte absolute Messwert;
  ...
begin
  ...
  fs.WriteBuffer(Buffer, Sizeof(Messwert));
  ...
Grüße vom marabu

Technikus 22. Aug 2005 17:04

Re: typisierte Datei zum Speichern fehlerhaft
 
Hallo marabu,
jetzt meldet er, dass er nicht mit dem "absolute" zurechkommt.

Delphi-Quellcode:
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;
Gruß Technikus

Khabarakh 22. Aug 2005 17:11

Re: typisierte Datei zum Speichern fehlerhaft
 
Welche Delphiversion hast du? Keine Probleme mit D6 und D2005.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:57 Uhr.
Seite 2 von 3     12 3      

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