Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 21.12.2013, 16:13
vers0 vers0 вне форума
Прохожий
 
Регистрация: 21.12.2013
Адрес: Донецк
Сообщения: 26
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Не работает KeyDown во второй форме

Создал проект, в котором на 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.
Ответить с цитированием
  #2  
Старый 22.12.2013, 00:00
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

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

На второй форме так же навигация происходи только при помощи клавиатуры (стрелки и Enter, закрытие по Esc). Проблема возникла со второй формой (Form2, с остальными пока еще не работал), т.к. не обрабатывается KeyDown на ней, только на главной форме (Form1).
У меня нормально обрабатываются KeyDown и во второй форме.
Только несколько замечаний.
Вот здесь:
Код:
var
  Form2: TForm2;
сделай так:
Код:
var
  Form2: TForm2 = nil;
Так же сделай и в других формах которые автоматически не создаются.

И ещё убери упоминание Form2 вот здесь:
Код:
procedure TForm2.FormCreate(Sender: TObject);
begin
  p := 0;
  a := 1;
  img3.Picture.Bitmap.LoadFromFile('Pictures\name.bmp');
  Form2.DoubleBuffered := true;
end;
Ответить с цитированием
  #3  
Старый 22.12.2013, 17:35
vers0 vers0 вне форума
Прохожий
 
Регистрация: 21.12.2013
Адрес: Донецк
Сообщения: 26
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

За замечания спасибо.
Вообще мистика какая-то...даже
Код:
lbl2.Caption:=TimeToStr(Now);
не отрабатывает на второй форме Переустановка Delphi не помогла, все как и прежде - по отдельности работают, вместе не хотят.

Может подскажите где могут быть ошибки именно по формам, их иерархии, расположении в проекте и т.д. (подойдут все возможные варианты)?
Ответить с цитированием
  #4  
Старый 22.12.2013, 22:00
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от vers0
За замечания спасибо.
После устранения замечаний всё равно не работает?
Цитата:
Сообщение от vers0
Вообще мистика какая-то...даже
Код:
lbl2.Caption:=TimeToStr(Now);
не отрабатывает на второй форме Переустановка Delphi не помогла, все как и прежде - по отдельности работают, вместе не хотят.
Я вчера код который ты привёл у себя пробовал - у меня всё работало. Сейчас новый проект создал с твоим исходным кодом - опять всё нормально работает.
Цитата:
Сообщение от vers0
Может подскажите где могут быть ошибки именно по формам, их иерархии, расположении в проекте и т.д. (подойдут все возможные варианты)?
К сожалению ясновидением я не наделён. Могу разве что попытаться угадать: раз события (таймер, клавиши) не работают, то скорее всего у тебя просто не привязаны обработчики событий к компонентам (через инспектор объектов). Угадал?
Ответить с цитированием
  #5  
Старый 23.12.2013, 10:50
vers0 vers0 вне форума
Прохожий
 
Регистрация: 21.12.2013
Адрес: Донецк
Сообщения: 26
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

После устранения - не работает.
Цитата:
скорее всего у тебя просто не привязаны обработчики событий к компонентам (через инспектор объектов). Угадал?

Object Inspector -->Events для Image и Label нет обработчиков, точно, но их и не должно быть по идее.
Спасибо хоть за какую-то помощ, будем искать...
Ответить с цитированием
  #6  
Старый 23.12.2013, 10:57
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от vers0
Object Inspector -->Events для Image и Label нет обработчиков, точно, но их и не должно быть по идее.
Так а причём тут Image и Label? Для срабатывания на второй форме горячих клавиш должно быть привязано событие OnKeyDown формы, а для срабатывания таймера должно быть привязано событие OnTimer таймера.
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
vers0 (23.12.2013)
  #7  
Старый 23.12.2013, 12:18
vers0 vers0 вне форума
Прохожий
 
Регистрация: 21.12.2013
Адрес: Донецк
Сообщения: 26
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от poli-smen
Так а причём тут Image и Label? Для срабатывания на второй форме горячих клавиш должно быть привязано событие OnKeyDown формы, а для срабатывания таймера должно быть привязано событие OnTimer таймера.

Дай-ка я тебя расцелую тупанул так тупанул...спасибо за наставление
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 01:46.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025