Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.03.2012, 22:38   #1
ЛамерВлад
 
Регистрация: 21.03.2012
Сообщений: 6
По умолчанию OnKeyPress не видит нажатие Enter

Пишу калькулятор - форма, 25 Tbitbtn, 1 Tbutton, 1 Tlabel. Решил прикрутить поддержку клавиатуры, на цифры, действия, Enter для =.

KeyPreview установлен в true.
Default на всех кнопках в false.

Для проверки даже создал второй Tlabel, отображающий код приходящий с клавиатуры.

OnKeyPress, OnKeyDown ловят все символы кроме Enter. По нажатию на Enter в Tlabel2 не пишется ничего. Однако срабатывает bitbtn1.click - т.е. кнопка, созданная первой на форме. В принципе успокоился, переназначив на первую созданную кнопку действия, предназначенные для =, но если чередовать нажатия кнопок на клавиатуре и на форме - начинается полная неразбериха - т.е. по нажатию на Enter жмется что ни попадя... Все остальные процедуры исключительно обработка Tbutton. Кто ворует Enter не представляю.

Прошу не винить строго - это моя первая программа на Borland Delphi 7.3.4.3 Build 2011-08-01

Выкладываю полные исходники - кому не влом посмотреть wellcome... Надписи на кнопках сочиняла жена, я не виноват)

P.S. Прошу извинить модераторов но не трите хотябы номер сборки может в нем проблемма...
Вложения
Тип файла: rar nadincalc.rar (9.3 Кб, 10 просмотров)

Последний раз редактировалось ЛамерВлад; 21.03.2012 в 22:52. Причина: Добавлены исходники
ЛамерВлад вне форума Ответить с цитированием
Старый 21.03.2012, 22:40   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
Однако срабатывает bitbtn1.click
Такое впечатление что ты форму модально открываешь...
Код то где?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.03.2012, 23:34   #3
ЛамерВлад
 
Регистрация: 21.03.2012
Сообщений: 6
По умолчанию

Не модально, первоначальный интерфейс старался сделать близким к стандартному калькулятору...
ЛамерВлад вне форума Ответить с цитированием
Старый 22.03.2012, 00:09   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Начал набирать с цифровой клавиатуры.
2+3.
Нажал энтер - высветилось 5
Все нормально, обычный калькулятор точно так же работает.

P.S. Ага, понял где ты запхнулся...
Пропиши в OnClick каждой кнопки в конце обработчиков код: BitBtn1.SetFocus;
Чтоб фокус при клике мышкой на любую кнопку автоматом переводился на кнопку =
I'm learning to live...

Последний раз редактировалось Stilet; 22.03.2012 в 00:16.
Stilet вне форума Ответить с цитированием
Старый 22.03.2012, 00:20   #5
ЛамерВлад
 
Регистрация: 21.03.2012
Сообщений: 6
По умолчанию

А вы уберите 481 строку - ничего не изменится. Я же писал что проблему решил не програмно, а тем что сунул процедуру = в первую созданную кнопку. Если поиграться чередованием кнопок на калькуляторе и на клавиатуре - фокус переходит к другим кнопкам и по нажатию на Enter может сработат например +. Не поленитесь прицепить внизу label отображающий код нажатой клавиши - #13 там не будет...
ЛамерВлад вне форума Ответить с цитированием
Старый 22.03.2012, 00:22   #6
ЛамерВлад
 
Регистрация: 21.03.2012
Сообщений: 6
По умолчанию

За совет спасибо, но может подскажете что вызывает проблему?
ЛамерВлад вне форума Ответить с цитированием
Старый 22.03.2012, 09:43   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
что вызывает проблему?
Когда ты кликаешь мышкой по кнопке, она получает фокус - это и вызывает проблему. Сам механизм кнопки перехватывает нажатие энтера.
А почему? Твоя структура программы ошибочна с самого начала, неверно ты спроектировал. Да программа работает как надо, но в нее заложено множество дырок, которые всплывут позже.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.03.2012, 20:34   #8
ЛамерВлад
 
