Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.05 c
2-1190381870
mike_zav
2007-09-21 17:37
2007.10.21
FreeAndNil


2-1191129666
SveTTT
2007-09-30 09:21
2007.10.21
Курсор по SetFocus


2-1191228928
F@T@L_Err0r
2007-10-01 12:55
2007.10.21
Завершение работы windows


1-1186143811
race1
2007-08-03 16:23
2007.10.21
"Освобождение структуры"


1-1186403635
pirks
2007-08-06 16:33
2007.10.21
WMI ConnectServer





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский