Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.10.21;
Скачать: CL | DM;

Вниз

Привязка клавиатуры к кнопкам, у которых используется Tag   Найти похожие ветки 

 
SveTTT   (2007-09-30 15:15) [0]

Подскажите, пожалуйста!
Как для данной функции

procedure Tc_CAL.DigitBtnClick(Sender: TObject);
var
   Btn: TButton;
   ch: Char;
begin
 Btn := Sender as TButton;
 ch  := Chr(48+Btn.Tag);

 case Btn.Tag of
 1..9:
   if f = 0 //первая цифра
       then begin
           Edit1.Text := ch;
           f := 1; //ожидаем цифру дальше

       end
   else Edit1.Text := Edit1.Text + ch;

 0:
     if Edit1.Text <> "0"
       then  Edit1.Text := Edit1.Text + "0";

 end;
end;


реализовать нажатие кнопок с клавиатуры.

Сама я пробывала фокусировать курсор на Edit1, и туда добавила (для примера)

procedure Tc_CAL.Edit1KeyDown(Sender: TObject; var Key: Word;
 Shift: TShiftState);

begin
   if key=49 then
   ch  := "1";
 //  f := 1;
end;

 

, но толком ничего не вышло.  Подскажите как привязать клавиатурные кнопки (дублирование нажатия).


 
vpbar ©   (2007-09-30 18:12) [1]

Вы неправильно задачу ставите. Вам  нужно не это. (это у меня телепатор работает).
А во поводу сабжа - нифига не понял. Как привязать клавиатурные кнопки (веревочкой)
Дублировать нажатия (это чтобы нажал один раз "О" а в проле ввода "ОО" появилось?)


 
SveTTT   (2007-09-30 21:54) [2]

Буду учиться задавать вопрос.

Итак:
1. Первый (приведенный код) реализует функцию нажатия 10 кнопок TButton расположенных вместе с полем TEdit и передающих в него значения - равные своим Tag. Tag соответствует значению кнопки - от 0 до 9. (Типа калькулятора).
2. Помогите,пожалуйста, реализовать ввод этих значений, но с клавиатуры.

Правильно ли сформулирован основной вопрос-просьба.

С уважением.


 
Leonid Troyanovsky ©   (2007-09-30 22:15) [3]


> SveTTT   (30.09.07 21:54) [2]

> 2. Помогите,пожалуйста, реализовать ввод этих значений,
> но с клавиатуры.

Это событие Edit1.OnKeyPress:

ch  := StrToInt(key);
case Ord(ch) of
  1..9:
    if f = 0 //первая цифра
      then begin
          Edit1.Text := ch;
          f := 1; //ожидаем цифру дальше

       end
    else Edit1.Text := Edit1.Text + ch;

  0:
    if Edit1.Text <> "0"
      then  Edit1.Text := Edit1.Text + "0";
 else
   raise Exception.Create(..);
end;


--
Regards, LVT.


 
vpbar ©   (2007-09-30 22:30) [4]

если фокус на поле то так
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
case key of
 "0".."9",#8:exit;
 else Key:=#0;
end;
end;
если нет то Form1.KyPreview:=true; и обработчик такой  
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
case key of
 "0".."9":with Edit1 do Text:=Text+Key;
 #8:  with Edit1 do Text:=copy(Text,1,length(Text)-1);
 else
end;
end;


 
SveTTT   (2007-09-30 22:30) [5]

Почему ругается на ch  := StrToInt(key);

[Error] S_CALC_.PAS(202): Incompatible types: "Char" and "Integer"


 
vpbar ©   (2007-09-30 22:32) [6]

SveTTT   (30.09.07 22:30) [5]
Гы потомусто Incompatible types: "Char" and "Integer"
Или по русски тип символ и число не совместимы.
Ну нельзя делать с символами тоже что и с числами. Не получится умножить А на С.


 
SveTTT   (2007-09-30 22:57) [7]


> Ну нельзя делать с символами тоже что и с числами. Не получится
> умножить А на С.

O"k. Но тогда как быть?

