Przechodzenie między formami

0

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!

0

Pokaż jak ukrywasz tą główną i jak próbujesz ją znów pokazać.

0

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.

0

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!

0

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)

0

Oo, o to mi chodziło, taki system 'wstecz' i 'dalej'. Wszystko działa jak natura chciała :D Bardzo proste rozwiązanie, nie wiem czemu sam na to nie wpadłem ... Może dlatego że dopiero niedawno zacząłem obiektówkę ;) W każdym razie dzięki serdeczne masz u mnie duże jasne pełne

0
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;

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