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
A kodu nie dasz? To odpowiedź będzie równie ogólnikowa
Form1.Hide;
Form2.Show;
@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
));
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.
Ż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.
Dzięki, pomogło.
Dzięki, pomogło.
Te forum wymaga abyś oznaczył rozwiązanie 'ptaszkiem'. Ew. możesz dać +1 dla postów które pomogły.