Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
mause_canvas.doc
Скачиваний:
1
Добавлен:
05.09.2019
Размер:
20.13 Mб
Скачать

« Автоматизація проектування графічного плану виробничого приміщення »

Частина 2.

В цій частині запропоновані методи автоматизованої розмітки виробничого приміщення: візуалізація координатної сітки у вигляді масиву вертикальних і горизонтальних ліній і мережі опорних колон.

1.З допомогою інспектора об’єктів створюють процедуру – оброблювач події FormPaint. Спочатку налаштовують вертикальні лінії. Для цього використовуються процедури moveto(x,0) і lineto(x,width). Якщо величині х задати конкретне значення, наприклад - 50, то це означатиме одну вертикальну лінію, через усе вікно прикладної програми, яка розміщена на 50 пікселів вправо від лівого краю вікна.

procedure TForm2.FormPaint(Sender: TObject);

var x: integer;

begin

x:=50;

with canvas do

begin

moveto(x,0);

lineto(x,height);

end;

end;

2. Запускають команду RUN і отримують запрограмовану вертикальну лінію (рисунок 13) .

3. Здійснюють спробу «витерти» лінію з допомогою кнопки <ґумка> (рисунок 14), рухаючи нею по вікні застосунку. Переконуються про неможливість цього прийому, оскільки програмно відображена вертикаль прописана в тілі процедури FormPaint (вона є оброблювачем події OnPaint ), яка автоматично відбувається за будь - яких візуальних змін на формі, а значить і під-час переміщення підлеглого формі об’єкту – Button2.

4.З допомогою мишки виконують розтягування вікна прикладної програми з відображеною на ній вертикальною лінією (рисунок15) і переконуються у тому, що вказана пряма продовжує існувати в межах від верху до низу форми оскільки це забезпечено параметром Y=0 процедури moveto(x,0) і параметром

Рисунок 13 - на вікні застосунку відображається вертикальна лінія відразу з появою вікна програми .

Y= height (Y отримав значення висоти форми) процедури lineto(x,height).

5. Доповнюють програмний код оброблювача події FormPaint, так щоб кількість вертикальних ліній задавалося у тілі програми, як змінна величина. У нижче приведеному коді ця величина позначена ідентифікатоором n, якому для прикладу, відразу надано значення 10.

Рисунок 14 - вертикальна лінія не стирається з допомогою «гумки»

Рисунок 15 - розтяжка вікна застосунку вліво і вниз.

6. До коду обробника події FormPaint додають оператор циклу, який забезпечуватиме багаторазовий виклик методів moveto(x,0) і lineto(x,height). У тілі підпрограми ця частина підкреслена.

procedure TForm2.FormPaint(Sender: TObject);

var

i,d,x,n:integer;

begin

n:=10;

x:=trunc(width/n);

d:=х;

for i := 1 to n do

begin

with canvas do

begin

moveto(x,0);

lineto(x,width);

x:=x+d;

end;

end;

end;

7. Здійснюють команду RUN і спостерігають за появою 9 вертикальних прямих ліній на вікні застосунку (рисунок 16). Їх є 9, а не 10. Це є наслідком застосування функції trunc(width/n), яка відкидає дробову частину від результату виконання оператора ділення width/n. Рівномірність відстаней між лініями забезпечна за рахунок постійного кроку d. Йому ж надане значення x:=trunc(width/n) – відступу першої вертикалі від лівого краю форми.

8. Задля перевірки того, як поводитимуть себе графічні об’єкти під час змін розмірів вікна прикладної програми, його розтягають за допомогою мишки і переконуються в тому, що дійсно відбулося викривлення (рисунок 17) вертикальних ліній – повне чи часткове, або ж лінії розміщені не повсюдно по площині вікна.

Рисунок 16 - у вікні застосунку автоматично відображаються девять вертикальних ліній.

9. Клацають по копці <витерти все> і переконуються в тому, що оновлення вертикальних ліній у збільшеному вікні застосунку відбулося (рисунок 18). Це сталося тому, що процедура form2.Repaint фактично викликає подію OnPaint, Тим самим відбувається перемальовування самої форми і того, що на ній відображено згідно з програмним кодом записаним у оброблювачі цієї події- процедурі FormPaint. Причому відображення відбувається або згідно зі статично - запрограмованими значеннями властивостей вказаних у інспекторі об’єктів, або ж якщо б ці значення надавалися б динамічно в коді процедури FormPaint. Зауважують, що статично-запрограмовані значення властивостей Button1.Left, Button2.Left, Button2.Top, Button1.Width і т.д. на рисунках 17 і 18 залишаються тими ж.

Рисунок 17 - викривлення вертикальних ліній у вікні застосунку після його розтягування з допомогою мишки.

Рисунок 18 - ліквідація викривлень вертикальних ліній у вікні застосунку після клацання на кнопку <витерти все>

10. Доповнюють програмний код обробника події FormPaint фрагментами, що стосуються відображення горизонтальних ліній - вони підкреслені у нижче наведеному програмному тексті.

procedure TForm2.FormPaint(Sender: TObject);

var i,d,x, y , n:integer;

begin

n:=10;

x:=trunc(width/n);

y:=x;

d:=x;

for i:= 1 to n do

begin

with canvas do

begin

moveto(x,0);

lineto(x,height);

moveto(0,y);

lineto(width,y);

