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:mniej niż minuta
- 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:mniej niż minuta
- 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)
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;
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.