Procedure TMainForm.DrawGrid1KeyPress
(Sender: TObject; var Key: Char);
begin
with DrawGrid1 do
if Row > 0 then begin
if (Col = 2) and (not (key in
['0'..'9','.',#8])) then key:=#0;
if ((Col = 3) or (Col = 4)) and (not
(key in ['0'..'9',#8])) then key:=#0;
end;
end;
procedure TMainForm.CheckBox1Exit(Sender: TObject);
begin
if CheckBox1.Checked then Edit1.SetFocus
else DrawGrid1.SetFocus;
end;
Procedure TMainForm.Edit1KeyPress
(Sender: TObject; var Key: Char);
begin
if not (key in ['0'..'9','.',#8]) then key:=#0;
end;
procedure TMainForm.Edit1Exit(Sender: TObject);
begin
if Length(Edit1.Text)=0 then Edit1.Text:='0.0';
if (StrToFloat(Edit1.Text)=0.0) or
(StrToFloat(Edit1.Text)>150.0) then
if Application.MessageBox('Введите % премии',
'Число <= 150',MB_OK)=IDOK then Edit1.SetFocus;
end;
procedure TMainForm.Button1Click(Sender: TObject);
type rec=record
tbn: word;
fio: string[20];
okl: Currency;
ch,dn,dng: word;
zp,pr,it: Currency;
end;
var z:array [1..2] of rec;
i:byte;
begin
for i:=1 to 2 do begin
with z[i] do begin
tbn:=StrToInt(Field[i,0]);
fio:=Field[i,1];
okl:=StrToFloat(Field[i,2]);
ch:= StrToInt(Field[i,3]);
dn:= StrToInt(Field[i,4]);
dng:=StrToInt(Field[i,5]);
if i = 1 then
if dng <> 0 then zp:=okl*dn/dng else zp:=0
else if ch>dng*8 then zp:=okl*dng*8
else zp:=okl*ch;
Field[i,6]:=FormatFloat('0.00',zp);
if CheckBox1.Checked then
pr:=StrToFloat(Edit1.Text)*zp/100
else pr:=0.0;
Field[i,7]:=FormatFloat('0.00',pr);
it:=zp+pr;
Field[i,8]:=FormatFloat('0.00',it);
with DrawGrid1 do DrawGrid1DrawCell(Sender,0,i,
CellRect(0,i),[gdSelected,gdFocused]);
end;
end;
BitBtn1.SetFocus;
end;
End.
Обработчик событий OnSetEditText содержит три оператора. Первый оператор не позволяет изменить количество часов для табельного номера 1 (оно связано с количеством отработанных дней) или количество дней для второго сотрудника (оно связано с количеством отработанных часов). Второй оператор изменяет количество часов, если количество дней изменено пользователем. Третий оператор служит тем же целям, что и второй, - изменяет количество дней для табельного номера 2.
Обработчик OnSelectCell запрещает при вводе выбор ячеек, находящихся в столбцах 0, 5, 6, 7, 8.
СОВМЕСТИМОСТЬ И ПРЕОБРАЗОВАНИЕ ТИПОВ ДАННЫХ
Когда в тех или иных операциях или операторах присутствуют данные различных типов, то возникают вопросы о соответствии типов друг другу. Стандартно выделяют три группы вопросов:
1. идентичность типов;
2. совместимость типов;
3. совместимость по присваиванию.
ИДЕНТИЧНОСТЬ ТИПОВ
Если при объявлении использовать один и тот же идентификатор или несколько переменных объявляются с помощью одного описания, то такие типы идентичны.
Type Int = Integer;
Var n : Int; k : Integer;
v1, v2 : Array[1..10] of Real;
В данном случае v1 и v2 – идентичны, n и k – идентичны, но если объявлено: Var v1 : Array[1..10] of Real;
v2 : Array[1..10] of Real;
то v1 и v2 не идентичны. Чтобы их сделать идентичными, можно, например, объявить так: type Vect = Array[1..10] of Real; var v1, v2 : Vect;
СОВМЕСТИМОСТЬ ТИПОВ
При программировании необходимо помнить, что на операции с программными элементами компилятор налагает ограничения, разрешая выполнение только заложенных для указанного типа действий. Кроме того, совместимость типов требуется в выражениях, в том числе и в операциях отношения, а также при передаче аргументов функциям или процедурам. Рассмотрим некоторые наиболее распространённые варианты, когда типы считаются совместимыми:
· типы идентичны;
· один тип представляет тип-диапазон другого;
· для объявления используется один и тот же базовый тип;
· оба типа – целые типы;
· оба типа – вещественные типы;
· один тип - строка типа PChar, другой – массив символов с индексацией элементов, начинающейся от нуля.
СОВМЕСТИМОСТЬ ПО ПРИСВАИВАНИЮ
Чтобы присваивание было корректным, необходимо выполнение следующих условий:
· идентичность типов;
· совместимость типов, причём значение типа слева от знака присваивания должно находиться в границах возможных значений типа справа от знака присваивания;
· слева от знака присваивания вещественный тип, а справа – целый тип;
· слева строка, кроме типа PChar, справа – любая строка;
· слева строка, кроме типа PChar, справа – символ.
ПРЕОБРАЗОВАНИЕ ТИПОВ
В ряде случаев требуется преобразование одного типа в другой. Для этого используются или те же идентификаторы, с помощью которых типы объявлялись,или специальные функции или процедуры. Например, если объявлено:
Type ByteRec = record
Lo, Hi:byte;
End;
WordRec = record
Lo, Hi:word;
End;