Standalone exe bei CodeGear RAD Studio C++Builder 2007



  • Guten Abend,

    in der Schule haben wir "CodeGear RAD Studio C++Builder 2007". Ich wollte gerne die Programme, die ich dort schreibe auch zuhause starten können. Ich habe also diesen Eintrag über Standalone Executables gelesen und nein, es funktioniert nicht eine Standalone exe zu erstellen -.-
    Also mit Häkchen weg von Dynamische RTL sowie Häkchen weg von der Verwendung von Laufzeit-Packages hat sich das Problem nicht gelöst.

    Der Fehler, der Ausgespuckt wird, ist folgender: Die angeforderte Datei wurde nicht gefunden
    Stellen sie sicher, dass Pfad- und Dateiname richtig sind"
    Also es wird nicht explizit eine fehlende Datei benannt.

    Weiß jemand, ob das beim neuen C++Builder irgendwie anders ist, als bei den alten?

    Gruß
    Kasimir



  • Hallo

    Die beiden Optionen aus der FAQ betreffen natürlich nur die Libraries, die direkt zur Entwicklungsumgebung gehören. Wenn dein Projekt weitere externe Libraries oder andere externe Dateien benötigt, müßen diese trotzdem mitgeliefert werden.
    Aus deiner Beschreibung können wir dir aber nicht sagen, was das für Dateien sein könnten.

    bis bald
    akari



  • Danke, für die schnelle Hilfe!

    Das Programm braucht tatsächlich eine lib, aber wenn ich die nicht einbinden würde, denn bricht schon der kompiliervorgang ab. Ansonsten ist nichts was das Programm bräuchte an externem.

    Die ufmod.lib habe ich aufgrund, dass das Programm natürlich nicht ohne die lib laufen wollte, mit in das Projekt aufgenommen und offensichtlich wird sie beim kompilieren mit eingearbeitet.

    Ist zwar nicht unbedingt elegant, aber hier einmal der Code:

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    #include "ufmod.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    
    bool spielstatus=0, xmplay_stopped;
    int zufallszahl, gewinn;
    String einsatz, geld, festgelegter_favourit;
    
    String GetAppPath(void) {
    	const int LEN = 1000;
    	char directory[LEN]; String ret=""; int SlashPos;
    	GetModuleFileName(NULL,directory,LEN);
    
    	for (int x=strlen(directory); x>=0; x--)
    	{
    		if (directory[x]=='\\')
    		{
    			SlashPos=x;
    			break;
    		}
    	}
    	for (int x=0; x<SlashPos; x++)
    	{
    		ret += directory[x];
    	}
    	return(ret);
    }
    
    String xmpath=GetAppPath()+"/music5.xm";
    
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
    	: TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
     zufallszahl = random(11);
     if(zufallszahl>5&&auto1->Left<Form1->ClientWidth-auto1->Width) {
    	auto1->Left++;
     }
     if(zufallszahl<5&&auto2->Left<Form1->ClientWidth-auto2->Width) {
    	auto2->Left++;
     }
     if(auto2->Left>=Form1->ClientWidth-auto1->Width||auto1->Left>=Form1->ClientWidth-auto1->Width  ) {
    	 Timer1->Enabled=false;
    	 spielstatus=0;
    	 if(auto2->Left>auto1->Left&&festgelegter_favourit=="blaues Auto") {
    		statusmeldung->Caption = "Super, Du hast gewonnen!";
    		geld->Caption=FloatToStr(StrToFloat(geld->Caption)+gewinn);
    		startbutton->Enabled=true;
    	 }
    	 else if (auto2->Left<auto1->Left&&festgelegter_favourit=="grünes Auto") {
    		statusmeldung->Caption = "Super, Du hast gewonnen!";
    		geld->Caption=FloatToStr(StrToFloat(geld->Caption)+gewinn);
    		startbutton->Enabled=true;
    	 }
    	 else {
    		statusmeldung->Caption="Mist, voll verschissen!";
    		startbutton->Enabled=true;
    		if(geld->Caption=="0") {
    			uFMOD_Pause();
    			ton->Picture->LoadFromFile("tonan.gif");
    			xmplay_stopped=true;
    			ShowMessage("Schade, verzockt!");
    			startbutton->Caption="Neues Spiel";
    		}
    	 }
     }
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::startbuttonClick(TObject *Sender)
    {
    	spielstart:
    	if(startbutton->Caption=="Neues Spiel") {
    		einsatz->Text="";
    		favourit->Text="Auswahl des Favouriten";
    		auto1->Left = 0;
    		auto2->Left = 0;
    		geld->Caption=10;
    		statusmeldung->Caption="";
    		startbutton->Caption="Start";
    		ton->Picture->LoadFromFile("tonaus.gif");
    		xmplay_stopped=false;
    		uFMOD_PlaySong(xmpath.c_str(),0,XM_FILE);
    		goto ende_der_funktion;
        }
    	try {
            StrToFloat(einsatz->Text);
    	} catch (...) {
    		statusmeldung->Caption="Bitte gib eine im Geldbeutel befindliche reelle Zahl ein!";
    		goto ende_der_funktion;
    	}
    	if(einsatz->Text=="") {
    		statusmeldung->Caption="Bitte erst den Wetteinsatz eingeben!";
    		goto ende_der_funktion;
    	}
    	if(StrToFloat(einsatz->Text)<0) {
    		statusmeldung->Caption="Also verarschen kann ich mich selber!";
    		goto ende_der_funktion;
    	}
    	if (favourit->Text=="Auswahl des Favouriten") {
    		statusmeldung->Caption="Auf irgendwen musst Du vor dem Rennen schon tippen...";
    		goto ende_der_funktion;
    
    	}
    
    	if(StrToFloat(geld->Caption)>0) {
    		if(StrToFloat(geld->Caption)>=StrToFloat(einsatz->Text)) {
    			geld->Caption=FloatToStr(StrToFloat(geld->Caption)-StrToFloat(einsatz->Text));
    		} else {
    			statusmeldung->Caption="Mehr Einsatz als Du hast? Geht bei der Mafia, aber hier nicht!";
    			goto ende_der_funktion;
    		}
    		}
    		auto1->Left = 0;
    		auto2->Left = 0;
    		Timer1->Enabled=true;
    		festgelegter_favourit = favourit->Text;
    		spielstatus=1;
    		startbutton->Enabled=false;
    		statusmeldung->Caption="Gewettet hast Du für: " + favourit->Text;
    		if(StrToFloat(einsatz->Text)>1) {
    			gewinn = StrToFloat(einsatz->Text) * 1.5;
    		} else {
    		 gewinn = 1+StrToFloat(einsatz->Text) * 1.5;
            }
    		ende_der_funktion:
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
    uFMOD_PlaySong(xmpath.c_str(),0,XM_FILE);
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::tonClick(TObject *Sender)
    {
    	if(xmplay_stopped==true) {
    		uFMOD_Resume();
    		ton->Picture->LoadFromFile("tonaus.gif");
    		xmplay_stopped=false;
    	}
    	else {
    		uFMOD_Pause();
    		ton->Picture->LoadFromFile("tonan.gif");
    		xmplay_stopped=true;
    	}
    }
    //---------------------------------------------------------------------------
    

    Nachtrag:

    Das Programm ist ein kleines Spiel in dem Zwei Autos auf einer kleinen Straße von links nach rechts fahren. Es wird vorher ausgewählt, welches wohl gewinnen wird und ein Wetteinsatz gegeben. Denn wird kurz gefahren und nachher halt Gewinn oder Verlust ausgewertet.
    Nebenbei habe ich mit ufmod das Abspielen einer *.xm-Datei eingebunden, was auch hervorragend funktioniert.
    Das alles funktioniert nur auf dem PC mit dem C++Builder 😕



  • Hat keiner eine Ahnung, wie man das bei dem CodeGear RAD Studio C++Builder 2007 macht?



  • Kasimir87 schrieb:

    Hat keiner eine Ahnung, wie man das bei dem CodeGear RAD Studio C++Builder 2007 macht?

    Hi,

    es wird nicht unbedingt an der BCB-Version liegen.
    Nach deinem Code lädtst du mind. 2 Grafikdateien (tonan.gif, tonaus.gif) und eine Sounddatei.
    Wenn die nicht dabei sind oder nicht im Pfad liegen, ists ohne Fehlerbehandlung im Programm Essig.
    Pack diese Dateien als Resourcen mit ins Programm.

    mfg
    kpeter



  • Hab die ganzen Tutorials durchgewühlt und mit Ressourcen kann ich nun halbwegs umgehen, aber ich krieg's partout nicht hin gifs aus den Ressourcen zu laden!
    Kennst Du Dich da besser mit aus?

    EDIT:

    Ich hab jetzt mal alle Grafiken als Bitmap genommen und komischer Weise geht die Transparenz immer noch O.o. Also ist es eigentlich nicht nötig *.gif-Dateien einzubinden.
    Desweiteren habe ich umod, also das Abspielen von xm-Dateien, aus dem Programm genommen und nun funktioniert die Weitergabe an andere Rechner!

    Allerdings steh ich wieder vor einem blöden Problem, aber ich mach dafür mal einen neuen Thread auf.


Anmelden zum Antworten