Problem beim Speichern eines Strings in einer StringList



  • Hallo,

    ich habe ein Programm, das Edit1, Button1, Button2 und OpenDialog1 beinhaltet.
    Button1 führt OpenDialog1->Execute(); aus und Button2 speichert den String von Edit1->Text in einer StringList.
    Wenn man nun mit OpenDialog1 eine Datei auswählt und der Pfad in Edit1->Text geschrieben wird und man dann versucht den String mit Button2 zu speichern, kommt der Fehler: "datei.txt kann nicht geöffnet werden". Sie ist aber vorhanden. Beispielsweise habe ich die Datei C:\ABC\DEF.EXE ausgewählt und ich klicke auf Button2. Der Fehler tritt auf. Wenn ich aber den selben Pfad von Hand in Edit1 eintrage und Button2 drücke, funktioniert es.

    Ich hoffe mir kann einer helfen

    MfG Xolker und Danke im Voraus



  • Xolker schrieb:

    Ich hoffe mir kann einer helfen

    Nein. Ohne Code wohl wenig...



  • Du widersprichst dir doch:

    Button2 speichert den String von Edit1->Text in einer StringList.

    man dann versucht den String mit Button2 zu speichern,

    Wat den nu'?



  • Das Erste 😃 Sorry 😃



  • Na dann ist das Problem ja einfach zu lösen.

    Das Speichern in eine StringList speichert nix in eine Datei



  • Yo ok:
    Sorry war vorhin bissl in Eile hab vergessen zu schreiben das dabei die StringList in eine Datei dann gespeichert wird.
    Das Problem ist ja:
    Wenn der Pfad per Hand eingegeben wird, geht es problemlos
    aber wenn man mit dem OpenDialog1 den Pfad auswählt und dann abspeichert geht es nicht.

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    pfad2->LoadFromFile("config.txt");
    pfad2->Strings[0] = Edit1->Text;
    pfad2->SaveToFile("config.txt");
    Form1->Enabled=true;
    Form4->Hide();
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
    OpenDialog1->Execute();
    Edit1->Text = OpenDialog1->FileName;
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
    pfad2 = new TStringList;
    pfad2->LoadFromFile("config.txt");
    Edit1->Text = pfad2->Strings[0];
    }
    //---------------------------------------------------------------------------
    

    Hab mal gepostet was ich da so hab 😉



  • Wie sollte es auch gehen??

    Du speicherst und lädst doch immer mit einer festen Pfadangabe (config.txt)

    Der Pfad aus OpenDialog wird doch nur in die Liste an die erste Stelle geschrieben. Mehr nicht. Dieser wird dann ein einziges Mal, nämlich dann wenn das Formular erzeugt wird, in Edit1 geschrieben.



  • Ja so soll es ja auch sein. In config.txt soll der Pfad ganz oben stehen und wenn man in im Programm ändert überschrieben werden. Den pfad soll man mit OpenDialog1->Execute(); auswählen können also mit FileName. Oder ist das nicht so empfehlenswert? (Weil dann kommt ja der Fehler das config.txt nicht geöffnet werden kann)

    Da ich noch ein Anfänger bin ist mir nichts anderes eingefallen als die Benutzer den Pfad mit OpenDialog bzw SaveDialog auszuwählen.



  • Sorry, ich verstehs nicht:

    Wenn du nur den Pfad einer Datei speicherst, wie kann das

    , kommt der Fehler: "datei.txt kann nicht geöffnet werden".

    passieren??

    Du willst also in einer Datei Names config.txt eine beliebigen Pfad und Dateinamen speichern

    Dann würde ich das so machen:

    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
    if(OpenDialog1->Execute())
       {
       Edit1->Text = OpenDialog1->FileName;
       pfad2->Clear();
       pfad2->LoadFromFile("config.txt");
       pfad2->Strings[0] = OpenDialog1->FileName;
       pfad2->SaveToFile("config.txt");
       }
    }
    //---------------------------------------------------------------------------
    


  • _____________________   _______
    |EDIT1                | |Button2|
     ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯   ¯¯¯¯¯¯¯
     _________
    |Button1  |
     ¯¯¯¯¯¯¯¯¯
    

    damit du/ihr weißt/wisst wie es aussieht

    Ich habs jetzt mal zum Test genauso gemacht wie du gesagt hast aber es tritt der selbe Fehler auf.
    Dann habe ich es nochmal gemacht wie ich es unten hatte nur mit if((OpenDialog1->Execute()) anstatt ohne if.

    Selbe Fehler. Wenn ich den Pfad per Hand eingebe funktioniert es, wenn ich aber den Pfad mit OpenDialog->FileName bestimme, "kann datei.txt nicht geöffnet werden" bzw config.txt. Das darf doch nicht sein.



  • Hm, jein. Wenn Du mit einem Open- / SaveDialog arbeitest, wird das aktuelle Verzeichnis gewechselt. Gib mal den Pfad bei der Config.txt mit an.

    Zur Verzeichnisauswahl sollte auch SelectDirectory besser geeignet sein.



  • Oh das habe ich gar nicht gewusst. Dann ist es ja logisch 😉 ok ich mache mich mal mit SelectDirectory schlau. Danke erst mal



  • hm... wie finde ich denn heraus in welchem Ordner (pfad) das Programm liegt? Also die .exe Datei.



  • siehe BCB-Hilfe unter:
    ExtractFilePath / ExtractFileDir
    Application->ExeName



  • Ähhhhhhhhhhhhhhhhhhhhhhhhh

    wenn ich aber den Pfad mit OpenDialog->FileName bestimme

    Du willst den Pfad bestimmmen DEN PFAD?? Keine Datei?

    Das geht mit OpenDialog nicht

    http://www.marquardtnet.info/cecke/komponenten.2/2_selectdir.html



  • Nein ^^

    Also es soll schon eine Datei ausgewählt werden. Das soll dann in Edit1->Text angezeigt werden wie z.B. C:\ABC\DEF.exe
    Das mit dem OpenDialog würde dann ja theoretisch funktionieren, ich muss nur noch wissen wie das Programm eigenständig (ohne das der Benutzer was machen muss) in ein anderes Verzeichnis wechselt sodass config.txt wieder geöffnet werden kann. Also wäre zu dem Thema meine letzte Frage wie das Programm in das Verzeichnis wechselt in der die .exe Datei liegt (mein Programm das in dem Moment ausgeführt wird).

    MfG Xolker



  • entweder pfad2->LoadFromFile(Programmpfad + "config.txt")
    oder chdir(ProgrammPfad)



  • Ja aber wie lass ich das Programm den Programmpfad herauskriegen?



  • Ich gebe es jetzt auf

    Ja aber wie lass ich das Programm den Programmpfad herauskriegen?

    Lies den Thread



  • Wenn du die Komponente meinst die du gepostet hast: Damit muss der Anwender doch einen Pfad auswählen.
    Es gibt ja Application->ExeName; womit der Pfad+dem Dateinamen und Endung gegeben wird. Das würde mir auch reichen wenn ich wüsste wie man den Namen herausfindet (also name.exe).


Log in to reply