> если фокус на поле то так
> procedure TForm1.Edit1KeyPress(Sender: TObject; var Key:
>  Char);
> begin
> case key of
>  "0".."9",#8:exit;
>  else Key:=#0;
> end;
> end;
> если нет то Form1.KyPreview:=true; и обработчик такой  
> procedure TForm1.FormKeyPress(Sender: TObject; var Key:
> Char);
> begin
> case key of
>  "0".."9":with Edit1 do Text:=Text+Key;
>  #8:  with Edit1 do Text:=copy(Text,1,length(Text)-1);
>  else
> end;
> end;

Это тоже не подходит, т.к. событие нажатия клавиши не выполняет условий f=0 (ожидание ввода первого символа) и f=1 (ожидане следующего).

Еще дополняю код операции и код обработки арифм. действий:
<CODE// выполнение операции
procedure DoOper;
var
   numb: real; // число на индикаторе
begin
   // accum содержит результат предыдущей
   // операции, oper - код операции, которую
   // надо выполнить. Операнд находится
   // на индикаторе.
   numb := StrToFloat(c_CAL.Edit1.Text);
   case oper of
   0: accum := numb;
   1: accum := accum + numb;
   2: accum := accum - numb;
   3: accum := accum * numb;
   4: accum := accum / numb;
   end;
   c_CAL.Edit1.Text := FloatToStr(accum);
end;

// Обрабатывает щелчок на кнопках "+", "-" и "="
procedure Tc_CAL.OpBtnClick(Sender: TObject);

var
 Btn: TButton;
begin
 Btn := Sender as TButton;
 if f = 0 // ждем первую цифру, пользователь
          // щелкнул на кнопке операции
   then
      // свойство Tag кнопки хранит код операции
      oper :=  Btn.Tag // запомним операцию
 else begin
   DoOper;          // выполнить предыдущую операцию
   oper := Btn.Tag; // запомнить текущую операцию
  f:=0;            // ждем первую цифру нового числа

 Edit1.SetFocus;
 Edit1.AutoSelect := false;
 with Edit1 do SelStart := Length(Text);

 end;
 

end;


 
vpbar ©   (2007-09-30 23:10) [8]

>>Но тогда как быть?
Учитесь, студент.
Я в свое время,когда писал на лабе калькулятор, от лени (не охото писать кучу оброботок разных операций) помозговал и написал парсер и интерпритатор (правда тогда я не знал что это так называется), который парсил и вычислял выражения типа 1+2*sin(x^2).
В окошке калькултора было поле ввода и кнопка равно. И ничего, зачет был.


 
Leonid Troyanovsky ©   (2007-09-30 23:17) [9]


> SveTTT   (30.09.07 22:30) [5]

> Почему ругается на ch  := StrToInt(key);

В OnKeyPress key: Char, sorry.
Т.е., ch = key.

--
Regards, LVT.


 
SveTTT   (2007-09-30 23:24) [10]

to
> Leonid Troyanovsky ©   (30.09.07 23:17) [9]


а какие параметры вraise Exception.Create(..);


 
SveTTT   (2007-09-30 23:32) [11]

Плохо мне, не понимаю. от
> Leonid Troyanovsky
вроде работает, но при выполнении ариф.действий ничего не происходит, т.к. результаты ввода с клавиатуры не запоминаются.

Пока решение такое -   Key := Chr(0);  . Пойду спать.


 
Leonid Troyanovsky ©   (2007-10-01 10:22) [12]


> SveTTT   (30.09.07 23:32) [11]

> вроде работает, но при выполнении ариф.действий ничего не
> происходит, т.к. результаты ввода с клавиатуры не запоминаются.

Например, сделай Edit1 Readonly, а в его OnKeyPress:

case Key of
 "0": Button0.Click;
 "1": Button1.Click;
 ..
end
;

--
Regards, LVT.



Страницы: 1 вся ветка

Текущий архив: 2007.10.21;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.078 c
2-1190880438
F@T@L_Err0r
2007-09-27 12:07
2007.10.21
messagedlg


10-1138545805
АлександрМ
2006-01-29 17:43
2007.10.21
Параграфы и таблицы в Word


2-1190638164
Malik
2007-09-24 16:49
2007.10.21
TObject.


2-1190282755
Tifon
2007-09-20 14:05
2007.10.21
Отображение немецких умляутов


4-1176883424
evgenij_
2007-04-18 12:03
2007.10.21
Stay on Top