Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Jak to zrobić w Borland C++

28 Lut 2007 20:29 2648 4
  • Poziom 13  
    Witam mam taki problem, a mianowicie mam dane wpisane do komórek stringgrid i chce je zapisać do pliku txt i w tym tkwi problem, że mi nie wychodzi. Dla przykładu dodaje screena
    Z góry dziękuje za pomoc.

    Jak to zrobić w Borland C++
    Darmowe szkolenie: Ethernet w przemyśle dziś i jutro. Zarejestruj się za darmo.
  • Poziom 18  
    Cytat:
    Zapisywanie i odczytywanie zawartości obiektu StringGrid.

    Często w e-mail'ach różni - jak sadzę - początkujący programiści zwracają się do mnie z prośbą o podanie sposobu na zapisywanie i odczytywanie zawartości StringGrid. Niektórzy próbują wykorzystywać do tego celu struktury, co jest dobrym pomysłem, ale nie zawsze odpowiednim, ponieważ struktury mają to do siebie, że w przypadku zapisywania łańcucha znaków, długość tego łańcucha musi być z góry określona, jest to o tyle wadą, że jeśli zapisujemy łańcuch znaków krótszy od zadeklarowanego, to struktura i tak wypełnia się przypadkowymi znakami (użyłem określenia "przypadkowymi", lecz osobiście uważam, że przypadek nie istnieje, to po prostu ciąg zdarzeń) więc niezależnie od tego jak dużą tabelę zapisujemy, w przypadku struktury wielkość pliku zawsze będzie stała, chociaż istnieje pewien bardzo skomplikowany sposób, żeby to zmienić. Niemniej jednak, w tej poradzie pokaże jak zapisać StringGrid do pliku w trybie tekstowym, w pliku tym oprócz samej zawartości tabeli znajdą się również informacje o liczbie komórek i o szerokości kolumn, tyle na początek, chociaż gdyby rozwinąć ten wątek, to można by umieścić w pliku informacje o kolorach komórki, nazwie czcionki, wyrównaniu tekstu w komórkach itp. Tak daleko, jednak w tej poradzie nie pójdę. Innym często zgłaszanym problemem, jest możliwość zapisywania tabeli w formacie Excel'a, no cóż zapisanie w tym formacie wymagałoby poznania sposobu formatowania pliku, ja go nie znam, ale jest pewien sposób, otóż Excel rozpoznaje pliki *.csv, te pliki nie zawierają co prawda żadnego formatowania, ale mogą posłużyć do prostego przeniesienia zawartości ze StringGrid do Excel'a.
    Zaczniemy od stworzenia prostej funkcji zapisującej zawartość tabeli do pliku, funkcja pobiera wyrazy i zdania z komórek tabeli, dodaje do nich separator służący do rozdzielania komórek w pliku, no i zapisuje to do pliku:
    Code:

    // Plik źródłowy np. Unit1.cpp
    //--- FUNKCJA ZAPISUJĄCA TABELĘ DO PLIKU ------------------------------------
    void __fastcall TForm1::SaveGridToFile(AnsiString FileName, TStringGrid *Grid,
            bool csv)
    {
     TStringList *Lista = new TStringList;
     String txt_1 = "", txt_2 = "";

     if(!csv)
     Lista->Add("\"Col" + (AnsiString)Grid->ColCount + "\";\"ROW" + (AnsiString)Grid->RowCount + "\"");

     for(int i = 0; i < Grid->RowCount; i++)
     {
      for(int j = Grid->ColCount - 1; j >= 0; j--)
      {
       String temp = Grid->Cells[j][i];
       if(temp.SubString(temp.Length(), temp.Length() + 1) == ";")
        temp = Grid->Cells[j][i] + "'";
       if(!csv)
        txt_1 = ";\"" + temp + "\"" + txt_1;
       else
        txt_1 = "\"" + temp + "\";" + txt_1;

       if(!csv && i == 0)
       {
        txt_2 = (AnsiString)Grid->ColWidths[j] + ";" + txt_2;
        if(j == 0)
        Lista->Add(txt_2);
       }
      }
      Lista->Add(txt_1);
      txt_1 = "";
     }

     Lista->SaveToFile(FileName);
     delete Lista;
    }
    //--------------------------------

    Cytat:
    Należy pamiętać o deklaracji funkcji w pliku nagłówkowym w sekcji private lub public. Przedstawiona funkcja pobiera parametr bool csv, służy od do ustawienia formatu pliku, jeśli ten parametr będzie miał wartość true, to funkcja zapisze plik z formatowaniem typowym dla plików *.csv, w przeciwnym razie plik zostanie zapisany w formacie własnym, oczywiście funkcja nie nadaje plikom żadnego rozszerzenia, rozszerzenie i nazwa pliku muszą zostać przekazane do funkcja poprzez parametr AnsiString FileName. Oprócz samej zawartości tabeli funkcja ta wprowadza do pliku własne znaki, które będą jej potrzebne przy odczytywaniu pliku i przepisywaniu go do StringGrid. Znaki te nie będą oczywiście umieszczane w tabeli, gdy staną się zbędne zostaną usunięte.


    CyfrowyBaron
    PS: Żywcem przekopiowane, nie jest to mój wywód. adresu niepamiętam.
  • Poziom 13  
    Tak zgadza się używałem tego kodu ale ja chcę, żeby plik był zapisany w formacie txt i miał taki wygląd
    0200E032000000000000003200000000AA
    000000320000000000000032000000007C
    00000032000000000000003200001EBE90
    FF011FEF4E2212006960044002E42274A7
    0122F874AD04000000000000000070F50B
    00D8F02220D502E622E02220D502F622A6
    F02220D5020822A322ED6FA2E75006ED70
    A2E774FF22C3EC9EFCED9FFDA2E74C2299
    EC2EFCED3FFD22C3EC9EFCED9FFD22C05B
    może ktoś podpowie mi jak zmienić kod podany przez Cyfrowego Barona aby zapisywał w taki sposób.
  • Poziom 18  
    musisz dołaczyć
    Code:
    #include <fstream.h>

    a potem to tylko
    Code:

    ofstream outfile("c:\plik.txt", ios::trunc);
    for(int i = 0; i < Grid->RowCount; i++)
     {
      for(int j = Grid->ColCount - 1; j >= 0; j--)
      {
      outfile << Grid->Cells[j][i];
      }
     outfile << endl;
     }
    outfile.close();

    powinno działać, jeżeli by nie działało to najprawdopodobniej musisz
    Code:
    Grid->Cells[j][i]
    zmienić na
    Code:
    Grid->Cells[j][i].c_str();
  • Poziom 13  
    Dzięki za pomoc już działa.
    Zamykam temat.