Форум: "Начинающим";
Текущий архив: 2007.10.21;
Скачать: [xml.tar.bz2];
ВнизПривязка клавиатуры к кнопкам, у которых используется 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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.043 c