Delphi-PRAXiS
Seite 3 von 3     123   

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)

marabu 22. Aug 2005 17:42

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:
procedure TForm1.Button1_SpeichernClick(Sender: TObject);
var Messwert: TLeistung;
    Buffer: SysUtils.PByteArray;
begin
  Buffer := @Messung;
  ...
  fs.WriteBuffer(Buffer^, Sizeof(Messung));
  ...
end;
marabu

Robert_G 22. Aug 2005 18:10

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:
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;
Benutzt werden kann das so: (Ist Im EndEffekt dein Code ;) )
Delphi-Quellcode:
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;
Da gibt es kein Recordgefriemel, kein absolute, keine Compiler zickereien und keinen Byten array...

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. ;)

Technikus 22. Aug 2005 18:17

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:

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

marabu 22. Aug 2005 18:41

Re: typisierte Datei zum Speichern fehlerhaft
 
Zitat:

Zitat von Technikus
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

Es ist alles in Ordnung, Technikus. Wer Hilfe braucht, bekommt sie. Manchmal fällt die Einschätzung schwer, worauf man beim Hilfesuchenden aufbauen kann, aber wir lernen alle hinzu - so oder so.

Zitat:

Zitat von Technikus
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..."

Es hilft manchmal, wenn man weiß mit welcher Delphi-Version der Hilfesuchende arbeitet. Diese Angabe kannst du in deinem Benutzerprofil hier in der DP eintragen.

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:
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;
...
marabu

Technikus 22. Aug 2005 18:54

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;

marabu 22. Aug 2005 19:13

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

Technikus 22. Aug 2005 19:32

Re: typisierte Datei zum Speichern fehlerhaft
 
Hallo marabu!
Sollte ich dir das gesamte Projekt gezipt per mail mal zuschicken?
Gruß
Technikus

Technikus 22. Aug 2005 19:58

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

jfheins 22. Aug 2005 21:15

Re: typisierte Datei zum Speichern fehlerhaft
 
Schau dir mal diesen Post von Robert_G an, dort erläutert er eine neuartige Technik, mit der du deine Daten speichern kannst, mit folgenden Vorteilen:

: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 ^^)

Technikus 22. Aug 2005 21:22

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.
Seite 3 von 3     123   

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