
- •Часть 1
- •Implementation
- •Implementation
- •Implementation
- •Часть 1
- •Implementation
- •Implementation
- •Implementation
- •IBplementation
- •Implementation
- •Часть 1
- •Implementation
- •Implementation
- •Implementation
- •Implementation
- •Implementation
- •Interface
- •Часть 1
- •Interface
- •Часть 1 I. 104
- •Implementation
- •Implementation
- •Implementation
- •Часть I
- •Р ис. 1.46. Окно программы Звуки Windows
- •Implementation
- •Interface
- •Implementation
- •Interface
- •Implementation
- •Interface
- •Implementation
- •Interface
- •Implementation
- •Implementation
- •Implementation
- •Implementation
- •Implementation
- •Interface
- •Часть 1
- •168 Част
- •Implementation
- •Часть 1
- •Interface uses
- •Implementation
- •Interface
- •Implementation
- •Часть 1
- •Часть 1 I Примеры и задачи
- •Часть 1 I Примеры и задачи
- •Implementation
- •205 Часть
- •Interface
- •Implementation
- •216 Часть 1
- •Поле т ип Размер Информация
- •Часть 1
- •Implementation
- •Interface
- •Implementation
- •Implementation
- •Часть 2 Таблица 2.2 (окончание)
- •252 Часть 2
- •Часть 2 I Delphi — краткий справочник
- •Часть 2
Implementation
($R *.dfm}
const
NR = 4; // кол-во строк в таблице var
n: array[l..NR] of real; // значения категорий
p: array[1..NR] of real; // процент категории в общей су
h: array[1..NR] of integer; // высота столбиков диаграммы
// цвет, столбиков диаграммы
BarColor: array[1..4] of TColor = (clRed,clGreen,clBlue,clYellow);
// ввод и обработка
// если исходные данные введены, то Obr = TRUE
function Obr : boolean;
var
sum: real; // сумма категорий
m: integer; // номер категории, имеющей максимальное значение
i: integer; begin
obr := FALSE; // пусть исх. данные не введены
// скопируем содержимое второго столбца // в массив исходных данных
for i:=l to NR do
// здесь возможно исключение (ошибка) преобразования,
// если пользователь не ввел данные begin try
n[i] := StrToFloat(Forml.StringGridl.Cells[l,i]); except
on EConvertError do begin
ShowMessage('Надо ввести данные во все1 + #13 + 1 ячейки второй колонки.');
exit;
end; end;end.
// вычислим сумму категорий (зл-тов второго столбца) sum := 0;
for i:=l to NR do
sum : = sum + n [ i ] ;
// вычислим процент каждой категории for i:=l to NR do
p[i] := n[i] / sum;
// определим категорию с максимальным значением
m := 1;
for i := 2 to NR do
if n[i] > n[m] then m:=i;
// пусть максимальному значению соответствует
// столбик высотой в Imagel.Height-20 пикселов //вычислим высоту остальных столбиков
for i :=i to NR do
h[i] := Round((Forml.Imagel.Height - 20) *
n[i]/n[m]);
// все готово
// можно строить диаграмму obr := TRUE;
end;
72
73
// диаграмма procedure diagr; const
WR = 25; // ширина столбика DR = 10;
// расстояние между столбиками
var
х,у: integer; // левый нижний угол столбика
i: integer; begin
with Forml. Imagel do begin x:=10; y:=Height;
Canvas.Brush.Color := clWindow; Canvas.Rectangle(0, 0,Width,Height);
// *** рисуем столбики ***
for i: =1 to A do
begin
// цвет столбика
// столбик
// чтобы область
// за текстом
// не была окрашена
Canvas.Brush.Color := BarColor[i]; Canvas.Rectangle(x, y,x+WR, y-h[i]) ; Canvas.Brush.Color := clWindow;
// подпись данных (над столбиком) Canvas.TextOut(x,y-h[i]-15,
FloatToStrF (p[i] *100, ffGeneral, 3,2) + '%.');
x := x' + WR + DR;
end;
// *** легенда ***
// здесь х — координата левой границы
// последнего столбика
х := х + 20;
у:=20; // 20 пикселов от верхнего края Imagel
for i:=l to A do
begin
Canvas.Brush.Color := BarColor[i]; // цвет прямоугольника*
// легенды
Canvas.Rectangle(x,у,х+25,у+14); // прямоугольник легеь Canvas.Brush.Color := clWindow;
Canvas.TextOut(x+WR+10,y,
Forml.StringGridl.Cells[0,i]);
у := у + 20;
end;
end; // with Forml. Imagel
end;
procedure TForml.FormCreate(Sender: TObject);
begin
// определим заголовки колонок StringGridl.Cells[0,0] := 'Категория'; StringGridl.Cells[1,0] := 'Кол-во'; StringGridl.Width :=
StringGridl.ColWidths[0] + StringGridl.ColWidths[I]+5;
end;
// нажатие клавиши в ячейке таблицы (компонента StringGrid) //в результате нажатия клавиши <Enter> курсор переходит в //следующую ячейку
procedure TForml.StringGridlKeyPress(Sender: TObject;
var Key: Char);
begin
// Col, Row — номер колонки и строки,
// в которой находится курсор (нумерация с нуля) .
// ColCount и RowCount — кол-во колонок и строк
if Key = #13 then begin
// нажата клавиша <Enter>
if StringGridl.Col < StringGridl.ColCount - 1 then
// ячейка не в последнем столбце
StringGridl.Col := StringGridl.Col + 1 // к след. столбцу else
// ячейка в последнем столбце
if ( StringGridl.Row < StringGridl.RowCount - 1) then
begin
// в первый столбец следующей строки StringGridl.Col :=0;
StringGridl.Row := StringGridl.Row +1; end
else Button!.SetFocus; exit;
end;
74