КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Программная реализация. 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.
|