Zmiana wyświetlanego formularza

0

Cześć. Staram się napisać program w Lazarusie, ale że ostatnio widziałem go na oczy 2 lata temu, a szczytem moich umiejętności było wyliczenie silni, mam mały problem:
Są dwa formularze, na każdym jeden przycisk. Co mam napisać w kodzie pierwszego przycisku, aby zniknął pierwszy formularz, a pojawił się drugi?
Gdybym nie jasno się wyraził, może screen pomoże: http://wstaw.org/m/2012/01/26/screen.jpg

0

A kodu nie dasz? To odpowiedź będzie równie ogólnikowa

Form1.Hide;
Form2.Show;
0

@123, to jest jedno rozwiązanie; Dobre, ale forma nie zostaje zniszczona; Takie cuś wykorzystuje się, gdy obydwie formy są już utworzone, i trzeba jedynie pokazać tą drugą, właśnie tak jak kolega wyżej napisał (metody Show() i Hide());

Jeśli jednak pierwsza forma jest utworzona, a druga nie, trzeba ją utworzyć; Poniżej przykładowy kod:

procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2 := TForm2.Create(Self);
  Form2.Show();

  Form1.Hide();
end;

Podczas zamykania formularza drugiego trzeba pokazać pierwszy, a samego siebie zniszczyć; W takim wypadku należy w zdarzeniu OnClose drugiego formularza napisać takie dwie linijki:

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

a w zdarzeniu OnDestroy drugiego formularza wpisać instrukcję pokazującą pierwsze okno:

procedure TForm2.FormDestroy(Sender: TObject);
begin
  Form1.Show();
end;

Jedyne o czym musisz pamiętać, to o dodaniu do listy modułów w sekcji implementation nazwy modułów, z których pochodzi formularz, który chcemy obsłużyć oraz o tym, że formularz Form2 nie może być tworzony automatycznie (trzeba go przenieść z sekcji auto-create forms do available forms w oknie Project Options (skrót Shift + Ctrl + F11, zakładka Forms));

0

Dzięki za pomoc, trochę mi rozjaśniliście, ale dalej jestem w kropce. Na początku faktycznie za mało napisałem, więc teraz może lepiej wyjaśnię.
W IDE utworzyłem dwa formularze- pierwszy jest ekranem startowym, który ma za zadanie uruchamiać inne (na razie tylko jeden); drugi jest kalkulatorem, z którego można wrócić do formularza startowego.

http://wstaw.org/m/2012/01/26/screen2.jpg

I tak jak podał 123, mogę ukryć pierwszy po kliknięciu, ale już mam problem z pokazaniem drugiego. Nie wiem gdzie do niego się odwołać, żeby kompilator go widział. Dodam, że drugi formularz wstawiłem za pomocą Plik --> Nowy formularz.

Nie znam się na obiektowym Pascalu, więc wrzucę wszystkie kody:

plik projektu project1.lpr (nic nie zmieniałem, wszystko program wygenerował)

program project1;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Interfaces, // this includes the LCL widgetset
  Forms, Unit1, Unit2
  { you can add units after this };

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TForm2, Form2);
  Application.Run;
end.       
 

unit1.pas - czyli pierwszy formularz, dopisałem w nim tylko dwie linijki, daje to tylko tyle, że po wciśnięciu guzika Kalkulator, wszystko znika (ale dalej działa w tle)
( Form1.hide(); { Form2.show(); <---kompilator nie wie co to za obiekt} )

 
unit Unit1; 

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    kalkulator_btn: TButton;
    Label1: TLabel;
    procedure kalkulator_btnClick(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end; 

var
  Form1: TForm1; 

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.kalkulator_btnClick(Sender: TObject);
begin
  Form1.hide();
 { Form2.show();  <---kompilator nie wie co to za obiekt}
end;

end.                           

unit2.pas - czyli coś, gdzie powinien być kod drugiego formularza

unit Unit2; 

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;

type

  { TForm2 }

  TForm2 = class(TForm)
    wroc_btn: TButton;
    dodaj_btn: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Label1: TLabel;
    procedure dodaj_btnClick(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end; 

var
  Form2: TForm2; 

implementation

{$R *.lfm}

{ TForm2 }

procedure TForm2.dodaj_btnClick(Sender: TObject);
begin

end;

end.     
 

Czy moglibyście napisać gotowy kod do przełączania formularzy- tak chyba będzie mi łatwiej to zrozumieć? W każdym razie, dzięki za zainteresowanie.

1

Żeby unity siebie widziały:

W unit1 pod implementation dodaj sobie uses z unit2.
Tak samo w unit2 tylko że dodajesz unit1.

Dzięki temu unity będą widzieć siebie nawzajem, a nie będzie circular reference.

0

Dzięki, pomogło.

0

Dzięki, pomogło.

Te forum wymaga abyś oznaczył rozwiązanie 'ptaszkiem'. Ew. możesz dać +1 dla postów które pomogły.

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