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;

Наши рекомендации