>
. Структура даних
Для зберігання даних про точках введемо тип даних tmypoint:
1. type
2. tmypoint=record
. x: Integer;
. y: Integer;
. end;
Тип tmypoint являє собою запис, який має 2 поля: x і y, для зберігання відповідних координат точок.
Для зберігання інформації про робочому полі будемо використовувати об'єктний тип tfield. Його код наведено нижче.
=object: array [0..100000] of tmypoint ;: Integer; is_digit (s: string): Boolean; update_list (); add_point_str (_x, _y: string); add_point_int (x, y: integer); distance (p1, p2: tmypoint): Double; is_bar (p1, p2, p3, p4: tmypoint) :; drawbar (p1, p2, p3, p4: tmypoint); gen_bars () ;;
. Генерація точок
Нижче наведено обробник натискання на кнопку Згенерувати .
1. procedure TForm1.genClick (Sender: TObject);
2. var
. i: Integer;
. begin
. Randomize;
6. if not field.is_digit (n_gen.Text)
7. then
. begin
. ShowMessage ( Непідходящі координати );
. Exit;
. end;
12. for i:=1 to StrToInt (n_gen.Text) do
. field.add_point_int (Random (img1.Width), Random (img1.Height));
14. field.update_list;
. end;
У рядку 5 відбувається ініціалізація генератора випадкових чисел процедурою Randomize. Якщо користувач ввів некоректне числове значення, то програма повідомляє про помилку і виходить з процедри (рядки 6-11). У випадку, якщо користувач ввів коректне числове значення N, програма генерує 2 * N випадкових числа, з умовою, що вони можуть бути коректними координатами точок. Згенеровані координати додаються в список методом add_point_int об'єкта tfield (рядки 12-13), після чого відбувається оновлення списку методом update_list.
Лістинг методу add_point_int наведено нижче.
1. procedure tfield.add_point_int (x, y: integer);
2. begin
3. if (x gt; form1.img1.Width) or (y gt; Form1.img1.Height) or (x lt; 0) or (y lt; 0)
4. then
. begin
. ShowMessage ( Непідходящі координати );
. Exit;
. end;
. points [cnt] .x:=x;
. points [cnt] .y:=y;
. Inc (cnt);
. end;
Ця процедура додає в список точок точку з координатами (x, y), після чого збільшує на 1 лічильник точок.
Лістинг процедури update_list наведено нижче.
1. procedure tfield.update_list ();
2. var i: integer;
. canvas: tcanvas;
. begin
. Form1.lst1.Clear;
. canvas:=Form1.img1.Canvas;
. canvas.Brush.Color:=clWhite;
8. canvas.Rectangle (0, 0, Form1.img1.Width, Form1.img1.Height);
9. canvas.Brush.Color:=clBlack;
. for i:=0 to cnt - 1 do
. begin
12. Form1.lst1.Items.add (IntToStr (points [i] .x) + laquo ;, + IntToStr (points [i] .y));
. canvas.Ellipse (points [i] .x - 2, Form1.img1.Height - points [i] .y - 2, points [i] .x + 2, Form1.img1.Height - points [i] .y + 2);
14. end;
. end;
У рядку 5 очищається список точок.
У рядку 6 посилання на canvas поля для виведення результату зберігається в локальну змінну для швидкого доступу надалі.
У рядках 6-7 фон поля для виведення результату змінюється на білий.
У рядках 8-12 малюються та додано до списку точок самі точки.
. Ручне додавання точок
Оброблювач натискання на кнопку Додати наведено нижче.
1. procedure TForm1.addClick (Sender: TObject);
2. var
. x, y: Integer;
. begin