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

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

Δημοσ.

Γεια σας! εχω ενα πρόβλημα! θέλω να κένω έξοδο από ένα StringGrid στην borland σε ενα αρχείο δεν με πειράζει ότι και να είναι ειτε txt,word,exel! μπορεί κάποιοσ να με βοηθήσει? ευχαριστώ εκ των πρωτέρων

Δημοσ.

Μπορείς να διαβάσεις το περιεχόμενο κάθε κελιού μέσο του 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>).

 

 

ΕΙΣΟΔΟΣ:

post-41640-0-22938500-1352466208_thumb.png

 

ΕΞΟΔΟΣ:

>
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

 

  • 3 εβδομάδες αργότερα...
Δημοσ.

Σε ευχαριστω πολυ απλα το προβλημα μου τώρα ειναι οτι κανει αποθυκευση στο αρχειο αλλα αν κλεισω το προγραμμα και το ξανανοιξω και ξανα κανω αποθυκευση το αποθυκευει πανω στα προηγούμενα αλλα εγω το θελω για αρχείο

τι μπορο να κανω για να κανει αποθυκευση στη συνεχεια του αρχειου και οχι απο την αρχή???

Δημοσ.

Μπορείς αντί να σώσεις το περιεχόμενο του 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());

 

Δημοσ.

Αυτό το κάνω σαν ξεχωριστη συνάρτηση?

βασικα δεν το καταλαβα πολυ μπορεις να μου δωσεις λιγες περισσότερες πληροφορίες?

Δημοσ.

Αυτό το κάνω σαν ξεχωριστη συνάρτηση?

βασικα δεν το καταλαβα πολυ μπορεις να μου δωσεις λιγες περισσότερες πληροφορίες?

Απλά αντικαθιστάς το 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) μας.

 

Πιο αναλυτικά δεν μπορώ να τα εξηγήσω.

Δημοσ.

Σας ευχαριστώ πάρα πολυ για την βοήθεια σας, ειναι πολυ σημαντική!!

Θα ήθελα να κάνω αλλη μία ερώτηση!!

Έτσι όπως τυπόνωνται τώρα τοκάθε περιεχόμενο κελιού μπαίνει κάτω απο το προηγούμενο

αλλα εγώ θα ήθελα να μπαίνουν το ένα δίπλα στο άλλο και μετα απο καποια στιγμή να αλλάζει γραμμή!

υπάρχει κάποια εντολή γι'αυτό????

Δημοσ.

Σας ευχαριστώ πάρα πολυ για την βοήθεια σας, ειναι πολυ σημαντική!!

Θα ήθελα να κάνω αλλη μία ερώτηση!!

Έτσι όπως τυπόνωνται τώρα τοκάθε περιεχόμενο κελιού μπαίνει κάτω απο το προηγούμενο

αλλα εγώ θα ήθελα να μπαίνουν το ένα δίπλα στο άλλο και μετα απο καποια στιγμή να αλλάζει γραμμή!

υπάρχει κάποια εντολή γι'αυτό????

Κάποια έτοιμη εντολή για όλα αυτά όχι, θα πρέπει να γράψεις κώδικα που να φορμάρει την έξοδο του 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

 

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...