Delphi Otwieranie nowego fomularza

0

Witam serdecznie, takie krótkie pytanko :
Jeśli NIE chcę aby wczytał mi zmienne z formularza 2 (Form2) to jak go pokazać ?

Przykładowo w Form2 mam gdzieś ukryty showmessage('heja');

skoro odpalam Form1 to pokazuje mi Heja :) a nie chcę tego :)

Tak odpalam Form2 :

      Form2:= TForm2.Create(Application); }
      Form1.Hide;
      Form2.ShowModal;

Pozdrawiam

0

No normalni ludzie użyliby Ifa z jakaś zmienną, ale w końcu to dział newbie więc polecam od nauczenia pisania instrukcji warunkowych i tworzenia zmiennych. Wtedy tworzysz zmienną, inicjujesz ją, jak trzeba to zmieniasz a w ifie ustawiasz jak trzeba.

Widzę że dział newbie to już nie newbie tylko nic-nie-umiem-zróbcie-za-mnie

0

Ale co w ifie mam zrobić ? Skoro mi wczytuje zmienne z drugiej formy... To jak to ogarnac ?

0

Dobra bo może się źle wyraziłem. Tak naprawdę sens jest taki i to już nie jest mega newbie :)

Mam Form1 , mam Form2, Form3... i teraz tak. Z Form1 wchodzę na Form2 po to żeby wejść na Form3. Wszystko odbywa się w sposób :

W Form1 :

      Form2:= TForm2.Create(Application); 
      Form1.Hide;
      Form2.ShowModal;

W Form2 :

      Form3:= TForm3.Create(Application); 
      Form2.Hide;
      Form3.ShowModal;

I teraz najważniejsze : w Form3 nie mam showmessage jak napisałem w 1 poscie tylko procedurę, która wczytuje dane z pliku tekstowego. Procedura ta działa gdy jest podpięta pod np. Button1.OnClik , ale jeśli jest w Form3.Create ... to wywala błąd już na starcie ... kumamy ? :)

Co zrobić żeby to ominąć ? Dlatego pytałem bo nie chce zeby mi wczytywalo 3 forme od razu na starcie....

0

Przeczytaj 3 razy to co sam napisałeś i... nie, jednak straciłem wiarę w inteligencję.
Form3.Create jest wywoływane - uwaga, to będzie trudne - w momencie tworzenia formy, czyli wszystko co tam wsadzisz wykona się przy tworzeniu formy, nie napisałeś jaki błąd wywala ale stawiam na jakiś AV bo coś się jeszcze nie zainicjowało, przenieś wszystko co masz w OnCreate do np. OnShow albo podepnij pod przycisk.

0

Niech zgadnę, Twój kod wygląda jakoś tak?

procedure TForm3.FormCreate(Sender: TObject);
begin
  Button1Click(nil);
end;
 
0

Najprawdopodobniej błąd wyskakuje przy tworzeniu formularza; Są dwie opcje:
#w oknie Projekt Options->Forms (skrót Shift+Ctrl+F11) masz wszystkie formularze tworzone automatycznie (do sprawdzenia także w głównym pliku projektu (o rozszerzeniu *.dpr))
#nie zwalniasz pamięci po zamkniętym formularzu
Sprawdź to, ja obstawiam na pkt 1.;

Poza tym tworzysz formularze dynamicznie, a nigdzie nie widzę zwalniania pamięci po ich zamknięciu; Więc zdecyduj się - albo twórz automatycznie wszystkie formularze i nie baw się z ręcznym, albo usuń je z listy automatycznie tworzonych form i twórz je ręcznie, ale pamiętaj o ich zwolnieniu;

Sposób 1 - tworzenie automatyczne

W oknie Project Options->Forms wszystkie formy (Form1, Form2 i Form3) mają być na liście Auto-create forms; Wywołanie formularza Form2 wyglądać będzie tak:

procedure TForm1.Button1Click(Sender: TObject);
begin
  Form1.Hide();
  Form2.ShowModal();
end;

zaś wywołanie Form3 tak:

procedure TForm2.Button1Click(Sender: TObject);
begin
  Form2.Hide();
  Form3.ShowModal();
end;

zostaje jeszcze uzupełnić zdarzenia OnClose:

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Form1.Show();
end;
procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Form2.Show();
end;

Sposób 2 - tworzenie dynamiczne

W oknie Project Options->Forms przenieś Form2 i Form3 na listę Available forms, automatycznie tworzony ma być tylko formularz Form1; Wywołanie formularza Form2 będzie wyglądać tak:

procedure TForm1.Button1Click(Sender: TObject);
begin
  Form1.Hide();

  Form2 := TForm2.Create(Form1);
  Form2.ShowModal();
  Form2.Free();
end;

zaś wywołanie Form3 tak:

procedure TForm2.Button1Click(Sender: TObject);
begin
  Form2.Hide();

  Form3 := TForm3.Create(Form2);
  Form3.ShowModal();
  Form3.Free();
end;

to jeszcze nie wszystko; Możesz jeszcze uzupełnić zdarzenie OnClose w formularzach Form2 i Form3 w następujący sposób:

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
  Form2 := nil;

  Form1.Show();
end;
procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
  Form3 := nil;

  Form2.Show();
end;

i będzie wszystko pięknie działać; W załączniku masz przykładową aplikację napisaną w D7 wykorzystującą dynamiczne tworzenie formularzy; Zapoznaj się z nią i popraw odpowiednio program;

1 użytkowników online, w tym zalogowanych: 0, gości: 1