Μέλας Κύων Δημοσ. 25 Μαρτίου 2007 Δημοσ. 25 Μαρτίου 2007 αντιμετωπίζω πρόβλημα με καταχώρηση εγγραφών (καθορισμένου τύπου από μενα) σε αρχείο 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 δε γνωρίζω πως να κινηθω σε τετοιου ειδους εκφρασεις. Αν καποιος μπορει να μου δωσει τα φωτα του..:|
gerontas Δημοσ. 25 Μαρτίου 2007 Δημοσ. 25 Μαρτίου 2007 Δεν έχω Delphi εδώ που είμαι, αλλά νομίζω ότι η reset (f) σου δημιουργεί το πρόβλημα, καθώς τοποθετεί τον file-pointer στη θέση "0", και φυσικά η write γράφει πάνω στην 1η εγγραφή. Αν θυμάμαι καλά: Ο αριθμός των εγγραφών δίνεται από την filesize(f), οπότε αντικαθιστώντας την reset με μια seek(f, filesize(f)), λογικά θα κάνει αυτό που θες. Hope it helps.
Jacaranda Bill Δημοσ. 25 Μαρτίου 2007 Δημοσ. 25 Μαρτίου 2007 Η reset(f) μετακινεί τον δείκτη της τρέχουσας εγγραφής στην αρχή του αρχείου σου οπότε αυτό που γίνεται στον κώδικα σου είναι απολύτως φυσιολογικό. Αντικατέστησε την με append(f) οπότε θα γράφεις πάντα στο τέλος του αρχείου. H seek θα σου είναι χρήσιμη όταν θα θέλεις να μετακινηθείς σε μια εγγραφή που θέλεις να διορθώσεις, για νέες έγγραφές το άνοιγμα με append θα δουλέψει μια χαρά.
gerontas Δημοσ. 25 Μαρτίου 2007 Δημοσ. 25 Μαρτίου 2007 ...H seek θα σου είναι χρήσιμη όταν θα θέλεις να μετακινηθείς σε μια εγγραφή που θέλεις να διορθώσεις, για νέες έγγραφές το άνοιγμα με append θα δουλέψει μια χαρά. Είχα μείνει με την εντύπωση ότι η append δουλεύει μόνο με text files, γι αυτό και πρότεινα seek μετά την τελευταία υπάρχουσα εγγραφή. Δεν επιμένω, πάνε κάμποσα χρόνια (δυστυχώς) που σταμάτησα να γράφω κώδικα...
Jacaranda Bill Δημοσ. 25 Μαρτίου 2007 Δημοσ. 25 Μαρτίου 2007 Και γω έχω σταματήσει να χρησιμοποιώ flat αρχεία εδώ και κάτι χρόνια αλλά θυμάσαι πολυ καλύτερα...έχεις δίκιο. Μόλις το κοίταξα στο help της Delphi, η append είναι μόνο για text files.
Μέλας Κύων Δημοσ. 25 Μαρτίου 2007 Μέλος Δημοσ. 25 Μαρτίου 2007 δυστυχως ουτε η append δουλευει (μονο για τεξτ αρχεια), ouτε η seek(f,filesize(f)) . Ισως η Delphi δεν υποστηρίζει εκφρασεις τετοιες για flat αρχεια. Θα προσπαθησω να βρω αλλες εντολες αν υπαρχουν μεχρι να το πετυχω
alkisg Δημοσ. 25 Μαρτίου 2007 Δημοσ. 25 Μαρτίου 2007 Καλά στα είπε ο gerontas, θα έπρεπε να δουλεύει. Τσέκαρέ το με ένα messagebox στο οποίο θα δείχνεις ότι σου επιστρέφει η FilePos(f) ακριβώς μετά από την seek(f, filesize(f)). Υπ' όψιν ότι θέλει και reset και seek για να δουλέψει.
Μέλας Κύων Δημοσ. 26 Μαρτίου 2007 Μέλος Δημοσ. 26 Μαρτίου 2007 Το βρηκα τελικα , εψαξα σε τουτοριαλ. (αμα μενεις σε Pascal και χανεις τις εξελιξεις αυτα παθαινεις ) Λειπει η δεσμευμενη μεταβλητη FileMode! Παιρνει 3 σταθερες τιμες : fmOpenRead , fmOpenWrite , fmOpenReadWrite αναλογα τη χρηση του αρχειου. μετα με reset(f), seek(f,filesize(f)) οπως το'πε κι ο γέροντας και τα υπολοιπα γνωστά. Ευχαριστώ παιδια για τη βοηθεια.
alkisg Δημοσ. 26 Μαρτίου 2007 Δημοσ. 26 Μαρτίου 2007 Από τη βοήθεια του Delphi: > The default value of FileMode is 2 (Read/Write access). Κάτι άλλο θα πρέπει να πήγαινε στραβά... Anyway, αφού τα κατάφερες δεν τίθεται ζήτημα.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.