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 Record laden (https://www.delphipraxis.net/89075-record-laden.html)

shmia 26. Mär 2007 17:56

Re: Record laden
 
Records in Dateien zu speichern macht nur in Ausnahmefällen einen Sinn.
Sobald man in einem Record nur eine einzige Variable hinzunimmt, knallts an allen Ecken, da nun die Recordlänge verändert wurde.
Heutzutage (im 21. Jahrhundert) braucht man eine robuste, selbsterklärende Datenstruktur innerhalb der Datei.
Das einfachste sind INI-Dateien.
Deutlich flexibler (aber auch komplexer) sind XML-Dateien.
Für kompakte Datenhaltung kann man auch den Mechanismus von IFF ( http://de.wikipedia.org/wiki/Interchange_File_Format ) abschauen:
Jeder Datenwert besteht aus einer ID (4 Bytes), gefolgt von einer Längenangabe (4 Bytes), gefolgt von den eigentlichen Nutzdaten.

himitsu 26. Mär 2007 18:09

Re: Record laden
 
Abgesehn davon, daß an dem Program rein garnichts geht und die CodeFormatierung grad noch so ansatzweise zu erkennen ist .... ähhhhhhh?

Also bei Beenden wirdja versucht 4 einträge zu speichern, selbst wenn das Array leer ist.
Wärend Len aber mit der tatsächlichen Zahl gepeichert wird.
- beim Auslesen kann da also nichts stimmen (Len <> gepeicherte Datensätze)
- gespeichert kann aber sowieso nichts werden, da ja auf nichts zugegriffen wird

die Arraylänge solltest du besser aus dem Array lesen und nicht über eine nichtssagende globale Variable (n) ... vorallem wenn du die Arraygröße nicht anpasst.

Ich dachte ja .. OK, wenn der schon so speichern will, dann füge ich mal ein paar (mindestens 4) Einträge ein, aber Button2Click verreckt ja auch.


Also erstmal wäre es wohl gut, wenn du den Variablen "schöne" Namen gibst, damit man auch weiß wofür die sind.

statt n := n + 1; würde sich eine lokale Variable für "n" anbieten und dann folgendes
Delphi-Quellcode:
n := Length(T);
SetLength(T, n + 1);
OK, also hab ich dann erstmal das globale "n" aus der Unit1 gelöscht und wolte sehn wo das verwendet wurde, aber die erwartete Fehlermeldung "n ist nicht delkariert" kam nicht .. was war das für ein schock, also ich dann in Unit2 noch eine globale Variable mit dem selben Namen fand.

Also ehrlich ... es ist wirklich besser, wenn du erstmal diese Dinge verbesserst, bevor ich hier noch ein paar n's finde :wall:

grader 26. Mär 2007 18:19

Re: Record laden
 
Danke dir für deine Mühe Chemiker, kanns mir aber erst später anschauen da ich noch für Physik lernen muss :thumb:

@shmia

Mein eigentliches vorhaben war es in einer XML zu speichern und da gab es auch ein schönes Tutorial irgendwo, doch irgendwie hat bei meiner Delphi Version ein Menüpunkt gefehlt, was das weitere Vorgehen vereitelt hat.. Und da es "nur" ein Projekt für den Informatikunterricht sein soll und wir gerade mal ein Halbjahr in Delphi programmiert haben (mehr schlecht als recht) hab ich mich dann für die Methode entschieden.. Aber wenn das alles läuft werd ich das wohl nochmal in Erwägung ziehen!

@himitsu

Also das gar nichts geht würd ich mal nicht behaupten, dass es ziemlich wirr programmiert ist geb ich zu, da ich andauernd irgendwas geändert habe.. Bin halt Anfänger, da probiert man viel rum und vergisst dann mal hier und da was zu löschen oder bringt Variablen durcheinander!

Werd morgen den Quelltext mal etwas aufräumen, doch was hat es mit den Units 2-6 auf sich? Die hab ich in Delphi entfernt, doch anscheinend ist Unit1 von denen immernoch abhängig!

grader 28. Mär 2007 15:20

Re: Record laden
 
Hallo Leute!

Ich bins nochmal, bin grad am aufräumen des Quelltextes und habe schon unnötige bzw. doppelte Variablen entfernt und habe jetzt folgendes Problem bin schon kurz vorm verzweifeln!

Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var Jahr, Monat, Tag: word;
begin
  SetLength(T, Length(T) + 1);
  DecodeDate(DateTimePicker1.Date, Jahr, Monat, Tag);
  T[Length(T)].J:=Jahr;
  T[Length(T)].M:=Monat;
  T[Length(T)].T:=Tag;
  T[Length(T)].Zh:=Edit1.Text;
  T[Length(T)].Zm:=Edit2.Text;
  T[Length(T)].B:=Edit8.Text;
  T[Length(T)].O:=Edit3.Text;
  T[Length(T)].T1:=Edit4.Text;
  T[Length(T)].T2:=Edit5.Text;
  T[Length(T)].T3:=Edit6.Text;
  T[Length(T)].T4:=Edit7.Text;
  T[Length(T)].P:=IntToStr(p);
  T[Length(T)].N:=RichEdit1.Text;
end;
Bei Form1.Show wird SetLength(T, 0) ausgeführt und er setzt auch nach jedem Klick Length(T) um eins nach oben wie gewollt..

ABER: Irgendwie haut das nicht hin, ich kann einen Eintrag (z.B. T[2].B) nur direkt nach dem erstellen ausgeben, sobald ich wieder einen neuen erstelle gibts er nichts ("") aus!

:wall: :wall: :wall:

Hawkeye219 28. Mär 2007 15:25

Re: Record laden
 
Hallo,

der höchste Index, den du verwenden darfst, hat den Wert High(T), nicht Length(T).

Gruß Hawkeye

TStringlist 28. Mär 2007 15:48

Re: Record laden
 
...soll auch heißen: Ein Element T[Length(T)] gibt es nicht, weil das erste Element bei dynamischen Arrays immer den Index 0 besitzt! Ergo hat das letzte Element den Index: Length(T)-1

Delphi-Quellcode:
T[Length(T)-1] := ....

grader 28. Mär 2007 15:57

Re: Record laden
 
Öhm das mit dem High hab ich nicht so ganz verstanden, aber mit T[Length(T)-1] funktioniert es :thumb:

Danke euch

Hawkeye219 28. Mär 2007 16:02

Re: Record laden
 
Zitat:

Zitat von grader
Öhm das mit dem High hab ich nicht so ganz verstanden

Hier ist etwas zum Auffrischen deiner Kenntnisse: DSDT-Link
Insbesondere der Abschnitt "Dynamische Arrays" dürfte in diesem Zusammenhang interessant sein.

Gruß Hawkeye

grader 28. Mär 2007 16:10

Re: Record laden
 
werds mir mal durchlesen :zwinker:


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:06 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