Spezielles Abspeichern eines TStringGrids



  • Hallo zusammen,

    ich speichere bis jetzt ein TStringGrid folgendermaßen ab:

    TStringList *list = new TStringList();
    list->Add(StringGrid1->ColCount);
    
    for (int i = 0; i < StringGrid1->RowCount; i++)
       list->Add(StringGrid1->Rows[i]->CommaText);
    
    list->SaveToFile("D:\\test.txt");
    delete list;
    

    Der Eintrag in "test.txt" sieht dann zum Beispiel so aus:

    3
    1,1,1
    -5,4,-30
    -4.32,45.921,-200.11
    

    Kann ich denn das ganze so abspeichern, dass eine Art Blocksatz entsteht bzw. das alle Kommata untereinander stehen?

    Bsp:

    3
        1,     1,      1
       -5,     4,    -30
    -4.32,45.921,-200.11
    

    Danke und liebe Grüße

    Todd



  • Hallo

    Nicht wenn du die CommaText-Eigenschaft benutzt. Du müßtest schon selber die einzelnen Zellen pro Zeile behandeln und bei jedem entsprechende Leerzeichen einfügen, je nach Länge des Zelleninhaltes.
    Wenn du aber gleich std::fstream anstelle TStringList benutzt kannst du dort den width-Manipulator benutzen um eine feste Spaltenbreite vorzugeben.

    bis bald
    akari



  • Danke akari,

    das hat geholfen.

    Liebe Grüße
    Todd



  • Okay zu früh gefreut.

    Wenn ich die Spaltenbreite einheitlich für jede Spalte mache funkioniert es. Ich möchte aber die Spaltenbreite anpassen, je nach der Stringlänge der einzelnen Einträge reihenweise innerhalb einer Spalte:

    Beispiel wie es sein soll (dynamische Spaltenbreite):

    5
    11111,    0,     0,     0,        0,
        0,    1,     2,     3,        4,
        0,    2,     4,     6,        8,
        0,    3,     6,     9,       12,
        0,    4,     8,    12,  1600000,
    

    Man sieht, dass z.B. die zweite Spalte schmaler ist als die letzte, auf Grund des
    langen Eintrags '1600000';

    Ich habe jetzt versucht das ganze zu steuern, aber ich denke ich habe einen kleinen Denkfehler drin. Vielleicht sieht ihn ja jemand und kann mir einen Tipp geben warum das ganze noch nicht funktioniert:

    //---------------------------------------------------------------------------
    #include <vcl.h>
    #pragma hdrstop
    #include "Unit1.h"
    
    #include <fstream>
    using namespace std;
    
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    int spaltenbreite(int);
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //------Einfaches Auffüllen des StringGrids----------------------------------
    
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
     for (int i=0;i<StringGrid1->ColCount;++i)
     {
      for (int j=0;j<StringGrid1->RowCount;++j)
      StringGrid1->Cells[i][j]=i*j;
     }
    }
    //-----Schreiben in das File-------------------------------------------------
    
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
     int i,j;
     AnsiString file="H:\\test.txt";
     fstream f(file.c_str(),ios::out);
    
     f<<right;
     f<<StringGrid1->ColCount<<endl;
    
     f.width(spaltenbreite(0)+2);                    //Spaltenbreite 1.Spalte
     f<<right; 
    
     for (i=0;i<StringGrid1->ColCount;i++)
     {
      for (j=0;j<StringGrid1->RowCount;j++)
      {
       f<<StringGrid1->Cells[j][i].c_str()<<',';
       f.width(spaltenbreite(j)+2);                 //Spaltenbreite je Spalte
                                                    //vielleicht überflüssig
      }
     f<<endl;
     }
     f.close();
    }
    //-----Versuch die maximale StringLänge je Spalte zu finden-------------------
    int maxs;
    int spaltenbreite(int i)
    {
     maxs=0;                                      //Initialisierung der max. 
                                                  //Spaltenbreite
     for (int ii=i;ii<=i;ii++)
     {
      for (int jj=0;jj<Form1->StringGrid1->RowCount;jj++)
      {
       if (maxs<Form1->StringGrid1->Cells[ii][jj].Length())
           maxs=Form1->StringGrid1->Cells[ii][jj].Length();
      }
     }
    
     if (maxs<5)                                  //setzen der Spaltenbreite auf 
                                                  //mind. 5(+2 von oben);
         maxs=5;
    
     return maxs;                
    }
    

    Das ganze sieht bei ungleich langen Strings so aus:

    5
      111111,       0,      0,      0,      0,
          0,       1,      2,      3,      4,
          0,       2,      4,      6,      8,
          0,       3,      6,      9,     12,
          0,       4,      8,     12,     16,
    

    Danke und liebe Grüße
    Todd



  • Okay,

    ich musste nur die Zeilen 47/48 tauschen. 🙄

    Danke und liebe Grüße
    Todd


Anmelden zum Antworten