1

Тема: Подія OnKeyPress

Всім доброго дня!
Завантажив підручник по Делфі - вчу по-тихеньку.
Ось фрагменти сторінки підручника на якій зупинивсь.

В качестве примера использования компонента stringGrid для ввода массива рассмотрим программу, которая вычисляет среднее арифметическое значение элементов массива. Диалоговое окно программы приведено на рис. 5.3. Компонент stringGrid используется для ввода массива, компоненты Label1 и Label2 — для вывода пояснительного текста и результата расчета, Button1 — для запуска процесса расчета.

Листинг 5.2. Ввод и обработка массива целых чисел


unit getar_;


interface


uses


Windows, Messages, SysUtils, Variants, 

Classes, Graphics, Controls, Forms, Dialogs, Grids, StdCtrls;


type


TForm1 = class(TForm)


Label1: TLabel;


StringGridl: TStringGrid;


Button1: TButton;


Label2: TLabel;


procedure ButtonlClick(Sender: TObject); private


{ Private declarations } 

public


{ Public declarations } 

end;


var


Form1: TForml ;


implementation


{$R *.dfm}


procedure TForml.ButtonlClick(Sender: TObject); var


a : array[1..5] of integer; // массив 

summ: integer; // сумма элементов 


sr: real; // среднее арифметическое 


i: integer; // индекс 


begin


// ввод массива 


// считаем, что если ячейка пустая, то соответствующий 


// ей элемент массива равен нулю 


for i:= 1 to 5 do


if Length(StringGridl.Cells[i-1, 0]) <>0


then a[i] := StrToInt(StringGridl.Cells[i-1,0])

else a[i] := 0;


// обработка массива 


summ := 0;


for i :=1 to 5 do


summ := summ + a[i]; sr := summ / 5;


У вывод результата Label2.Caption :=


'Сумма элементов: ' + IntToStr(summ)

+ #13+ 'Среднее арифметическое: ' + FloatToStr(sr); 

end;

end.

После пробных запусков программы возникает желание внести изменения в процесс ввода массива. Так, было бы неплохо, чтобы курсор автоматически переходил в следующую ячейку таблицы, например, в результате нажатия клавиши <Enter>. Сделать это можно при помощи процедуры обработки события onKeyPress. На эту же процедуру можно возложить задачу фильтрации вводимых в ячейку таблицы данных. В нашем случае надо разрешить ввод в ячейку только цифр.


Текст процедуры обработки события OnKeyPress приведен в листинге 5.3. Следует обратить внимание на свойство Col, которое во время работы программы содержит номер колонки таблицы, в которой находится курсор. Это свойство можно также использовать для перемещения курсора в нужную ячейку таблицы. Однако нужно учитывать, что колонки таблицы, впрочем, как и строки, нумеруются с нуля.

Листинг 5.3. Процедура обработки события OnKeyPress


procedure TForm1.StringGridlKeyPress(Sender: TObject;

var Key: Char); 

begin


case Key of


#8,'0'..'9' : ; // цифры и клавиша <Backspace> 

#13: // клавиша <Enter> 


if StringGridl.Col < StringGridl.ColCount — 1


then StringGridl.Col := StringGridl.Col + 1; 

else key := Chr(0); // остальные символы запрещены 

end; 

end;

А от тут і проблема. Тут:

case Key of


#8,'0'..'9' : ; // цифры и клавиша <Backspace> 

#13: // клавиша <Enter>

повино ж бути щось після ":"?
І що програма робе тут:

if StringGridl.Col < StringGridl.ColCount — 1


then StringGridl.Col := StringGridl.Col + 1; 

else key := Chr(0); // остальные символы запрещены 

end; 

?
Допоможіть, будь ласка.

2 Востаннє редагувалося Chemist-i (13.08.2013 22:23:53)

Re: Подія OnKeyPress

A.N.Onim написав:

А от тут і проблема. Тут:
[code=pas]
case Key of
#8,'0'..'9' : ; // цифры и клавиша <Backspace>
#13: // клавиша <Enter>
[/code]
повино ж бути щось після ":"?

