Pfad wird nicht richtig erkannt.(variable wird überschrieben?)



  • hallo gemeinde,

    ich schreibe ein prog um videos zu verwalten. ich habe u.a. ein formular um filme einzugeben und ein formular um details anzeigen zu lassen.

    jetzt zu meinem problem:
    wenn ich zuerst das formular filme eingeben öffne und dann einen film eintrage, habe ich die möglichkeit ein cover hinzu zu fügen oder es wird ein image das kein cover vorhanden ist eingefügt.das ganze wird in einer sql datenbank abgespeichert. wenn ich kein cover einfüge treten keine probs auf. füge ich nun ein cover ein, dann wird dieses auch korrekt abgespeichert und in die datenbank eingetragen. schließe ich nun das formular und öffne das formular detail, dann bekomme ich die fehlermeldung das der pfad nicht gefunden werden kann.(dies passiert nicht wenn ich kein bild einfüge und statt dessen das image das kein cover geladen ist, gespeichert wurde).
    der pfad den das prog anmeckert setzt sich aus dem absoluten pfad des zu ladenen images und dem relativen pfad des in der datenbank abgespeicherten pfad zusammen.das gleiche gilt ebenfalls für meine ini-datei.
    frage ist, woher holt er sich den absoluten pfad her und wie kann ich ihn dazu überreden das er bitte nur den relativen pfad nimmt?

    hier erst mal quelltext des formulars eingabe:

    void __fastcall Tfrm_eingabe::cmd_picClick(TObject *Sender)
    {
    	if(OPDialog1->Execute()== true)
    	{
    		// image laden
    		Image1->Picture->LoadFromFile(OPDialog1->FileName);
    		Image1->Stretch = true;
    		Image1->Center = true;
    		// variable um teilstring zu erzeugen
    		AnsiString temp = OPDialog1->FileName;
    		// zähler auf 1 setzten für "bild geladen"
    		i = 1;
    		// filename aus string filtern
    		char * pch;
    		pch = strtok(temp.c_str(),"\\");
    		while(pch != NULL)
    		{
    			strcpy(temp.c_str(),pch);
    			pch = strtok(NULL,"\\");
    		}
    		// die fileendung filtern
    		AnsiString temp2 = OPDialog1->FileName;
    		char * pch1;
    		pch1 = strtok(temp2.c_str(),".");
    		while(pch1 != NULL)
    		{
    			strcpy(temp2.c_str(),pch1);
    			pch1 = strtok(NULL,".");
    		}
    		// fileendung speichern
    		picend = temp2;
    
    	}
    }
    

    denke mal das so weit alles ok ist. nun das formular detail beim ereignis form activate:

    void __fastcall Tfrm_detail::FormActivate(TObject *Sender)
    {
            frm_main->Visible = false;
    		querydetail->Active = true;
            querydetail->First();
    		Image->Picture->LoadFromFile(querydetail->FieldByName("bild")->AsString); [b]// hier wird angemeckert!!!![/b]
    		//eine TStringList erstellen:
    		TStringList *list = new TStringList();
    		//eine datei laden:
    		list->LoadFromFile("path.ini");[b]//danach wird dann hier angemeckert!!!![/b]
    		relpfad1 = list->Strings[1];
    }
    
    //---------------------------------------------------------------------------
    

    kann mir einer sagen warum das prog bei LoadFromFile(querydetail->FieldByName("bild")->AsString) den absoluten pfad drin hat + den relativen??? denn in der datenbank ist der relative pfad nur abgespeichert. das gleiche gilt für die path.ini.

    danke schon mal für eure bemühungen 🕶



  • LoadFromFile(querydetail->FieldByName("bild")->AsString) den absoluten pfad drin hat + den relativen???

    Die Frage verstehe ich nicht. Entweder steht das eine drin oder das andere oder es ist ein zusammengesetzter Wert. Also entweder steht

    c://test/test1.//testbild.jpg

    oder

    test//testbild.jpg

    oder

    c://test/test1.//testbild.jpgtest//testbild.jpg

    drin??

    Du solltest

    - mit dem Debugger das Programm durchgehen
    - den aus der DB gelesenen Wert (querydetail->FieldByName("bild")->AsString) erstmal in eine Stringvariable speichern und dort nachschauen
    - mal schreiben was "// hier wird angemeckert!!!!" heisst. kommt nun ein Fehler oder nicht.



  • hi christian,

    die fehlermeldung sieht so aus:

    http://www.wonderworld02.org/fehler.jpg

    dabei ist \images\306.jpg der relative pfad, der rest davor ist der absolute woher ich das image geladen hab.dies passiert aber auch nur wenn ich explicit ein image lade. gehe ich hin und lade das st.andart image, dann passiert das nicht. das st.andart image liegt im \images\.

    das prog scheint den dl-pfad vom image irgendwie noch im speicher zu halten(ohne den dateinamen) und den an dem relativen pfad anzufügen.

    //edit wieso ist das wort st.andart denn verboten? *wunder



  • Hallo

    die Fehlermeldung ist doch eindeutig, der Pfad stimmt nicht.
    Wenn du mit relativen Pfad arbeiten willst, must du das so übergeben :

    AnsiString File = "SubPath\\File.dat"
    ...->LoadFromFile(File);
    

    wieso ist das wort st.andart denn verboten?

    Weil das falsch geschrieben ist. Richtig ist Standard.

    bis bald
    akari



  • hi akari,

    der pfad von der ini ist schon ok, der wird ja auch immer gefunden, außer wenn ich vorher ein bild geladen hab, dann nicht mehr.die ini liegt im root des progs.außerdem wird diese aktion in der fehlermeldung angemeckert:

    Image->Picture->LoadFromFile(querydetail->FieldByName("bild")->AsString); // hier wird angemeckert!!!!
    

    in der db steht:

    .\\images\\306.jpg
    

    also wo holt das prog den absoluten pfad her?

    *mal 100 mal standard schreibt 🙄



  • hi zusammen,

    um das prob hier nochmals aufzugreifen, da ich dem prob schon mal ein wenig näher gekommen bin.

    problemstellung:
    wenn ich mit der TOpenDialog komponente nun ein file öffne, wird ja immer der letzte pfad im speicher abgelegt. so weit so gut.
    mit

    OPDialog1->Free();
    

    sollte ich den speicher eigentlich wieder frei geben.

    in meinem beispiel oben hab ich mehrere formulare. wechsel ich nun in ein anderes formular und möchte nun mittels "LoadFromFile" eine datei einlesen, dann holt er sich allerdings zuerst den pfad von TOpenDialog und setzt dann den neuen pfad zu meiner datei einfach dran. so entsteht die o.g. fehlermeldung, da dieser pfad natürlich nicht existent ist.

    Meine frage ist nun, wie bekomme ich das hin das beim verlassen des formulares der pfad von TOpenDialog wirklich gelöscht wird?



  • Hallo

    Aus deinem Text bin ich zwar nicht richtig schlau geworden, aber ich vermute du kannst dein Problem mit TOpenDialog::InitialDir lösen.

    Übrigens hoffe ich für dich, das du ->Free() wirklick korrekt einsetzt.
    Damit wird nämlich die ganze Dialog-Instanz gelöscht, und dafür solltest du eigentlich auch lieber delete nehmen. Egal wie darfst du das aber auch nur machen, wenn du die Dialog-Instanz selber dynamisch mit new erstellst.
    Free ist nicht dazu da die Werte des Dialogs zurückzusetzen!

    bis bald
    akari



  • Filename löschen= OPDialog1->FileName=""

    das mit dem Free hast du offenbar falsch verstanden:

    Free:

    Löst die Instanz eines Objekts auf und gibt nötigenfalls den zugehörigen Speicher frei.

    Hinweis:
    Geben Sie in C++ keine Objekte mit Free frei. Verwenden Sie stattdessen das Schlüsselwort delete.

    Da wird die Instanz gelöscht. Könnte sein, dass deine Probleme dadurch verursacht werden.

    Im übrigen hindert dich keiner darn, in einem neuen Formular die Komponente ein weiteres mal hinzuzufügen oder eine neue Klasse zu nehmen



  • zu spät 😉



  • Die Verwendung von TOpenDialog (durch den Anwender) setzt das Arbeitsverzeichnis auf das dort zuletzt ausgewählte Verzeichnis. Das Löschen der TOpenDialog-Instanz hat m.E. darauf keinen Einfluss.
    Siehe auch die API-Funktionen GetWorkingDirectory und SetWorkingDirectory.

    Um dir derlei Probleme zu ersparen solltest du immer mit Pfadangaben arbeiten, die sich auf einen festen Punkt in der Verzeichnisstruktur beziehen, also z.B. vom Installationsverzeichnis deiner Anwendung ausgehend (TApplication::ExeName) oder dem Windows-Verzeichnis o.ä.



  • hi zusammen,

    leider kam ich mit euren tipps nicht weiter. wir scheinen irgendwie aneinander vorbei zu reden. mal ein ganz simples beispiel:

    TStringList *list = new TStringList();
    	list->LoadFromFile("path.ini"); //liegt im programmpfad
    ......
    

    führe ich das aus ist alles im grünen bereich.

    gehe ich jetzt hin und führe folgendes aus:

    if(OPDialog1->Execute()== true)
    	{
    		// image laden
    		Image1->Picture->LoadFromFile(OPDialog1->FileName);
    ..........}
    

    das laden des bildes funzt auch. gehen wir mal davon aus ich hätte das bild von c:\windows geladen.

    jetzt kommt der punkt wo ich nicht mehr weiter komme!!!

    führe ich nun wieder aus:

    TStringList *list = new TStringList();
    	list->LoadFromFile("path.ini"); //liegt im programmpfad
    ......
    

    dann kommt die fehlermeldung das er das file (path.ini) nicht im verzeichnis c:\windows\path.ini finden kann. logisch, liegt da ja auch nicht. 😮

    wieso wird bei der 2. ausführung der pfad von OPDialog hinzugefügt??? und vor allem, wie krieg ich das weg?

    ich hoffe das ich jetzt mein anliegen deutlicher beschrieben hab 😕

    danke für eure mühen



  • Siehe letzten Beitrag auf der ersten Seite des Threads.



  • Wie schon geschrieben, mit festen absoluten oder relativen Angaben arbeiten. Es gibt nur ein Aktuelles Verzeichnis. Das kannst du mit ChDir setzen



  • danke ihr beiden,

    hab mal absoluten pfad eingetragen und dann funzt es.

    werde mir mal ExeName und auch ChDir näher anschauen 🕶



  • @ jansen,

    war goldrichtig, funzt jetzt 🕶

    dank auch an @Christian211.

    problem erledigt 👍


Anmelden zum Antworten