Laden in ein Programm



  • Hallo,

    ich habe folgendes Programm geschrieben, doch habe ich es nicht hinbekommen, dass er in den Speicher lädt, sondern nur, dass er in das Memo Feld lädt.
    Nun wie bekomme ich es hin, dass er die geladene Datei in den Speicher tut?
    Man sieht, unten den Code mit einem Laden, dass aber nur ins Memo Feld lädt.
    somit bitte ich um Hilfe, am besten sogar am code.

    mfg
    Ewar

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "LoadSave_Unit.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TfrmMain *frmMain;
    const MAX=3;
    
     AnsiString Nachname[MAX]={"Maier","Kahl","Leier"};
     double Groesse[MAX]={1.75,1.82,1.68};
     int Datum[3][3]={{16,8,1984},{25,2,1986},{8,11,1985}};
     TDateTime GebDat[MAX];
    //---------------------------------------------------------------------------
    void Zeige() {
      frmMain->Memo->Clear();
      for (int i=0;i<MAX;i++)
        frmMain->Memo->Lines->Add(Nachname[i]+"\t"+FloatToStr(Groesse[i])+"\t"+GebDat[i].DateString());
    }
    //---------------------------------------------------------------------------
    __fastcall TfrmMain::TfrmMain(TComponent* Owner)
            : TForm(Owner)
    {
       for (int i=0;i<MAX;i++)
         GebDat[i]=EncodeDate(Datum[i][2],Datum[i][1],Datum[i][0]);
       Zeige();
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TfrmMain::mnuSpeichernClick(TObject *Sender)
    {
      TStringList *SL=new TStringList;      // Objekt mit Load/Save-Methoden
      SL->Add(Nachname[0]+"\t"+FloatToStr(Groesse[0])+"\t"+GebDat[0].DateString());                 // Daten, die gespeichert werden sollen
      SL->Add(Nachname[1]+"\t"+FloatToStr(Groesse[1])+"\t"+GebDat[1].DateString());
      SL->Add(Nachname[2]+"\t"+FloatToStr(Groesse[2])+"\t"+GebDat[2].DateString());
      SaveDialog->Execute();                // Dialog zur Angabe des Dateinamens
      SL->SaveToFile(SaveDialog->FileName); // Speichern
      delete SL;
    }
    //---------------------------------------------------------------------------
    void __fastcall TfrmMain::mnuLadenClick(TObject *Sender)
    {
       Nachname[0]="";                          // Wert soll von Datei geladen werden
       TStringList *SL=new TStringList;         // Objekt mit Load/Save-Methoden
       OpenDialog->Execute();                   // Dialog zur Angabe des Dateinamens
       Memo->Clear();
       SL->LoadFromFile(OpenDialog->FileName);  // Laden
       Nachname[0]=SL->Strings[0];              // geladene Daten
       delete SL;
    
    }
    //---------------------------------------------------------------------------
    void __fastcall TfrmMain::mnuEndeClick(TObject *Sender)
    {
      Application->Terminate();
    }
    //---------------------------------------------------------------------------
    


  • Sl->SaveToFile( AnsiString FileName );
    

    grüssle 🙂



  • Ich versteh nicht warum du einen neuen Thread deswegen aufmachst, aber egal.

    Ich hatte also recht mit meiner Vermutung, du verwendest eine Art Feld um die Daten zu verwalten (Zeile 13-15). Zum Thema "globale Variablen" gibt es einen interessanten Beitrag in den FAQ. Besser wäre wahrscheinlich ein Struct zu verwenden, da die Daten ja auch einen Zusammenhang haben, z.B.

    struct Personen 
      {
      String NachName;
      double Groesse;
      TDateTime Datum;
      };
    

    davon kannst du dir dann entweder ein dynamisches Feld (new/delete) oder einen vector anlegen.

    Um die Daten wieder in dese Struktur zu bekommen kannst du die AnsiString-Methoden verwenden, z.B. aus dem Memo:

    Personen Person[3];  // das ist kein dynamisches Feld und auch kein vector !
    String MemoZeile = Memo1->Lines->Strings[0]; // 1. Zeile aus dem Memo
    Person[0].NachName = MemoZeile.SubString(1,MemoZeile.Pos("\t")-1);
    MemoZeile.Delete(1,MemoZeile.Pos("\t"));
    Person[0].Groesse = StrToFloat(MemoZeile.SubString(1,MemoZeile.Pos("\t")-1));
    MemoZeile.Delete(1,MemoZeile.Pos("\t"));
    Person[0].Datum = StrToDate(MemoZeile.SubString(1,MemoZeile.Length()));
    

    das ganze geht natürlich auch als Schleife, und wahrscheinlich auch noch einfacher, aber das kannst du ja mal selbst versuchen 😉

    noch einen Hinweis: Was passiert wenn der Nutzer den OpenDialog abbricht? Schau dir mal das Beispiel zu Execute in der BCB-Hilfe an.

    Und man kann die Datei direkt in das Memo laden.


Anmelden zum Antworten