Einzelnen Beitrag anzeigen

Robert_G
(Gast)

n/a Beiträge
 
#22

Re: typisierte Datei zum Speichern fehlerhaft

  Alt 22. Aug 2005, 19:10
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.
  Mit Zitat antworten Zitat