y:=y+d;

x:=x+d;

end; end; end;

11. Запускають прикладну програму і спостерігають за створенням сітки з горизонтальних та вертикальних ліній (рисунок 19).

Рисунок 19 - відображення вертикальних і горизонтальних ліній у вікні застосунку

12. Встановлюють на форму нову кнопку Button3 і надають її властивості сaption значення <сітка колон>. Подвійним клацанням запрограмовують подію Button3Click, в якій поки що йдеться про відображення тільки однієї колони квадратного перерізу 40х40 пікселів, червоного забарвлення і з координатами своєї верхньої лівої точки – 30,30.

procedure TForm2.Button3Click(Sender: TObject);

var r:TRect; l, t, a: integer;

begin

a:=40;

l:=30;

t:=30;

r.Left:=l;

r.Top:=t;

r.Right:= l+a;

r.Bottom:= t+a;

canvas.Brush.Color:=clred;

canvas.Rectangle(r);

end;

13. Запускають команду RUN і клацають по цій кнопці. В результаті отримують відображення червоної колони (рисунок 20) на вікні прикладної програми.

Рисунок 20 - відображення однієї колони квадратного перерізу.

14. Доповнюють вище наведений програмний код фрагментами, які зумовлюватимуть появу горизонтального ряду колон. Для цього вводять поняття кроку k між колонами і відразу надають значення цій величині – 100 пікселів. Дооголошують змінну g: array [1..5] of integer, яка уможливлюватиме побудову однорядного масиву із п’яти колон. Завдяки циклу, тіло якого обведене у рамку, отримують зазначений масив – горизонтальний ряд із п’яти квадратних фігур. Свіжо написані кодові рядки спеціально для наочності є у підпрограмі підкреслені.

procedure TForm2.Button3Click(Sender: TObject);

var r:TRect; l,t,a, k: integer; g: array [1..5] of integer;

I: Integer;

begin

k:=100;

a:=40;

l:=30;

t:=30;

for i:= 1 to 5 do begin

r.Left:=l;

r.Top:=t;

r.Right:=l+a;

r.Bottom:=t+a;

canvas.Brush.Color:=clred;

canvas.Rectangle(r);

g[i]:=l+k;

l:=g[i];

end;

end;

15. Запускають команду RUN і клацають по кнопці <сітка колон>. В результаті отримують відображення горизонтального ряду із п’яти червоних квадратів (рисунок 21), які перекривають координатну сітку, оскілька та будується під-час виконання події OnPaint, тобто до події пов’язаної з клацанням по кнопці Button3. Процедурою Button3Click повторно викликають подію OnPaint, тому що в тілі підпрограми є звернення до властивості canvas, а значить відбувається перемальовування і координатної сітки, і сітки колон. В той же час кнопки є об’єктами, а об’єкти завжди візуалізуються чи рухаючись перевізуалізовуються у викликаній події OnPaint, але це відбувається після попередньої візуалізації об’єкта класу TForm .

Рисунок 21 - відображення горизонтального ряду колон квадратного перерізу.

16. Доопрацьовують код процедури Button3Click з метою створення – сітки 5х3 колон. Для цього створюють ще один масив v: array [1..3] of integer і опрацьовують цикл у циклі. Новодолучені фрагменти підпрограми – підкреслені.

procedure TForm2.Button3Click(Sender: TObject);

var r:TRect; l,ri,t,b,a,k: integer; g: array [1..5] of integer;

v: array [1..3] of integer;

I,j: Integer;

begin

k:=100;

a:=40;

l:=30;

t:=30;

for j:= 1 to 3 do begin

for I:= 1 to 5 do begin

r.Left:=l;

r.Top:=t;

r.Right:=l+a;

r.Bottom:=t+a;

canvas.Brush.Color:=clred;

canvas.Rectangle(r);

end;

g[i]:=l+k;

l:=g[i];

v[j]:=t+k;

t:=v[j];

end;

end;

17. Запускають прикладну програму і зауважують дещо не те, що планувалося (рисунок 21) після клацання по кнопці Button3.

Рисунок 21 - три зміщені по горизонталі ряди колон квадратного перерізу.

Зміщення рядів відбулося за рахунок послідовності операторів g[i]:=l+k; l:=g[i] , які вказують на те, що при переході від j=1 до j=2 у циклі for j:= 1 to 3 do величина змінної l вже набула значення l+5k=530 пікселів. Тобто перший квадрат другого ряду має координату х не 30, а 530.

18. Вставляють оператор l:=30; між оператором for j:= 1 to 3 do begin

і оператором for I:= 1 to 5 do begin.

19. Запускають команду RUN. Клацають по кнопці і отримують заплановане розміщення колон квадратного профілю (рисунок 22).

20. Перевіряють можливості «ґумки» (рисунок 23). Як підказує досвід попередніх етапів побудови, «стираються» колони, але залишається незмінною координатна сітка. Це звичайний візуальний обман, оскільки як щодо координатної сітки у місцях дотику з <ґумкою>, так і щодо власне <ґумки>, яка рухається відбувається їх перемальовування, а значить виклик події OnPaint. Сітка ж колон перемальовується тільки при зверненні до події повязаної із клацанням по кнопці Button3.

Рисунок 22 - сітка колон квадратного перерізу.

Рисунок 23 - процес «стирання» сітки колон.

З Зразок створення застосунку

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]