Witam, mam problem: powiedzmy że mam formę główną, z której odpalam formę drugą, jednocześnie ukrywając tą główną. Chciałbym uzyskać efekt w którym po zamknięciu tej drugiej formy, znów pokazała się ta pierwsza. Czy da się to jakoś zrobić? Próbowałem wielu rzeczy ale efekt zawsze ten sam - po zamknięciu drugiej formatki ta pierwsza jest nadal ukryta, a program działa w tle. POMOCY!
- Rejestracja:prawie 20 lat
- Ostatnio:około 10 godzin
- Lokalizacja:Gorlice
Sprawa jest banalnie prosta przy czym 2 formę najlepiej tworzyć dynamicznie (choć nie jest to konieczne).
W Unit1 (z deklaracją Form1):
implementation
uses Unit2; //dla Form2
{$R *.dfm}
procedure TForm1.btnShowForm2Click(Sender: TObject); //przykladowo po kliknieciu tego przycisku pojawia sie Form2
begin
if not Assigned(Form2) then
Form2:= TForm2.Create(Self);
Form1.Hide;
Form2.Show;
end;
w Unit2 (z deklaracją Form1)
implementation
{$R *.dfm}
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:= caFree;
Application.MainForm.Show;
end;
procedure TForm2.FormDestroy(Sender: TObject);
begin
Form2:= nil;
end;
No i albo ręcznie w pliku projektu trzeba usunąć lub wykomentować:
//Application.CreateForm(TForm2, Form2);
zamiast tego można to zrobić w opcjach projektu w auto-create forms.
W zasadzie *Application.Mainform.Show; * działa i problem byłby rozwiązany, ale zapomniałem dodać że program będzie miał docelowo 10 form, i chciałbym żeby będąc np. w 5 formie, po naciśnięciu jakiegoś przycisku pojawiła się forma 4, albo 8, czy jakaś inna dowolna forma, a nie główna. Aa, i dodam że dynamiczne tworzenie form raczej nie wchodzi w grę. Dzięki za pomoc!
- Rejestracja:prawie 20 lat
- Ostatnio:około 10 godzin
- Lokalizacja:Gorlice
Jeżeli dobrze rozumiem to trzeba by zapamiętywać która forma wywołała daną formę tak aby po jej zamknięciu pokazało poprzednią czyli robisz sobie dla wszystkich form coś takiego:
private
{ Private declarations }
fLastForm: TForm;
public
{ Public declarations }
procedure ShowForm(LastForm: TForm);
end;
var
Form1: TForm1;
implementation
uses Unit2, Unit3, Unit4; //dla Form2, Form3, Form4
{$R *.dfm}
procedure TForm1.ShowForm(LastForm: TForm);
begin
fLastForm:= LastForm;
if Assigned(fLastForm) then
fLastForm.Hide;
Show;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if Assigned(fLastForm) then
fLastForm.Show;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Form2.ShowForm(Self); //przyklodowo otwiera Form2
end;
A później otwierasz formy za pomocą publicznej procedury ShowForm której parametrem jest forma wywołująca (ta która będzie pokazana po jej zamknięciu)

- Rejestracja:ponad 13 lat
- Ostatnio:około 2 godziny
- Lokalizacja:Tuchów
- Postów:12164
Zełus napisał(a)
Bardzo proste rozwiązanie, nie wiem czemu sam na to nie wpadłem ... Może dlatego że dopiero niedawno zacząłem obiektówkę
To może najpierw poczytaj o tym i poćwicz, a nie leć od razu na forum... Forum służy do pomagania jeśli kandydat posiada stosowną wiedzę a mimo to nie potrafi wskazać błędu;
Poza tym tego typu rzeczy są raczej niewykorzystywane - okno główne programu nie jest ukrywane, a potomny formularz tworzony jest dynamicznie (tak, jak napisał Ci @kAzek) i wywoływany modalnie - zainteresuj się tym;