baffie Δημοσ. 9 Νοεμβρίου 2012 Δημοσ. 9 Νοεμβρίου 2012 Γεια σας! εχω ενα πρόβλημα! θέλω να κένω έξοδο από ένα StringGrid στην borland σε ενα αρχείο δεν με πειράζει ότι και να είναι ειτε txt,word,exel! μπορεί κάποιοσ να με βοηθήσει? ευχαριστώ εκ των πρωτέρων
Directx Δημοσ. 9 Νοεμβρίου 2012 Δημοσ. 9 Νοεμβρίου 2012 Μπορείς να διαβάσεις το περιεχόμενο κάθε κελιού μέσο του TStringGrid->Cells[Col][Row]. Ύστερα το πως θα το γράψεις σε αρχείο εξαρτάται, μια απλή λύση είναι η χρήση της TStringList ως εξής: > std::auto_ptr<TStringList> ptrStrList(new TStringList()); for(int nRow = 0; nRow < StringGrid1->RowCount; nRow++) for(int nCol = 0; nCol < StringGrid1->ColCount; nCol++) ptrStrList->Add(StringGrid1->Cells[nCol][nRow]); ptrStrList->SaveToFile("DUMP.TXT"); * Το auto_ptr προϋποθέτει ότι έχεις φορτώσει το memory (#include <memory>). ΕΙΣΟΔΟΣ: ΕΞΟΔΟΣ: > 0;0 0;1 0;2 0;3 0;4 1;0 1;1 1;2 1;3 1;4 2;0 2;1 2;2 2;3 2;4 3;0 3;1 3;2 3;3 3;4 4;0 4;1 4;2 4;3 4;4
baffie Δημοσ. 26 Νοεμβρίου 2012 Μέλος Δημοσ. 26 Νοεμβρίου 2012 Σε ευχαριστω πολυ απλα το προβλημα μου τώρα ειναι οτι κανει αποθυκευση στο αρχειο αλλα αν κλεισω το προγραμμα και το ξανανοιξω και ξανα κανω αποθυκευση το αποθυκευει πανω στα προηγούμενα αλλα εγω το θελω για αρχείο τι μπορο να κανω για να κανει αποθυκευση στη συνεχεια του αρχειου και οχι απο την αρχή???
Directx Δημοσ. 26 Νοεμβρίου 2012 Δημοσ. 26 Νοεμβρίου 2012 Μπορείς αντί να σώσεις το περιεχόμενο του TStringList ως "νέο" αρχείο (SaveToStream) να το σώσεις σε ένα TFileStream το οποίο αν υπάρχει το αρχείο (FileExists) θα ανοίγει σε κατάσταση τροποποίησης των περιεχομένων του (fmOpenReadWrite) ή αν δεν υπάρχει σε κατάσταση δημιουργίας (fmCreate). Στην περίπτωση τροποποίησης θα πρέπει να μετακινηθείς (fStream->Seek) στο τέλος του TFileStream ώστε τα νέα δεδομένα του TStringList να προστεθούν εκεί. > std::auto_ptr<TStringList> ptrStrList(new TStringList()); for(int nRow = 0; nRow < StringGrid1->RowCount; nRow++) for(int nCol = 0; nCol < StringGrid1->ColCount; nCol++) ptrStrList->Add(StringGrid1->Cells[nCol][nRow]); /* Create or open a file stream */ std::auto_ptr<TFileStream> fStream(new TFileStream("DUMP.TXT", FileExists("DUMP.TXT") ? fmOpenReadWrite: fmCreate)); /* Move to end of stream (append) */ fStream->Seek(0, soFromEnd); /* Store TStringList data on stream end */ ptrStrList->SaveToStream(fStream.get());
baffie Δημοσ. 26 Νοεμβρίου 2012 Μέλος Δημοσ. 26 Νοεμβρίου 2012 Αυτό το κάνω σαν ξεχωριστη συνάρτηση? βασικα δεν το καταλαβα πολυ μπορεις να μου δωσεις λιγες περισσότερες πληροφορίες?
Directx Δημοσ. 26 Νοεμβρίου 2012 Δημοσ. 26 Νοεμβρίου 2012 Αυτό το κάνω σαν ξεχωριστη συνάρτηση? βασικα δεν το καταλαβα πολυ μπορεις να μου δωσεις λιγες περισσότερες πληροφορίες? Απλά αντικαθιστάς το TStringList->SaveToFile με τον νέο κώδικα: > /* Create or open a file stream */ std::auto_ptr<TFileStream> fStream(new TFileStream("DUMP.TXT", FileExists("DUMP.TXT") ? fmOpenReadWrite: fmCreate)); /* Move to end of stream (append) */ fStream->Seek(0, soFromEnd); /* Store TStringList data on stream end */ ptrStrList->SaveToStream(fStream.get()); Από εκεί και πέρα, με πολύ απλά λόγια, επειδή το SaveToFile αντικαθιστά τα προηγούμενα δεδομένα του αρχείου μας, εμείς ζητάμε από την TStringList να αποθηκεύσει τα περιεχόμενα της σε ένα TFileStream. Αυτό το κάνουμε με την εντολή TStringList->SaveToStream η οποία αντί για όνομα αρχείου ζητά ένα Stream. Το TFileStream που θα δώσουμε στην ->SaveToStream, αναπαριστά το αρχείο μας, μας επιτρέπει επίσης να γράψουμε στο αρχείο με τέτοιο τρόπο (fmOpenReadWrite) που ΔΕΝ θα σβήσουν τα προηγούμενα δεδομένα του, πράγμα που επιθυμούμε. Δημιουργούμε (fmCreate) λοιπόν (αν δεν υπάρχει ήδη ή ανοίγουμε το αρχείο για ανάγνωση & εγγραφή "fmOpenReadWrite" - αν υπάρχει ήδη) το αρχείο μας μέσο του TFileStream, πάμε στο τέλος του (->Seek) και ζητούμε από την TStringGrid να κάνει SaveToStream τα περιεχόμενα της, οπότε αυτά προστίθενται στο τέλος του αρχείου (TFileStream) μας. Πιο αναλυτικά δεν μπορώ να τα εξηγήσω.
baffie Δημοσ. 27 Νοεμβρίου 2012 Μέλος Δημοσ. 27 Νοεμβρίου 2012 Σας ευχαριστώ πάρα πολυ για την βοήθεια σας, ειναι πολυ σημαντική!! Θα ήθελα να κάνω αλλη μία ερώτηση!! Έτσι όπως τυπόνωνται τώρα τοκάθε περιεχόμενο κελιού μπαίνει κάτω απο το προηγούμενο αλλα εγώ θα ήθελα να μπαίνουν το ένα δίπλα στο άλλο και μετα απο καποια στιγμή να αλλάζει γραμμή! υπάρχει κάποια εντολή γι'αυτό????
Directx Δημοσ. 27 Νοεμβρίου 2012 Δημοσ. 27 Νοεμβρίου 2012 Σας ευχαριστώ πάρα πολυ για την βοήθεια σας, ειναι πολυ σημαντική!! Θα ήθελα να κάνω αλλη μία ερώτηση!! Έτσι όπως τυπόνωνται τώρα τοκάθε περιεχόμενο κελιού μπαίνει κάτω απο το προηγούμενο αλλα εγώ θα ήθελα να μπαίνουν το ένα δίπλα στο άλλο και μετα απο καποια στιγμή να αλλάζει γραμμή! υπάρχει κάποια εντολή γι'αυτό???? Κάποια έτοιμη εντολή για όλα αυτά όχι, θα πρέπει να γράψεις κώδικα που να φορμάρει την έξοδο του TStringGrid με επιθυμητό τρόπο. Για παράδειγμα.. >#include <fstream> #include <iostream> [..] > [..] // Create a Unicode wofstream std::wofstream fOut("DUMP.TXT", ios::app); // ofstream ready? if(!fOut) ShowMessage("Cannot open file for write!"); else { // Dump each TStringGrid row to fOut (wofstream). // Separate each row column with tab (\t) // Every row ends with \n (endl) for(int nRow = 0; nRow < StringGrid1->RowCount; nRow++) { for(int nCol = 0; nCol < StringGrid1->ColCount; nCol++) fOut << StringGrid1->Cells[nCol][nRow].w_str() << (nCol != StringGrid1->ColCount - 1 ? "\t": ""); fOut << std::endl; } // Save changes. fOut.close(); } * Καθώς δεν έχω πρόχειρη κάποια παλαιότερη έκδοση του μεταφραστή, αν η έκδοση C++ Builder που χρησιμοποιείς δεν υποστηρίζει UNICODE τότε άλλαξε τα wofstream σε ofstream και το .w_str() σε .c_str().. Η έξοδος που δίνει ο κώδικας είναι της μορφής: > 0;0 0;1 0;2 0;3 0;4 1;0 1;1 1;2 1;3 1;4 2;0 2;1 2;2 2;3 2;4 3;0 3;1 3;2 3;3 3;4 4;0 4;1 4;2 4;3 4;4
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα