Mam jedną klasę główną i dwie dziedziczące po niej. W konstruktorze klas dziedziczących wywołuję procedurę z głównej klasy tworzącą nową formę i wyświetlam ją jako ShowModal. Po kliknięciu odpowiedniego przycisku forma ta ma się zamknąć, a stworzona ma zostać nowa. Próbowałem to zrobić na dwa sposoby, ale nie udało mi się ani tak ani tak.
- Procedurę tworzącą dodatkową formę umieściłem w klasie bazowej. Dzięki temu wywołuję ją jeszcze przed zamknięciem poprzedniej formy i wszystko wygląda płynnie. Niestety w ten sposób nie wiem jak odnieść się do procedur umieszczonych w klasach dziedziczących o ile jest to możliwe.
- Procedurę tworzącą dodatkową formę umieściłem w klasach dziedziczących. Dzięki temu mogę się łatwo odnieść do procedur wewnątrz klasy. Problem jest taki, że żeby wywołać tą procedurę, najpierw muszę zamknąć poprzednią formę, przez co jest widoczny przeskok, zanim otworzy się nowa forma. Co więcej kod procedury tworzącej dodatkową formę mimo, że taki sam muszę wstawić do każdej klasy dziedziczącej.
Bardziej odpowiednie wydaje mi się to pierwsze rozwiązanie. Tyle tylko, że decydując się na nie, nie jestem w stanie uruchomić odpowiednich procedur.
Kod napisałem na szybko, może i nieodpowiednie nazwy, ale to tylko tak poglądowo żeby pokazać o co mi chodzi. Po kliknięciu dalej na czerwonym tle pojawia się przez chwilę główna forma z żółtym tłem, a chciałbym, żeby od razu pokazała się Forma dodatkowa z białym tłem.
unit Unit1;
{$mode delphi}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
ExtCtrls, DateUtils, Math, Variants, Grids, Windows,
LMessages;
type
TKlasaBazowa = class(TPersistent)
private
FormaBazowa: TForm;
PrzyciskDalej: TPanel;
procedure TworzFormeBazowa;
procedure PrzyciskDalejClick(Sender: TObject);
public
constructor Create(AOwner: TComponent);
end;
TKlasaDodatkowa = class(TKlasaBazowa)
private
FNumerProcedury: Integer;
FormaDodatkowa: TForm;
PrzyciskDalej: TPanel;
procedure Procedura1;
procedure Procedura2;
procedure Procedura3;
procedure TworzFormeDodatkowa;
procedure PrzyciskDalejClick(Sender: TObject);
public
constructor CreateB(AOwner: TComponent; Index: Integer);
end;
{ TForm1 }
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ private declarations }
Komponent: TKlasaDodatkowa;
Przycisk: TPanel;
procedure PrzyciskClick(Sender: TObject);
public
{ public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
begin
with Form1 do
begin
Left := 0;
Top := 0;
Width := Screen.Width;
Height := Screen.Height;
Hide;
BorderStyle := bsNone;
Color := clYellow;
Caption := 'Forma Glowa';
end;
Przycisk := TPanel.Create(Form1);
with Przycisk do
begin
Parent := Form1;
Left := 0;
Top := 0;
Width := 100;
Height := 50;
Color := clBlue;
Caption := 'Przycisk';
BevelOuter := bvNone;
Cursor := crHandPoint;
OnClick := PrzyciskClick;
end;
end;
procedure TForm1.PrzyciskClick(Sender: TObject);
begin
Komponent := TKlasaDodatkowa.CreateB(Form1, 10);
end;
constructor TKlasaBazowa.Create(AOwner: TComponent);
begin
inherited Create;
end;
procedure TKlasaBazowa.TworzFormeBazowa;
begin
FormaBazowa := TForm.Create(Application);
with FormaBazowa do
begin
Left := 0;
Top := 0;
Width := Screen.Width;
Height := Screen.Height;
Hide;
BorderStyle := bsNone;
Color := clRed;
Caption := 'Forma Bazowa';
end;
PrzyciskDalej := TPanel.Create(FormaBazowa);
with PrzyciskDalej do
begin
Parent := FormaBazowa;
Left := 0;
Top := 0;
Width := 100;
Height := 50;
BevelOuter := bvNone;
Cursor := crHandPoint;
Caption := 'Dalej';
onClick := PrzyciskDalejClick;
end;
end;
procedure TKlasaBazowa.PrzyciskDalejClick(Sender: TObject);
begin
FormaBazowa.Close;
end;
constructor TKlasaDodatkowa.CreateB(AOwner: TComponent; Index: Integer);
begin
inherited Create(AOwner);
TworzFormeBazowa;
FormaBazowa.ShowModal;
TworzFormeDodatkowa;
FormaDodatkowa.Show;
if Index mod 2 = 1 then
Procedura1
else
Procedura2;
end;
procedure TKlasaDodatkowa.TworzFormeDodatkowa;
begin
FormaDodatkowa := TForm.Create(Application);
with FormaDodatkowa do
begin
Left := 0;
Top := 0;
Width := Screen.Width;
Height := Screen.Height;
Hide;
BorderStyle := bsNone;
Color := clWhite;
Caption := 'Forma Dodatkowa';
end;
PrzyciskDalej := TPanel.Create(FormaDodatkowa);
with PrzyciskDalej do
begin
Parent := FormaDodatkowa;
Left := 0;
Top := 0;
Width := 100;
Height := 50;
BevelOuter := bvNone;
Cursor := crHandPoint;
Caption := 'Dalej';
onClick := PrzyciskDalejClick;
end;
end;
procedure TKlasaDodatkowa.PrzyciskDalejClick(Sender: TObject);
begin
if FNumerProcedury = 1 then
Procedura2
else
Procedura3;
end;
procedure TKlasaDodatkowa.Procedura1;
begin
FNumerProcedury := 1;
end;
procedure TKlasaDodatkowa.Procedura2;
begin
FNumerProcedury := 2;
ShowMessage('Procedura 2');
end;
procedure TKlasaDodatkowa.Procedura3;
begin
FNumerProcedury := 3;
Application.Terminate;
end;
end.