Ні, не обов_язково, ця конструкція вказує на те, що треба виконувати те що стоїть між ":" та ";", якщо нічого нема - нічого не робимо.

A.N.Onim написав:

І що програма робе тут:
[code=pas]
if StringGridl.Col < StringGridl.ColCount - 1 then
  StringGridl.Col := StringGridl.Col + 1;
else
  key := Chr(0); // остальные символы запрещены
end;[/code]
?

Якщо номер виділеної колонки (Col) мененше ніж їх загальна кількість (ColCount-1) то виділити наступну колонку (Col + 1), інакше - онулити keycode

Подякували: A.N.Onim1

3

Re: Подія OnKeyPress

крапка з комою, якщо не розділює команди, розглядається як пустий оператор - тобто відсутність дії

Подякували: A.N.Onim1

4

Re: Подія OnKeyPress

Дякую. Зрозумів.
Відредагувавши ще декілька помилок у коді (підручник містить багацько помилок), проект таки відкомпілювавсь. Але...
При натисненні Enter переходе в другу колонку. А от введення других символів - наприклад букв - дозволяє.
Що не так?

5 Востаннє редагувалося koala (14.08.2013 19:32:48)

Re: Подія OnKeyPress

A.N.Onim написав:

Дякую. Зрозумів.
Відредагувавши ще декілька помилок у коді (підручник містить багацько помилок), проект таки відкомпілювавсь. Але...
При натисненні Enter переходе в другу колонку. А от введення других символів - наприклад букв - дозволяє.
Що не так?

Знаєте, я написав вам відповідь. У ній все працює. Вас вона влаштовує?

6

Re: Подія OnKeyPress

Вибачте, але не розумію. Программа - код якої я друкував вище компіляцію пройшла, але дозволяє ввід всіх символів, а не повинна цього робити.

7 Востаннє редагувалося koala (14.08.2013 20:19:32)

Re: Подія OnKeyPress

A.N.Onim написав:

Відредагувавши ще декілька помилок у коді, проект таки відкомпілювавсь.

A.N.Onim написав:

Программа - код якої я друкував вище компіляцію пройшла

Ви вже визначайтеся - та програма, код якої ви друкували, пройшла компіляцію - чи та, яку ви невідомо як відредагували...
Мої телепатичні здібності підказують мені, що ви прибрали крапку з комою там, де її варто було б лишити. Але я на них не дуже покладаюся, тому уточнювати нічого не буду.

Подякували: A.N.Onim1

8

Re: Подія OnKeyPress

Та що була вище - компіляцію не пройшла. Відредагована ось:

procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);



begin
 case Key of


#8,'0'..'9' : ;

#13:


if StringGrid1.Col < StringGrid1.ColCount - 1


then StringGrid1.Col := StringGrid1.Col + 1

else Key := Chr(0); // îñòàëüíûå ñèìâîëû çàïðåùåíû 

end; 


end;

9 Востаннє редагувалося A.N.Onim (14.08.2013 20:51:33)

Re: Подія OnKeyPress

Знайшов помилку сам. Дякую.
Вибачте.

Подякували: Chemist-i1

10

Re: Подія OnKeyPress

A.N.Onim написав:

Знайшов помилку сам. Дякую.
Вибачте.

Ось тут?

+ 1;

А якби робили відступи - одразу б все було видно.

11

Re: Подія OnKeyPress

koala написав:
A.N.Onim написав:

Знайшов помилку сам. Дякую.
Вибачте.

Ось тут?

+ 1;

А якби робили відступи - одразу б все було видно.

Так, саме там.

12

Re: Подія OnKeyPress

Якщо хтось не зрозумів: else тут є частиною оператора case бо рядок із then закінчується крапкою з комою.

Подякували: koala1

13

Re: Подія OnKeyPress

Капітаните?

14

Re: Подія OnKeyPress

Chemist-i цього не помітив, а чіткого пояснення нижче не було.