![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Привязка клавиатуры к кнопкам, у которых используется Tag [D7, XP]
SveTTT © (2007-09-30 15:15:00)Подскажите, пожалуйста!
Как для данной функции
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;
, но толком ничего не вышло. Подскажите как привязать клавиатурные кнопки (дублирование нажатия).
Leonid Troyanovsky (2007-10-01 10:22:00) [1]
> SveTTT (30.09.07 23:32) [11]
> вроде работает, но при выполнении ариф.действий ничего не
> происходит, т.к. результаты ввода с клавиатуры не запоминаются.
Например, сделай Edit1 Readonly, а в его OnKeyPress:
;
case Key of
'0': Button0.Click;
'1': Button1.Click;
..
end
--
Regards, LVT.
SveTTT (2007-09-30 23:32:00) [2]Плохо мне, не понимаю. от
> Leonid Troyanovsky
вроде работает, но при выполнении ариф.действий ничего не происходит, т.к. результаты ввода с клавиатуры не запоминаются.
Пока решение такое -Key := Chr(0);. Пойду спать.
SveTTT (2007-09-30 23:24:00) [3]to
> Leonid Troyanovsky © (30.09.07 23:17) [9]
а какие параметры вraise Exception.Create(..);
Leonid Troyanovsky (2007-09-30 23:17:00) [4]
> SveTTT (30.09.07 22:30) [5]
> Почему ругается на ch := StrToInt(key);
В OnKeyPress key: Char, sorry.
Т.е., ch = key.
--
Regards, LVT.
vpbar (2007-09-30 23:10:00) [5]>>Но тогда как быть?
Учитесь, студент.
Я в свое время,когда писал на лабе калькулятор, от лени (не охото писать кучу оброботок разных операций) помозговал и написал парсер и интерпритатор (правда тогда я не знал что это так называется), который парсил и вычислял выражения типа 1+2*sin(x^2).
В окошке калькултора было поле ввода и кнопка равно. И ничего, зачет был.
SveTTT (2007-09-30 22:57:00) [6]
> Ну нельзя делать с символами тоже что и с числами. Не получится
> умножить А на С.
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 22:32:00) [7]SveTTT (30.09.07 22:30) [5]
Гы потомусто Incompatible types: 'Char' and 'Integer'
Или по русски тип символ и число не совместимы.
Ну нельзя делать с символами тоже что и с числами. Не получится умножить А на С.
vpbar (2007-09-30 22:30:00) [8]если фокус на поле то так
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:00) [9]Почему ругается на
ch := StrToInt(key);
[Error] S_CALC_.PAS(202): Incompatible types: 'Char' and 'Integer'
Leonid Troyanovsky (2007-09-30 22:15:00) [10]
> 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.
SveTTT (2007-09-30 21:54:00) [11]Буду учиться задавать вопрос.
Итак:
1. Первый (приведенный код) реализует функцию нажатия 10 кнопок TButton расположенных вместе с полем TEdit и передающих в него значения - равные своим Tag. Tag соответствует значению кнопки - от 0 до 9. (Типа калькулятора).
2. Помогите,пожалуйста, реализовать ввод этих значений, но с клавиатуры.
Правильно ли сформулирован основной вопрос-просьба.
С уважением.
vpbar (2007-09-30 18:12:00) [12]Вы неправильно задачу ставите. Вам нужно не это. (это у меня телепатор работает).
А во поводу сабжа - нифига не понял. Как привязать клавиатурные кнопки (веревочкой)
Дублировать нажатия (это чтобы нажал один раз "О" а в проле ввода "ОО" появилось?)