Регистрация: 21.03.2012
Сообщений: 6
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А почему? Твоя структура программы ошибочна с самого начала, неверно ты спроектировал. Да программа работает как надо, но в нее заложено множество дырок, которые всплывут позже.
С прискорбием подтверждаю, что это моя первая программа, сделанная после просмотра первой серии видеоурока Антона Макрушина... и знания Паскаля, ученого в дремучем 95 году. Буду признателен, если подправите исходники или хотя бы обьясните ошибки.
ЛамерВлад вне форума Ответить с цитированием
Старый 22.03.2012, 22:31   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
если подправите исходники
Хы... Я бы не подправлял а переделывал...
Вот например начал бы так:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Panel1: TPanel;
    Panel2: TPanel;
    procedure FormCreate(Sender: TObject);
    procedure FormClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var b:TButton; ba:boolean;
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
const opers:array[1..5] of string=('+','-','*','/','=');
var i,j,x,y,e:integer;
begin
 e:=1;       ba:=true;
 x:=Panel1.Width div 3;
 y:=Panel1.Height div 3;
 for i:=1 to 3 do begin
  for j:=1 to 3 do begin
    b:=TButton.Create(Panel1);
    b.Parent:=Panel1;
    b.Caption:=IntToStr(e);
    b.OnClick:=FormClick;
    b.tag:=e; inc(e);
    b.Width:=x;
    b.Height:=y;
    b.Top:=(j-1)*y;
    b.Left:=(i-1)*x;
  end;
 end;
  y:=Panel2.Height div length(opers);
  for j:=Low(opers) to high(opers) do begin
    b:=TButton.Create(Panel1);
    b.Parent:=Panel2;
    b.Caption:=opers[j];
    b.OnClick:=FormClick;
    b.tag:=-j;
    b.Width:=Panel2.Width;
    b.Height:=y;
    b.Top:=(j-1)*y;
    b.Left:=0;
  end;

end;

procedure TForm1.FormClick(Sender: TObject);
begin
 if TButton(sender).tag>=0 then begin
  Edit1.Text:=Edit1.Text+TButton(sender).Caption;
  Edit1.SetFocus;
 end else begin
   if ba then begin tag:=StrToIntDef(Edit1.Text,0); ba:=false;Edit1.Text:=''; end else
     case TButton(sender).tag of
       -1:tag:=tag+StrToIntDef(Edit1.Text,0);
       -2:tag:=tag-StrToIntDef(Edit1.Text,0);
       -3:tag:=tag*StrToIntDef(Edit1.Text,0);
       -4:tag:=tag div StrToIntDef(Edit1.Text,0);
       -5:begin Edit1.Text:=IntToStr(tag);ba:=true;end;
     else Edit1.Text:='';
     end;

 end;
end;

end.
Это шаблон. Код действует не корректно, я не буду его поправлять, однако он показывает как в цикле сформировать на экране кнопки, как назначить им цифры и арифметические символы, и как обрабатывать их все в одном обработчике.
А дальше уже просто стоит наворачивать этот обработчик как захочется.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.03.2012, 00:49   #10
ЛамерВлад
 
Регистрация: 21.03.2012
Сообщений: 6
По умолчанию

Т.к. за первостепенное значение имело сходство с стандартным калькулятором, то:
1. От edit и memo отказался, так как нужно было выравнивание с правой стороны и невозможность вставки символов, кроме разрешенных в калькуляторе.
2. От button - т.к. хотелось сделать надписи кнопок разными цветами.

Однако так и не понял, чем подход создавать кнопки на ходу, да еще поверх панелек лучше, чем предварительно нарисованные и расставленные кнопки? А назначение button.tag просто держать в себе тестовую инфу, или он имеет какое-то недоступное моему пониманию назначение. ИМХО, создание кнопок на лету - применимо в приложениях типа сапер, и на что-то большее врядли способно...
ЛамерВлад вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нажатие Enter Кристинка89 Общие вопросы C/C++ 2 18.05.2011 18:40
Повторное нажатие Enter _-Re@l-_ Общие вопросы Delphi 10 28.01.2011 23:48
Нажатие Enter Alana Общие вопросы Delphi 4 27.10.2010 14:31
Как привязать действие onkeypress на клавишу enter #13? yaxx Помощь студентам 1 16.10.2010 09:17
Нажатие Enter Screame Microsoft Office Excel 1 01.11.2009 17:02