ein form2 als modular anzeigen lassen
-
hi
hab das problem das ichs einfach nicht mehr hinbekomm ein form anzeigen zu lassen ich muss wohl irgendwo ein fehler drin haben hab aber keine ahnung wo....
#include <vcl.h> #pragma hdrstop #include "Unit1.h" #include "Unit2.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { Form2->ShowModal(); } //---------------------------------------------------------------------------
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit2.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm2 *Form2; //--------------------------------------------------------------------------- __fastcall TForm2::TForm2(TComponent* Owner) : TForm(Owner) { } //---------------------------------------------------------------------------
#include <vcl.h> #pragma hdrstop //--------------------------------------------------------------------------- USEFORM("Unit1.cpp", Form1); USEFORM("Unit2.cpp", Form2); //--------------------------------------------------------------------------- WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { try { Application->Initialize(); Application->CreateForm(__classid(TForm1), &Form1); Application->CreateForm(__classid(TForm2), &Form2); Application->Run(); } catch (Exception &exception) { Application->ShowException(&exception); } return 0; }
sollte doch gehen oder???
bekomm dann immer die fehlermeldungIm Projekt test.exe ist eine Exception der Klasse EAccess Violation aufgetreten. Meldung: 'Zugriffsverletzung bei Adresse 00424DA2 im Modul 'test.exe'. Lesen von Adresse 000002EC'. Prozeß wurde angehalten. Mit Einzelanweisung oder Start fortsetzen.
hab auch den feler soweit lokalisiert das er in der zeile auftritt:
Form2->ShowModal();
kann mir jemand helfen???
kann das ein fehler sein weil ich seit kurzem Vista home premium drauf hab???
für das programm aber als administrator aus sonst gehts auch bei alten projekten...mfg
patrick
-
im FormCreate von Form1 existiert Form2 überhaut noch nicht, siehe Zeile 12 und 13 von deinem 3. Quellcode-Abschnitt
verwende den Konstruktur von Form1 statt FormCreate und generiere dort das Form2 dynamisch, vorher mußt du noch in den Projektoptionen das Form2 zu den nicht automatisch generierten Formularen verschieben.
die Suchfunktion liefert z.B. http://www.c-plusplus.net/forum/viewtopic-var-t-is-194629-and-start-is-0-and-postdays-is-0-and-postorder-is-asc-and-highlight-is-%2Aform2%2A.html
-
oh danke ja daran hab ich garnicht gedacht...
aber wie kann ich dann über einen button das eigene form2 im form2 schliesen hab schon
Form2->Close(); und Form2->Hide(); versucht aber dann bringt der wieder nur ne fehlermeldung
änlich der aus der eigendlichen frage also nur mit anderen speicheradressen...muss ich da über form1 gehen also Form1->MyForm2->Close(); oder so ähnlich oder wie geht das dann???
-
Close() muss aber funktionieren. Da muss ein Fehler sein. Ob in Form2 oder in Form1 kann ich nicht sagen.
Erst durch das Close() wird ja das aufrufende Formular weiter ausgeführt. Nicht vergessen, dass dynmamisch erzeugte Form2 auch wieder zu löschen. Das ist aber wohl nicht das Problem hier.
-
so ok hab nochmal mein zeug raukopiert...
wo könnte da noch der fehler sein???Das Projekt selbst:
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop //--------------------------------------------------------------------------- USEFORM("Unit1.cpp", Form1); //USEFORM("Unit2.cpp", Form2); //--------------------------------------------------------------------------- WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { try { Application->Initialize(); Application->CreateForm(__classid(TForm1), &Form1); Application->Run(); } catch (Exception &exception) { Application->ShowException(&exception); } return 0; }
Form1:
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" #include "Unit2.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { TForm2* MyForm2 = new TForm2(NULL); MyForm2->ShowModal(); delete MyForm2; } //---------------------------------------------------------------------------
//--------------------------------------------------------------------------- #ifndef Unit1H #define Unit1H //--------------------------------------------------------------------------- #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> //--------------------------------------------------------------------------- class TForm1 : public TForm { __published: // Von der IDE verwaltete Komponenten void __fastcall FormCreate(TObject *Sender); private: // Anwender-Deklarationen public: // Anwender-Deklarationen __fastcall TForm1(TComponent* Owner); }; //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; //--------------------------------------------------------------------------- #endif
Form2:
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit2.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm2 *Form2; //--------------------------------------------------------------------------- __fastcall TForm2::TForm2(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm2::Button1Click(TObject *Sender) { Form2->Hide(); //Form2->Close(); } //---------------------------------------------------------------------------
//--------------------------------------------------------------------------- #ifndef Unit2H #define Unit2H //--------------------------------------------------------------------------- #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> //--------------------------------------------------------------------------- class TForm2 : public TForm { __published: // Von der IDE verwaltete Komponenten TButton *Button1; void __fastcall Button1Click(TObject *Sender); private: // Anwender-Deklarationen public: // Anwender-Deklarationen __fastcall TForm2(TComponent* Owner); }; //--------------------------------------------------------------------------- extern PACKAGE TForm2 *Form2; //--------------------------------------------------------------------------- #endif
wo hab ich da noch den fehler drin???
der debuger bleibt dann immer mit der speicher fehlermeldung von oben beim punkt
delete MyForm2; atehen....
-
Moin,
versuch doch einfach mal das dynamische Form per Knopfdruck zu erzeugen und nicht beim Start, nur zum Testen...
Geschlossen werden muss es übrigens mit ->Close(); welches du auskommentiert hast.
Ich schliesse lieber mit this, dann kann ich nicht das falsche Form erwischen:void __fastcall TForm2::Button1Click(TObject *Sender) { this->Close(); } //---------------------------------------------------------------------------
MfG
-
void __fastcall TForm2::Button1Click(TObject *Sender) { Form2->Hide(); //Form2->Close(); } //---------------------------------------------------------------------------
Hier liegt der Fehler. Du versuchst auf die normalerweise automatisch erzeugte Instanz von TForm2 zuzugreifen, nämlich Form2, obwohl es diese nicht mehr gibt.
Dies darfst Du grundsätzlich nicht machen, wenn Du dynamisch erzeugte Formulare verwendest. Man kann das Form2 auch einfach weglassen, oder aber this verwenden.