![]() |
Datensätze speichern
hi,
bitte entschuldigt, wenn das hier nicht passend ist. aber dies ist mein erster beitrag hier. folgendes problem habe ich. ich soll eine art datenbank erstellen, in dem eine vielzahl von schülern unterschiedlicher klassen gespeichert werden sollen. direkt eine datenbank fällt raus, weil das noch nicht behandelt wurde. will also getypte daten verwenden. bisher habe ich mich aber damit nur erfolglos rumgeschlagen. daher wollt ich hier einfach mal nachfragen, ob mir da jemand weiter helfen kann?! nutze delphi 2005 mfg |
Re: Datensätze speichern
Hi xsommo,
herzlich Willkommen in der :dp: Was hast Du denn schon versucht und wo hapert es? |
Re: Datensätze speichern
Für den Anfang könnte man das ja mal mit Records und typisierten Dateien lösen.
|
Re: Datensätze speichern
Möchte er doch machen. Zumindest verstehe ich das unter "getypten Daten" ;)
|
Re: Datensätze speichern
Was weiß denn ich, wie der Typ getypte Typen typisiert :roteyes: :mrgreen: ?
|
Re: Datensätze speichern
Zitat:
|
Re: Datensätze speichern
Zitat:
ich habe da mal nen test programm versucht, aber das will irgendwie auch ne so recht. vielleicht könnt ihr mir da ja weiterhelfen.
Delphi-Quellcode:
[edit=MrSpock]Code tag gegen Delphi Tag getauscht. Mfg, MrSpock[/edit]
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type Adresse = record name: string[50]; strasse: string[100]; plz: integer; ort: string[50]; end; TForm1 = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; Button5: TButton; Button6: TButton; Button7: TButton; Label1: TLabel; Label2: TLabel; Label3: TLabel; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Edit4: TEdit; Button8: TButton; procedure Button8Click(Sender: TObject); procedure Button7Click(Sender: TObject); procedure Button5Click(Sender: TObject); procedure Button6Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button1Click(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure FormCreate(Sender: TObject); procedure positionieren(datensatz: integer); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; datei: file of Adresse; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin AssignFile(datei,'adressen.dat'); if FileExists('adressen.dat') then ReSet(datei) else ReWrite(datei); end; procedure TForm1.FormDestroy(Sender: TObject); begin CloseFile(datei); end; procedure TForm1.positionieren(datensatz: integer); var aktdatensatz: Adresse; begin if (datensatz<0) or (datensatz>=FileSize(datei)) then exit else begin seek(datei, datensatz); read(datei, aktdatensatz); edit1.text:=aktdatensatz.name; edit2.text:=aktdatensatz.strasse; edit3.text:=IntToStr(aktdatensatz.plz); edit4.text:=aktdatensatz.ort; end; end; procedure TForm1.Button1Click(Sender: TObject); begin positionieren(0); end; procedure TForm1.Button2Click(Sender: TObject); begin positionieren(FilePos(datei)-2); //Nach dem Lesen befindet sich der Datenzeiger HINTER dem aktuellen // Datensatz; deshalb muss um ZWEI nach vorne gegangen werden end; procedure TForm1.Button3Click(Sender: TObject); begin positionieren(FilePos(datei)); end; procedure TForm1.Button4Click(Sender: TObject); begin positionieren(FileSize(datei)-1); end; const BufferSize = 32; procedure TForm1.Button6Click(Sender: TObject); var Buffer: array[0..BufferSize - 1] of Adresse; // erhöht Performance i, p: Integer; StartRecord, EndRecord: Integer; Max: Integer; begin // Datenzeiger wird VOR den akt. Datensatz gesetzt Seek(Datei, FilePos(Datei)-1); // Starten mit dem ersten Datensatz hinter dem zu löschenden StartRecord := FilePos(Datei) + 1; EndRecord := FileSize(Datei); while StartRecord < EndRecord do begin // max. BufferSize Datensätze lesen Max := BufferSize; if Max > EndRecord - StartRecord then Max := EndRecord - StartRecord; Seek(Datei, StartRecord); for i := 0 to Max - 1 do Read(Datei, Buffer[i]); // Datensätze zurückschreiben Seek(Datei, StartRecord - 1); for i := 0 to Max - 1 do Write(Datei, Buffer[i]); inc(StartRecord); end; // Datei ab hier abschneiden Truncate(Datei); Positionieren(StartRecord-1); end; procedure TForm1.Button5Click(Sender: TObject); var Buffer: array[0..BufferSize - 1] of Adresse; i, p: integer; begin Seek(datei,0); p:=0; while not eof(datei) do begin //solange lesen, bis die Datei zu Ende ist Read(datei, Buffer[p]); inc(p); //entspr. p:=p+1 end; CloseFile(datei); //Datei schließen... Buffer[p+1].name:=''; //Am Ende leeren Datensatz anhängen Buffer[p+1].strasse:=''; Buffer[p+1].plz:=0; Buffer[p+1].ort:=''; ReWrite(datei); //... und neu anlegen for i:=0 to p do write(datei, Buffer[i]); //Datensätze (bis auf letzten) in Datei schreiben positionieren(FileSize(datei)-1); //Dateizeiger auf letzten Datensatz positionieren end; procedure TForm1.Button7Click(Sender: TObject); var datensatz: Adresse; nr: integer; begin // Datenzeiger VOR den aktuellen Datensatz setzen Seek(Datei,FilePos(Datei)-1); nr:=FilePos(datei); datensatz.name:=Edit1.Text; datensatz.strasse:=Edit2.Text; //hier müsste eine Prüfung stattfinden, ob eine Zahl eingegeben wurde! //Falls keine gültige Zahl, wird -1 gespeichert datensatz.plz:=StrToIntDef(Edit3.Text, -1); datensatz.ort:=Edit4.Text; write(datei,datensatz); positionieren(nr); end; procedure TForm1.Button8Click(Sender: TObject); begin close end; end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:34 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