Editfelder speichern und in einer StringGrid list abrufen



  • Du speicherst hier doch nur eine Zeile in die Datei. Warum überhaupt der Umweg übder die Datei? Du kannst doch direkt in das StringGrid schreiben.
    Du könntest vielleicht auch noch den Code zum Schreiben in das StringGrid zeigen.



  • Wenne mir sagst wie ich das geht, mach ich das gerne !

    hier der code

    void __fastcall TForm4::FormShow(TObject *Sender)
    {
      TStringList* pStrings = new TStringList;
      pStrings->LoadFromFile(ExtractFilePath(ParamStr(0))+"PatientenListe.txt");
      StringGrid1->RowCount = pStrings->Count+1;
      for(int ilLine = 0; ilLine < pStrings->Count; ilLine++)
      { for(int ilCol = 0; ilCol < 6; ilCol++)
          StringGrid1->Cells[ilCol][ilLine+1] =
          	ExtractFieldContents(pStrings->Strings[ilLine], ";", ilCol+1);
      }
    }
    //---------------------------------------------------------------------------
    
    AnsiString ExtractFieldContents(AnsiString slInputStr,
      AnsiString slSeparator, int ilField)
    {
      // falls Feldnummer oder Separator ungültig, leeren String zurückgeben:
      if(ilField < 1 || slSeparator == EmptyStr)
        return EmptyStr;
    
      // Nummer des letzten Buchstaben des gesuchten Teilstrings:
      int ilLastChar = 0;
    
      // Falls gesuchtes Feld gleich als erstes kommt:
      if(ilField == 1)
      {
        // Falls keine Trennzeichen im Hauptstring vorhanden:
        if(slInputStr.Pos(slSeparator) < 1)
          // ganzer String ist unser:
          ilLastChar = slInputStr.Length();
        else
          // ansonsten letzten Buchstaben merken:
          ilLastChar = slInputStr.Pos(slSeparator) - 1;
      }
      // falls nicht 1. Feld gesucht:
      else
      {
        // in Schleife nach den Trennzeichen suchen
        for(int ilFieldNo = 1; ilFieldNo < ilField; ilFieldNo++)
        {
          // Falls Trennzeichen gefunden:
          if(slInputStr.Pos(slSeparator) > 0)
          {
            // nicht benötigtes Feldes killen:
            slInputStr = slInputStr.SubString(slInputStr.Pos(slSeparator)+
            	slSeparator.Length(), slInputStr.Length() -
              slInputStr.Pos(slSeparator) + 1 - slSeparator.Length());
          }
          // Falls keine Trennzeichen mehr, obwohl welche da sein sollten,
          // String killen:
          else slInputStr = EmptyStr;
        }
    
        // Falls im geköpften String keine Leerzeichen mehr vorhanden,
        // ganzen String nehmen
        if(slInputStr.Pos(slSeparator) < 1)
          ilLastChar = slInputStr.Length();
        // ansonsten letzten Buchstaben merken:
        else
          ilLastChar = slInputStr.Pos(slSeparator) - 1;
      }
    
      // falls überhaupt noch irgendetwas vom Hauptstring übrig:
      if(slInputStr.Length() > 0 && ilLastChar <= slInputStr.Length())
        // Feldinhalt herausschneiden und zurückgeben
        return slInputStr.SubString(1, ilLastChar);
      else
        // ansonsten leeren String zurückgeben:
        return EmptyStr;
    }
    

    bissl langer text, aber ich denke es geht !

    Edit:
    Ruhig mal die 'C/C++'-Tags verwenden!



  • Wirf doch mal einen Blick auf den FAQ-Eintrag zum Laden/Speichern eines StringGrids.
    Mit TStringList::CommaText bzw. (ab BCB6) DelimitedText lässt sich das schön vereinfachen.



  • Also so ganz verstehe ich das nicht! er speichert mir jetzt die sachen, aber komischerweise nur alles in ⚠ EINE ⚠ spalte!

    hier der code in der form, wo sich das StringGrid verbirgt:

    void __fastcall TForm4::FormShow(TObject *Sender)
    {
    // StringGrid laden
    
    // Liste, die das Abbild der Datei enthalten wird
    TStringList *list2 = new TStringList();
    
    // Liste aus Datei laden
    list2->LoadFromFile("balblalb.txt");
    
    // Zeilen- und Spaltenzahl setzen
    StringGrid1->RowCount = list2->Count - 1;
    StringGrid1->ColCount = list2->Strings[0].ToInt();
    
    // Werte zeihlenweise aus der Liste übertragen
    for (int y = 1; y < list2->Count; y++)
       StringGrid1->Rows[y - 1]->CommaText = list2->Strings[y];
    
    // nicht vergessen, den Speicher wieder freizugeben
    delete list2;
      }
    //---------------------------------------------------------------------------
    
    AnsiString ExtractFieldContents(AnsiString slInputStr,
      AnsiString slSeparator, int ilField)
    {
      // falls Feldnummer oder Separator ungültig, leeren String zurückgeben:
      if(ilField < 1 || slSeparator == EmptyStr)
        return EmptyStr;
    
      // Nummer des letzten Buchstaben des gesuchten Teilstrings:
      int ilLastChar = 0;
    
      // Falls gesuchtes Feld gleich als erstes kommt:
      if(ilField == 1)
      {
        // Falls keine Trennzeichen im Hauptstring vorhanden:
        if(slInputStr.Pos(slSeparator) < 1)
          // ganzer String ist unser:
          ilLastChar = slInputStr.Length();
        else
          // ansonsten letzten Buchstaben merken:
          ilLastChar = slInputStr.Pos(slSeparator) - 1;
      }
      // falls nicht 1. Feld gesucht:
      else
      {
        // in Schleife nach den Trennzeichen suchen
        for(int ilFieldNo = 1; ilFieldNo < ilField; ilFieldNo++)
        {
          // Falls Trennzeichen gefunden:
          if(slInputStr.Pos(slSeparator) > 0)
          {
            // nicht benötigtes Feldes killen:
            slInputStr = slInputStr.SubString(slInputStr.Pos(slSeparator)+
            	slSeparator.Length(), slInputStr.Length() -
              slInputStr.Pos(slSeparator) + 1 - slSeparator.Length());
          }
          // Falls keine Trennzeichen mehr, obwohl welche da sein sollten,
          // String killen:
          else slInputStr = EmptyStr;
        }
    
        // Falls im geköpften String keine Leerzeichen mehr vorhanden,
        // ganzen String nehmen
        if(slInputStr.Pos(slSeparator) < 1)
          ilLastChar = slInputStr.Length();
        // ansonsten letzten Buchstaben merken:
        else
          ilLastChar = slInputStr.Pos(slSeparator) - 1;
      }
    
      // falls überhaupt noch irgendetwas vom Hauptstring übrig:
      if(slInputStr.Length() > 0 && ilLastChar <= slInputStr.Length())
        // Feldinhalt herausschneiden und zurückgeben
        return slInputStr.SubString(1, ilLastChar);
      else
        // ansonsten leeren String zurückgeben:
        return EmptyStr;
    }
    

    und jetzt der "speicher-button", mit den edit feldern(die in die ich in der tabelle speichern will) in der anderen form!

    void __fastcall TForm2::Button2Click(TObject *Sender)
    {
    // StringGrid speichern
    
    // Liste, die das Abbild des StringGrids enthalten wird
    TStringList *list = new TStringList();
    
    // Spaltenzahl speichern
    list->Add(Form4->StringGrid1->ColCount);
    
    // Werte zeilenweise in die Liste übertragen
    for (int y = 6; y < Form4->StringGrid1->RowCount; y++)
       list->Add(Form2->Edit3->Text+";" + Form2->Edit4->Text+ ";" + Form2->Label22->Caption+ ";" + Form2->Edit6->Text+ ";" + Form2->Edit2->Text+ ";" + Form2->Memo1->Text+ ";");
    
    // Liste in Datei speichern
    list->SaveToFile("balblalba.txt");
    
    // nicht vergessen, den Speicher wieder freizugeben
    delete list;
    
    }
    

    Frage: wieso übernimmt er nicht die spalten und speichert dort die entsprechenden informationen & wieso sind aufeinmal die Bezeichnungen der Spalten weg ?

    StringGrid1->Cells[0][0] = "Name";
      StringGrid1->Cells[1][0] = "Vorname";
    ...
    

    mfg andy5000



  • Das alles in eine Spalte kommt, liegt wohl daran, dass CommaText Kommas oder Spaces als Trennzeichen erlaubt. Du nimmst Semikolons.
    Bei deiner Speicherfunktion sehe ich auch noch Probleme. Du speicherst dort StringGrid1->RowCount-6 mal die gleichen EditFelder ab. Ist das so gewollt?



  • das mit dem RowCount-6 hatte ich nur testweise eingegeben!

    also reicht jetzt ein "," anstatt ";" ?



  • So, das hab ich jetzt schon, jetzt nur noch folgendes problem!

    http://home.arcor.de/jr_vize_president_b-baron/Pixx/C++%20Problem.JPG

    ich versteh einfach nicht, wieso der den eintrag sooft vervielfältigt wird !?! ich drücke doch nur EINMAL drauf !

    und totaler schwachsinn ist auch, dass er jetzt meine überschriften einfach wegmacht! 😡



  • Die Überschriften löschst du doch damit

    for (int y = 1; y < list2->Count; y++)
       StringGrid1->Rows[y - 1]->CommaText = list2->Strings[y];
    

    selber weg. Rows[0] ist deine Überschriftenzeile. Also mach das -1 da weg.
    Hast du dein list->Add(... in der Speichernfunktion immernoch in einer Schleife? Warum eigentlich. Du mußt doch bei jedem Klick nur einmal speichern.
    Wie schon einmal gesagt, schreib doch direkt in den StringGrid.

    void __fastcall TForm2::Button2Click(TObject *Sender)
    {
    // StringGrid speichern
      StringGrid1->RowCount++;
      int row = StringGrid1->RowCount-1;
      StringGrid1->Cells[0][row] = Form2->Edit3->Text;
      StringGrid1->Cells[1][row] = Form2->Edit4->Text;
      StringGrid1->Cells[0][row] = orm2->Label22->Caption;
    // usw.
    }
    

    Wenn du das Ganze dann in eine Datei Speichern willst mach das direkt aus dem StringGrid.



  • joa danke, jetzt funktionierts, jetzt muss ich das nur noch so hinbekommen, das er es in eine dateispeichert, also das es nachm neustart wieder abrufbar ist ! ma sehn ob ich das alleine hinbekomme! 🙄



  • sagtmal, würde das auch gehen, wenn ich diesen registry eintrag da mache ?

    hier sowas? http://www.marquardtnet.info/cecke/quickies.1/1_quicky_15.html



  • Was für einen Registry-Eintrag. In dem verlinkten Beitrag geht es um globale Variablen und die solltest du auf jedem Fall vermeiden. Bei dir ist sowas auch nicht nötig.



  • achso okay,kann ich denn die daten speichern ? also beim speichern wird dann ein ordner erstellt (in dem verzeichnis wo die exe ist) bspw. DATA und dann eine datei die verschlüsselt ist, also keine normale text datei, die jeder einsehen kann?! ginge sowas?



  • Andy5000 schrieb:

    achso okay,kann ich denn die daten speichern ? also beim speichern wird dann ein ordner erstellt (in dem verzeichnis wo die exe ist) bspw. DATA und dann eine datei die verschlüsselt ist, also keine normale text datei, die jeder einsehen kann?! ginge sowas?

    also das mit dem verschlüssel das brauch ich jetzt nicht mehr, mir geht es jetzt nur noch darum, die "gespeicherten" daten in der StringGird in eine txt-file zuspeichern.

    hab es schonmal so probiert, aber es funktioniert nicht richtig!
    Also, ich habe einen Button mit ner MessageBox ("Wollen Sie vor dem Beenden speichern?") Wenn YES, dann Close(); Wenn NO, dann soll er SaveDialog öffnen und dann ne Fileauswählen kann (txt-file) und die dann einfach abspeichert und beim nächstenmal wenn man die Form4 öffnet, soll er die automatisch reinladen...

    [b]if[/b]...
    [b]else[/b](Form4->SaveDialog1->Execute() ==true)
                Form4->StringGrid1->Cells->SaveToFile(SaveDialog1->FileName);
    


  • Hallo

    schau dir doch bitte mal an, was für ein Typ hinter Form4->StringGrid1->Cells steht, und ob dieser überhaupt eine solche Methode anbietet.



  • akari schrieb:

    Hallo

    schau dir doch bitte mal an, was für ein Typ hinter Form4->StringGrid1->Cells steht, und ob dieser überhaupt eine solche Methode anbietet.

    Nein tut er leider nicht, da steht das es kein Element von TStringGrid sei.

    Und nun? 😕



  • Hallo

    du must jeden einzelnen EIntrag in Cells manuell auslesen und in einem passenden Format zusammenfügen und speichern.
    Tip : Schau in die BCB-FAQ hier im Forum, gleich ganz oben in der TOP3 ist ein Beispeil für Speichern beliebiger Werte. Dumust nur die Werte einer Zeile mit TAB getrennt aneinanderhängen. Diese Strings kannst du dann an die StringList anhängen.
    Beim Auslesen ist es andersrum auszuführen.

    bis bald
    akari



  • Man muss hier nicht unbedingt Cells bemühen. Sowohl Rows als auch Cols sind vom Typ TStrings. Es würde also reichen eine neue StringList zu erstellen und dann nacheinander mit AddStrings die Rows dort einzufügen. Zum Schluß muß man dann nur diese Liste mit SaveToFile speichern. Rückwärts ist es natürlich etwas schwieriger.



  • ich komm einfach nicht weiter...

    TStringList* Speichern = new TStringList;
    Speichern->Form4->StringGrid1->Cols[0] [row]
               Form4->StringGrid1->Cols[1] [row]
    

    das mit dem AddString versteh ich nicht, sry, bin noch ein Anfänger!
    gib mir mal nen anfangstipp bitte 👍

    mfg
    andy5000



  • Siehe FAQ unter "StringGrid".


Anmelden zum Antworten