Προς το περιεχόμενο

Delphi - Kαταχώρηση εγγραφων σε typedFile


Μέλας Κύων

Προτεινόμενες αναρτήσεις

Δημοσ.

αντιμετωπίζω πρόβλημα με καταχώρηση εγγραφών (καθορισμένου τύπου από μενα) σε αρχείο typed (οχι text). δηλ. σε μια φόρμα πχ έχω πλαισια κειμενου για καταχώρηση πεδιων κι ενα κουμπι για καταχώρηση των εγγραφών σε αρχείο :

file of [TypeName].

 

-----------------

δηλωνω κατ'αρχην στο interface τμημα του παραθύρου κωδικα τον καθορισμένο απο μενα τυπο εγγραφών και στη συνεχεια κανω δηλωση μεταβλητών εγγραφών και αρχειου:

 

private

{ Private declarations }

type

SyndromRec = record

Eponymo : string[15];

Onoma : string[10];

Poli : string[15];

Tel : string[10];

end;

var

Syndromitis : SyndromRec;

f : file of SyndromRec;

 

μετα στον κώδικα της διαδικασίας συμβαντος του κουμπιου:

 

procedure TForm1.BtnNewRecClick(Sender: TObject);

 

begin

 

Assignfile( f, 'Syndbook.dat');

Syndromitis.Eponymo := txtEponymo.Text ;

Syndromitis.Onoma := txtOnoma.Text ;

Syndromitis.Poli := txtPoli.Text ;

Syndromitis.Tel := txtTel.Text ;

reset (f);

write( f , Syndromitis );

CloseFile(f);

 

end;

 

[οπου txtEponymo.Text... κλπ οι ονομασίες των components κειμενου]

 

ολα πανε καλα χωρις bugs αλλά καθε φορά με το πατημα του κουμπιου εκχώρησης εγγραφων BtnNewRec εγγραφεται στο αρχειο Syndbook.dat μια

γραμμή - εγγραφή , παντα η τελευταία που εκχωρω. Με αλλα λόγια η τελευταια εγγραφή που εκχωρω αντικαθιστα την προηγούμενη παντα στην πρωτη γραμμη του αρχειου λειτουργοντας σαν rewrite ki oxi σαν reset.

Aσχοληθηκα παλιοτερα με Pascal αλλα με Delphi δε γνωρίζω πως να κινηθω σε τετοιου ειδους εκφρασεις.

Αν καποιος μπορει να μου δωσει τα φωτα του..:|

Δημοσ.

Δεν έχω Delphi εδώ που είμαι, αλλά νομίζω ότι η reset (f) σου δημιουργεί το πρόβλημα, καθώς τοποθετεί τον file-pointer στη θέση "0", και φυσικά η write γράφει πάνω στην 1η εγγραφή.

 

Αν θυμάμαι καλά: Ο αριθμός των εγγραφών δίνεται από την filesize(f), οπότε αντικαθιστώντας την reset με μια seek(f, filesize(f)), λογικά θα κάνει αυτό που θες.

 

Hope it helps.

Δημοσ.

Η reset(f) μετακινεί τον δείκτη της τρέχουσας εγγραφής στην αρχή του αρχείου σου οπότε αυτό που γίνεται στον κώδικα σου είναι απολύτως φυσιολογικό. Αντικατέστησε την με append(f) οπότε θα γράφεις πάντα στο τέλος του αρχείου.

 

H seek θα σου είναι χρήσιμη όταν θα θέλεις να μετακινηθείς σε μια εγγραφή που θέλεις να διορθώσεις, για νέες έγγραφές το άνοιγμα με append θα δουλέψει μια χαρά.

Δημοσ.
...

H seek θα σου είναι χρήσιμη όταν θα θέλεις να μετακινηθείς σε μια εγγραφή που θέλεις να διορθώσεις, για νέες έγγραφές το άνοιγμα με append θα δουλέψει μια χαρά.

Είχα μείνει με την εντύπωση ότι η append δουλεύει μόνο με text files, γι αυτό και πρότεινα seek μετά την τελευταία υπάρχουσα εγγραφή.

 

Δεν επιμένω, πάνε κάμποσα χρόνια (δυστυχώς) που σταμάτησα να γράφω κώδικα...

Δημοσ.

Και γω έχω σταματήσει να χρησιμοποιώ flat αρχεία εδώ και κάτι χρόνια αλλά θυμάσαι πολυ καλύτερα...έχεις δίκιο. Μόλις το κοίταξα στο help της Delphi, η append είναι μόνο για text files.

Δημοσ.

δυστυχως ουτε η append δουλευει (μονο για τεξτ αρχεια), ouτε η seek(f,filesize(f)) . Ισως η Delphi δεν υποστηρίζει εκφρασεις τετοιες για flat αρχεια. Θα προσπαθησω να βρω αλλες εντολες αν υπαρχουν μεχρι να το πετυχω

Δημοσ.

Καλά στα είπε ο gerontas, θα έπρεπε να δουλεύει.

Τσέκαρέ το με ένα messagebox στο οποίο θα δείχνεις ότι σου επιστρέφει η FilePos(f) ακριβώς μετά από την seek(f, filesize(f)).

 

Υπ' όψιν ότι θέλει και reset και seek για να δουλέψει.

Δημοσ.

Το βρηκα τελικα , εψαξα σε τουτοριαλ. (αμα μενεις σε Pascal και χανεις τις

εξελιξεις αυτα παθαινεις )

Λειπει η δεσμευμενη μεταβλητη FileMode!

Παιρνει 3 σταθερες τιμες : fmOpenRead , fmOpenWrite , fmOpenReadWrite αναλογα τη χρηση του αρχειου.

μετα με reset(f), seek(f,filesize(f)) οπως το'πε κι ο γέροντας και τα υπολοιπα γνωστά.

Ευχαριστώ παιδια για τη βοηθεια.

Δημοσ.

Από τη βοήθεια του Delphi:

> The default value of FileMode is 2 (Read/Write access).

Κάτι άλλο θα πρέπει να πήγαινε στραβά... Anyway, αφού τα κατάφερες δεν τίθεται ζήτημα.

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...