Porblem z uruchomieniem drugiej Formy

dział ogólny

Porblem z uruchomieniem drugiej Formy

Nowy postprzez Mietek » poniedziaÅ‚ek, 18 sierpnia 2008, 22:49

Witam

Mam następujący problem przy uruchomieniu programu, sprawdzam czy istnieje pewna dana w pliku, jeśli nie to pokazuje From2 . Umiesciłem więc w zdarzeniu OnCreate Formularza pierwszego polecenie Form2->Show(). No i tu podczas uruchomienia programu wyskakuje błąd, myślę ,że jest to spowodowane nie stworzeniem Form2 przy jej wywołaniu. Form2 zawiera pole Combo. Nie wiem jak ten problem rozwiązać, jeśli ktoś wie jak to byłbym bardzo wdzięczny za pomoc. Chyba ,że jest jakieś okienko typu InputQuery tylko że zawierające Combobox zamiast input, żeby nie korzystać z Form2 a wywoływać tylko okienko.

Pozdrawiam.
Avatar użytkownika
Mietek
 
    NieznanyNieznana

Re: Porblem z uruchomieniem drugiej Formy

Nowy postprzez Cyfrowy Baron » wtorek, 19 sierpnia 2008, 08:23

Nie możesz umieszczać odwołania do Form2 w zdarzeniu OnCreate Form1, gdyż to zdarzenie jest wywoływane w trakcie tworzenia formularza, więc Form2 jeszcze nie istnieje, a co za tym idzie nie można się do niego odwoływać. Umieść tą instrukcję w zdarzeniu OnShow formularza Form1.

Możesz to rozwiązać też inaczej, jeżeli Form2 ma się pojawić przed Form1, a opis tego znajdziesz w serwisie Cyfrowy Baron w dziele: różne 2 | żądanie hasła podczas logowania. Jest tam opisany sposób na uruchomienie okna z polami do logowania i pobierania hasła, ale równie dobrze może to być Twoje okno Form2.

Znajdziesz tam taki kod:

Kod: Zaznacz cały
/---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop

#include <memory>       
#include "PWDialogUnit.h"

USERES("Project1.res");
USEFORM("Unit1.cpp", Form1);
USEFORM("PWDialogUnit.cpp", PWDialog);
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
        try
        {

                 {                                                               
                  AnsiString error_msg("NieprawidÅ‚owe hasÅ‚o! DostÄ™p zabroniony!");
                  std::auto_ptr<TPWDialog> PWDialog(new TPWDialog(NULL));       
                  if(PWDialog->ShowModal() == mrOk)                             
                  {                                                             
                   if(PWDialog->PasswordEdit->Text != "jakieÅ› hasÅ‚o")         
                   throw EAbort(error_msg);                                     
                  }                                                             
                  else throw EAbort(error_msg);                                 
                 }                                                               


                 Application->Initialize();
                 Application->CreateForm(__classid(TForm1), &Form1);
                 Application->CreateForm(__classid(TPWDialog), &PWDialog);
                 Application->Run();
        }
        catch (Exception &exception)
        {
         Application->ShowException(&exception);
        }
        return 0;
}
//---------------------------------------------------------------------------


Jeżeli nie pobierasz hasła to powinno to chyba wyglądać tak - nie sprawdzałem:

Kod: Zaznacz cały
/---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop

#include <memory>       
#include "Form2.h" // pozmieniałem na Form2

USERES("Project1.res");
USEFORM("Unit1.cpp", Form1);
USEFORM("Form2.cpp", Form2); // pozmieniałem na Form2
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
        try
        {

                 {                                                               
                  std::auto_ptr<TForm2> Form2g(new TForm2(NULL));  // pozmieniaÅ‚em na Form2
                  Form2->Show(); // pozmieniaÅ‚em na Form2,
                       /* zmieniÅ‚em również ShowModal na Show ale okno Form2
                           nie powstrzyma tutaj uruchomienia Form1, gdyż nie jest
                           oknem modalnym, jeżeli chcesz modalne zastosuj ShowModal
                            program niczego nie sprawdza, po prostu wywoÅ‚uje Form2 */                                                           
                 }                                                               


                 Application->Initialize();
                 Application->CreateForm(__classid(TForm1), &Form1);
                 Application->CreateForm(__classid(TForm2), &Form2); // pozmieniaÅ‚em na Form2
                 Application->Run();
        }
        catch (Exception &exception)
        {
         Application->ShowException(&exception);
        }
        return 0;
}
//---------------------------------------------------------------------------


Pełen opis i sposób kodowania w podanej poradzie, koniecznie zajrzyj.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Porblem z uruchomieniem drugiej Formy

Nowy postprzez kinio » wtorek, 19 sierpnia 2008, 10:54

Cześć

Natomiast jeżeli koniecznie chcesz aby to wykonywało się w zdarzeniu OnCreate to zamiast
Kod: Zaznacz cały
Form2->Show();

napisz:
Kod: Zaznacz cały
Form2 = new TForm2(Application);
Form2->Show();

Czyli tworzysz obiekt formularza drugiego wcześniej jak to jest przewidziane :)

Pozdr!
If a machine is expected to be infallible, it cannot also be intelligent.
-- A.Turing
Avatar użytkownika
kinio
Homos antropiczny
Homos antropiczny
 
Posty: 67
Dołączył(a): poniedziałek, 14 lipca 2008, 08:51
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    NieznanyNieznana

Re: Porblem z uruchomieniem drugiej Formy

Nowy postprzez Cyfrowy Baron » wtorek, 19 sierpnia 2008, 13:50

Jeżeli już decydujesz się na dynamiczne tworzenie formularza jak podał kinio to w opcjach projektu - menu: Project - Options na zakładce Forms musisz przenieść Form2 z okna Auto-create forms do okna Available forms.





Jeżeli chcesz, żeby Form2 uruchamiał się (pokazywał) razem z formularzem głównym, to zapomnij o wszystkim co wyżej przeczytałeś. Nie musisz pisać żadnego kodu wystarczy, że ustawisz właściwość Visible dla Form2 na true, a będzie zawsze pokazywał się przy uruchamianiu aplikacji.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przeglÄ…da forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 41 gości

cron