Thema: Delphi Record laden

Einzelnen Beitrag anzeigen

Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.858 Beiträge
 
Delphi 11 Alexandria
 
#20

Re: Record laden

  Alt 26. Mär 2007, 17:33
Hallo grader,

Zitat von himitsu:
strLaenge = maximale StringLänge (mehr geht dann nicht rein und soviel wird auch immer gespeichert, selbt wenn weniger drin ist)
Das sollte aber bei den heutigen Festplatten keine Problem sein.


Vieleicht hilft dir das weiter:

Delphi-Quellcode:
unit FileStreamHilfeUnit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;
    Edit7: TEdit;
    Edit8: TEdit;
    Edit9: TEdit;
    Edit10: TEdit;
    Edit11: TEdit;
    Edit12: TEdit;
    Edit13: TEdit;
    Edit14: TEdit;
    Edit15: TEdit;
    Edit16: TEdit;
    Edit17: TEdit;
    Edit18: TEdit;
    Edit19: TEdit;
    Edit20: TEdit;
    Edit21: TEdit;
    Edit22: TEdit;
    Edit23: TEdit;
    Edit24: TEdit;
    Edit25: TEdit;
    Edit26: TEdit;
    Button1: TButton;
    Button2: TButton;
    DatenSatzNr: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

const strLaenge= 20; // Strings sind 20 Zeichen lang.
type
TDatum = packed record
    T: Word;
    M: Word;
    J: Word;
    Zh: string[strLaenge];
    Zm: string[strLaenge];
    B: string[strLaenge];
    O: string[strLaenge];
    T1: string[strLaenge];
    T2: string[strLaenge];
    T3: string[strLaenge];
    T4: string[strLaenge];
    P: string[strLaenge];
    N: string[strLaenge];
end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function Stream_MW_Rec_Anhaengen
                           (f: TFileStream; MWRec: TDatum): boolean;
begin
  try
    f.Position:=0;
    f.Seek(0, soFromEnd); // Datenzeiger auf das Ende des Streams setzen.
    f.WriteBuffer(MWRec, SizeOf(TDatum));
    result:= TRUE;
  except
    ShowMessage('Es ist beim Datensatz speichern ein Fehler aufgetreten!');
    result:= FALSE;
  end;
end;
function Stream_MW_Rec_Lesen (f: TFileStream; var MWRec: TDatum;
                              DatensatzNr: integer): boolean;
begin
  try
    f.Position:=0;
    // An dieser Stelle wird der Datei-Zeiger auf den zu lesenden
    // Datensatz gestellt. Durch -soFromBeginning- wird der Dateizeiger
    // auf den Anfang gesellt.
    f.Seek((SizeOf(TDatum)*DatensatzNr), soFromBeginning);
    f.ReadBuffer(MWRec, SizeOf(TDatum));
    result:= TRUE;
  except
    ShowMessage('Es ist beim Datensatz lesen ein Fehler aufgetreten!');
    result:= FALSE;
  end;
end;

function Stream_MW_Rec_DatenSatzAnzahl
                   (f: TFileStream; MWRec: TDatum): integer;
begin
  result:= 0;
  if f.Size>0 then
  begin
    // Berechnung: Gesamte Stream-Lämge / TMW_Stream_Rec
    // Das ergibt die Datensatz-Anzahl
    result:= trunc(f.Size/SizeOf(TDatum));
  end;
end;

function Stream_oeffnen (var f: TFileStream ;const DateiName: string): boolean;
begin
  result:= TRUE;
  try
    {-- FileStream zum Lesen u. Schreiben uneingeschränkt öffnen    -----------} 
    f:= TFileStream.Create(DateiName, fmOpenReadWrite or fmShareDenyNone)
  except
    try
     { FileStream neu anlegen, tritt hier ein Fehler auf so wird das Prg. ab-  } 
     { gebrochen und zur der aufrufende Routine zurückgesprungen.              } 
     f:= TFileStream.Create(DateiName, fmCreate or fmShareDenyNone);
    except
      ShowMessage('Fehler beim Erzeugen der Datei:'+#13+DateiName);
      Exit; // Zur aufrufenden Routine zurück.
    end;
    result:= FALSE;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var f: TFileStream;
    TDatum_Rec: TDatum;
begin
  with TDatum_Rec do
  begin
    T:= strtoint(Edit1.Text);
    M:= strtoint(Edit2.Text);
    J:= strtoint(Edit3.Text);
    Zh:= Edit4.Text;
    Zm:= Edit5.Text;
    B:= Edit6.Text;
    O:= Edit7.Text;
    T1:= Edit8.Text;
    T2:= Edit8.Text;
    T3:= Edit9.Text;
    T4:= Edit10.Text;
    P:= Edit11.Text;
    N:= Edit12.Text;
  end;
  Stream_oeffnen (f ,'f:\TMData.dat');
  Stream_MW_Rec_Anhaengen (f, TDatum_Rec);
  f.Free;
end;

procedure TForm1.Button2Click(Sender: TObject);
var f: TFileStream;
    TDatum_Rec: TDatum;
begin
  Stream_oeffnen (f ,'c:\TMData.dat');
  Stream_MW_Rec_Lesen (f, TDatum_Rec, strtoint(DatensatzNr.Text)-1);
  with TDatum_Rec do
  begin
    Edit14.Text:= inttostr(T);
    Edit15.Text:= inttostr(M);
    Edit16.Text:= inttostr(J);
    Edit17.Text:=Zh;
    Edit18.Text:=Zm;
    Edit19.Text:=B;
    Edit19.Text:=O;
    Edit20.Text:=T1;
    Edit21.Text:=T2;
    Edit22.Text:=T3;
    Edit23.Text:=T4;
    Edit24.Text:=P;
    Edit25.Text:=N;
  end;
end;

end.


Bis bald Chemiker
wer gesund ist hat 1000 wünsche wer krank ist nur einen.
  Mit Zitat antworten Zitat