Создал проект, в котором на Form1 имеется 4 Panel с картинками. Перемещение между ними происходит только клавишами (стрелками) на клавиатуре, при нажатии Enter'a на определенной картинке запускается другая форма (картинка 1 запускает Form2, 2 - Form3 и т.д.).
На второй форме так же навигация происходи только при помощи клавиатуры (стрелки и Enter, закрытие по Esc). Проблема возникла со второй формой (Form2, с остальными пока еще не работал), т.к. не обрабатывается KeyDown на ней, только на главной форме (Form1).
Подскажите, пожалуйста, где ошибка или как лучше сделать?

По отдельности каждая форма работают нормально, как только объединяю их в один проект - проблемы с дочерними формами (при старте они не создаются, а лишь, при вызове).
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, Unit2, Unit3, Unit4, Unit5;
type
TForm1 = class(TForm)
Panel1: TPanel;
Panel2: TPanel;
Panel3: TPanel;
Panel4: TPanel;
Image1: TImage;
Image2: TImage;
Image3: TImage;
Image4: TImage;
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure FormCreate(Sender: TObject);
procedure ImgTrue(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
i:Integer;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var j:integer;
begin
i:=1;
//загрузка изображений в компоненты
for j:=1 to 4 do TImage(FindComponent('Image'+IntToStr(j))).Picture.LoadFromFile('name'+IntToStr(j)+'.bmp');
end;
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
case key of
VK_LEFT:
begin
Dec(i);
if i<1 then i:=4;
ImgTrue(Sender);
end;
VK_RIGHT:
begin
Inc(i);
If i>4 then i:=1;
ImgTrue(Sender);
//Image1.Picture.Bitmap.LoadFromFile('name'+IntToStr(i)+'.bmp');
end;
VK_RETURN:
begin
if i=1 then
begin
if (not Assigned(Form2)) then
Form2:=TForm2.Create(Self);
Form2.Show;
end;
if i=2 then
begin
if (not Assigned(Form3)) then
Form3:=TForm3.Create(Self);
Form3.Show;
end;
if i=3 then
begin
if (not Assigned(Form4)) then
Form4:=TForm4.Create(Self);
Form4.Show;
end;
if i=4 then
begin
if (not Assigned(Form5)) then
Form5:=TForm5.Create(Self);
Form5.Show;
end;
end;
end;
end;
procedure TForm1.ImgTrue(Sender: TObject);
var j:integer;
begin
for j:=1 to 4 do
TPanel(FindComponent('Panel'+IntToStr(j))).BevelOuter:=bvRaised;
TPanel(FindComponent('Panel'+IntToStr(i))).BevelOuter:=bvLowered;
end;
end.
Код:
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, jpeg, ComCtrls, ShellAPI, MMSystem;
type
TForm2 = class(TForm)
lbl1: TLabel;
lbl2: TLabel;
img3: TImage;
img4: TImage;
tmr1: TTimer;
procedure FormCreate(Sender: TObject);
procedure Form2KeyDown(Sender: TObject; var Key: Word;Shift: TShiftState);
procedure tmr1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
p,a:Integer;
implementation
{$R *.dfm}
procedure TForm2.FormCreate(Sender: TObject);
begin
p:=0;
a:=1;
img3.Picture.Bitmap.LoadFromFile('Pictures\name.bmp');
Form2.DoubleBuffered:=true;
end;
procedure TForm2.Form2KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
case key of
VK_RIGHT:
begin
a:=1;
p:=p+a;
if p=66 then
p:=1;
if p=0 then
p:=65;
sndPlaySound('next.wav',SND_ASYNC);
img3.Picture.Bitmap.LoadFromFile('Pictures\name'+IntToStr(p)+'.bmp');
end;
VK_LEFT:
begin
a:=-1;
p:=p+a;
if p=66 then
p:=1;
if p<=0 then
p:=65;
sndPlaySound('next.wav',SND_ASYNC);
img3.Picture.Bitmap.LoadFromFile('Pictures\name'+IntToStr(p)+'.bmp');
end;
VK_RETURN:
begin
ShellExecute(Handle, nil, PChar('Games\game'+IntToStr(p)+'.nes'), nil, nil, SW_SHOWNORMAL);
end;
VK_ESCAPE:
begin
Form2.Close;
end;
end;
lbl1.Caption:=('Game '+inttostr(p)+' of 65');
end;
procedure TForm2.tmr1Timer(Sender: TObject);
begin
lbl2.Caption:=TimeToStr(Now);
end;
end.