Студопедия

КАТЕГОРИИ:

АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника


Программная реализация. implementation {$R *.dfm} const NR = 4; // кол-во строк в таблице var n: array[1..NR] of real; // значения категорий p: array[1..NR] of real; // процент




implementation
{$R *.dfm}
const
NR = 4; // кол-во строк в таблице
var
n: array[1..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:=1 to NR do
// здесь возможно исключение (ошибка) преобразования,
// если пользователь не ввел данные
begin
try
n[i] := StrToFloat(Form1.StringGrid1.Cells[1,i]);

except
on EConvertError do
begin
ShowMessage('Надо ввести данные во все' + #13 +
'ячейки второй колонки.');
exit;
end;
end;
end;
// вычислим сумму категорий (эл-тов второго столбца)
sum := 0;
for i:=1 to NR do
sum := sum + n[i];
// вычислим процент каждой категории
for i:=1 to NR do
p[i] := n[i] / sum;
// определим категорию с максимальным значением
m := 1;
for i := 2 to NR do
if n[i] > n[m] then m:=i;
// пусть максимальному значению соответствует
// столбик высотой в Image1.Height-20 пикселов
// вычислим высоту остальных столбиков
for i :=1 to NR do
h[i] := Round((Form1.Image1.Height — 20) *
n[i]/n[m]);
// все готово
// можно строить диаграмму
obr := TRUE;
end;
// диаграмма
procedure diagr;
const
WR = 25; // ширина столбика
DR = 10; // расстояние между столбиками
var
x,y: integer; // левый нижний угол столбика
i: integer;

begin
with Form1.Image1 do
begin
x:=10;
y:=Height;
Canvas.Brush.Color := clWindow;
Canvas.Rectangle(0,0,Width,Height);
// *** рисуем столбики ***
for i:=1 to 4 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;
// *** легенда ***
// здесь x — координата левой границы
// последнего столбика
x := x + 20;
y:=20; // 20 пикселов от верхнего края Image1
for i:=1 to 4 do
begin
Canvas.Brush.Color := BarColor[i]; // цвет
// прямоугольника легенды
Canvas.Rectangle(x,y,x+25,y+14); // прямоугольник
// легенды
Canvas.Brush.Color := clWindow;
Canvas.TextOut(x+WR+10,y,
Form1.StringGrid1.Cells[0,i]);
y := y + 20;
end;
end; // with Form1.Image1
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
// определим заголовки колонок
StringGrid1.Cells[0,0] := 'Категория';
StringGrid1.Cells[1,0] := 'Кол-во';
StringGrid1.Width :=
StringGrid1.ColWidths[0] +
StringGrid1.ColWidths[1]+5;
end;
// нажатие клавиши в ячейке таблицы (компонента StringGrid)
// в результате нажатия клавиши <Enter> курсор переходит
// в следующую ячейку
procedure TForm1.StringGrid1KeyPress(Sender: TObject;
var Key: Char);
begin
// Col, Row — номер колонки и строки,
// в которой находится курсор (нумерация с нуля).
// ColCount и RowCount — кол-во колонок и строк
if Key = #13 then
begin
// нажата клавиша <Enter>
if StringGrid1.Col < StringGrid1.ColCount — 1
then
// ячейка не в последнем столбце
StringGrid1.Col := StringGrid1.Col + 1 // к след.
// столбцу
else
// ячейка в последнем столбце
if ( StringGrid1.Row < StringGrid1.RowCount — 1) then
begin
// в первый столбец следующей строки
StringGrid1.Col :=0;
StringGrid1.Row := StringGrid1.Row +1;
end
else Button1.SetFocus;
exit;
end;
// во вторую колонку разрешается вводить
// только числа

if StringGrid1.Col = 1 then
// клавиша нажата в ячейке
// второй колонки
case Key of
'0'..'9',#8:;
'.', ',':
begin
Key := FormatSettings.DecimalSeparator;
if Pos(FormatSettings.DecimalSeparator,
StringGrid1.Cells[StringGrid1.Row,
StringGrid1.Col]) <> 0
then Key := Char(0);
end;
else Key := Char(0);
end;
end;
// щелчок на кнопке Гистограмма
procedure TForm1.Button1Click(Sender: TObject);
begin
if Obr // исходные данные введены
then diagr; // строим диаграмму
end;

end.

 


Поделиться:

Дата добавления: 2015-09-15; просмотров: 105; Мы поможем в написании вашей работы!; Нарушение авторских прав





lektsii.com - Лекции.Ком - 2014-2024 год. (0.007 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав
Главная страница Случайная страница Контакты