Per Parameter die Exe-Datei anweisen, dass das Fenster nicht geöffnet werden soll?
-
Funktioniert nicht. Das Fenster wird mit trotzdem angezeigt.
Aber ich habe das jetzt so gelöst, dass ich im OnFormCreate-Event den Parameter abfange, danach meine Methode ausführe, und gleich danach mit delete(this) die Anwendung "beende".
Das geht soweit auch, nur wird mir dann eine EAccessViolation geworfen.
Free() soll ich laut Hilfe nicht verwenden, da es in delete(...) schon vorhanden ist.
Wie bekomme ich aber jetzt die Fehlermeldung weg?
-
normalerweise müsstest Du da mit try/catch arbeiten. Das ganze erscheint mir aber trotzdem ziemlich gefrickelt.
//Edit
habe nochmal geschaut. Mit Application->ShowMainForm kannst Du festlegen, ob die MainForm zum Start angezeigt wird.
-
Das ist auch gefrickelt. Ist schließlich auch meine erste C++ Anwendung. Aber darum geht es nicht.
Ich habe jetzt einen Try-Catch-Block drum herum geschrieben. Die Fehlermeldung wird trotzdem angezeigt. Allerdings habe ich auch einen Try-Catch-Block in der WinMain, bei dem ich fast der Meinung bin, dass der Fehler erst in der WinMain abgefangen wird, und dann erst im OnFormCreate.
Wie die Exception-Geschichte in C++ funktioniert habe ich mir bisher noch nicht angeschaut. Allerdings sollte der Abfang doch genau so funktionieren wie in C# oder Java. Oder irre ich mich da?
-
Ja, funktioniert genau wie in Java.
Im Builder werden aber immer alle Fehlermeldungen angezeigt. Die musst das Programm manuell z.B. aus dem Explorer heraus starten, um zu sehen, ob es funktioniert.
-
Die Anwendung wird aus der Konsole heraus gestartet, damit ich den Parameter anhängen kann. Trotzdem kommt die Fehlermeldung.
-
Ins blaue hinein raten bringt nichts. Poste am besten mal ein wenig Quellcode.
-
Die WinMain hat folgendes:
try { Application->Initialize(); Application->CreateForm(__classid(TForm1), &Form1); Application->ShowMainForm = false; Application->Run(); } catch (Exception &exception) { Application->ShowException(&exception); } catch (...) { try { throw Exception(""); } catch (Exception &exception) { Application->ShowException(&exception); } } return 0;
und der Event OnFormCreate hat
if(ParamStr(1) == "-nowindow") { try { ShowMessage(AnsiString(ParamStr(1))); PCWatchVorbereiten(); delete(this); } catch(EAccessViolation &e) { // nichts tun } } else { this->Show(); }
-
so habe das Ganze mal bei mir ein wenig geändert und compiliert:
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { try { Application->Initialize(); Application->CreateForm(__classid(TForm1), &Form1); Application->Run(); ShowWindow(Application->Handle, SW_HIDE); } catch (Exception &exception) { Application->ShowException(&exception); } ...
und
void __fastcall TForm1::FormCreate(TObject *Sender) { if(ParamStr(1) == "test") { try { ShowMessage(AnsiString(ParamStr(1))); //DoSomething() Application->Terminate(); } catch(...) { } } else Form1->Visible = true; }
Funktioniert fehlerfrei und die Hauptform wird nicht angezeigt.
-
Entschuldige, dass ich erst so spät antworte.
Ich habe Deine Version übernommen und es funktioniert auch.
Allerdings flackert die Anwendung kurz auf und wird erst dann beendet.
Woran kann das liegen?
-
So jetzt flackert nichts mehr auf. Optional kannst Du auch Top und Left der Form auf -5000 setzen
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { try { ShowWindow(Application->Handle, SW_HIDE); Application->Initialize(); Application->ShowMainForm = false; Application->CreateForm(__classid(TForm1), &Form1); Application->Run(); ShowWindow(Application->Handle, SW_HIDE); } ...
-
Dank Dir für die Hilfe.
-
Gerne wieder.
-
Also, ich weiß nicht, was ihr da macht. Bei mir geht folgendes ohne Probleme:
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { try { if( ParamStr(1) != "-nowindow" ) { Application->Initialize(); Application->CreateForm(__classid(TForm1), &Form1); Application->Run(); } } catch (Exception &exception) { Application->ShowException(&exception); } return 0; }