li6051
Гость
|
|
« : 08-10-2008 15:33 » |
|
Нужно сделать следующее: При нажатии на кнопку "ок", спустя ПРОИЗВОЛЬНЫЙ (случайный) момент времени появляется геометрическая фигура, закрашенная цветом. Может я чего не догоняю (впервые программирую на Delphi), не могу понять как задать фигуру. Например читаю:" Прямоугольник вычерчивается методом Rectangle: procedure Rectangle(XI, Yl, Х2, Y2 : Integer) ; " Пишу эту строчку в проге, заменяю x, y на числа - ошибка:[Error] ok1.pas(65): Statement expected but 'PROCEDURE' found [Error] ok1.pas(65): Identifier expected but number found [Fatal Error] Projectok.dpr(5): Could not compile used unit 'ok1.pas' Что это значит и как нарисовать этот прямоугольник?
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #1 : 08-10-2008 15:39 » |
|
li6051, код в студию!
Судя по всему, языка ты совсем не знаешь. PROCEDURE - это объявление процедуры, но для ее вызова это не нужно.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
li6051
Гость
|
|
« Ответ #2 : 08-10-2008 15:43 » |
|
А как ее вызвать?
|
|
|
Записан
|
|
|
|
li6051
Гость
|
|
« Ответ #3 : 08-10-2008 16:20 » |
|
|
|
|
Записан
|
|
|
|
li6051
Гость
|
|
« Ответ #4 : 08-10-2008 16:26 » |
|
А, дошло! unit ok1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, ExtCtrls;
type TForm1 = class(TForm) Panel1: TPanel; bbRun: TBitBtn; lbOutput: TLabel; bb2: TBitBtn; bb1: TBitBtn; procedure bbRunClick(Sender: TObject); procedure bb1Click(Sender: TObject);
private { Private declarations } public { Public declarations } end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.bbRunClick(Sender: TObject); var
pol: array[1..3] of TPoint; // координаты точек треугольника begin MessageBeep(MB_OK); pol[1].x := 100;
pol[1].y := 500;
pol[2].x := 400;
pol[2].y := 100;
pol[3].x := 700;
pol[3].y := 500;
Form1.Canvas.Polygon(pol);
bb1.Show; bb2.Show; bbRun.Hide;
lbOutput.Caption:='Если фигура красная нажмите 1,если зеленая нажмите 2!'
end;
procedure TForm1.bb1Click(Sender: TObject); begin MessageBeep(MB_OK);
end;
end. Вот здесь надо вставить процедуру, которая вычерчивает прямоугольник, например красного цвета: procedure TForm1.bb1Click(Sender: TObject); begin MessageBeep(MB_OK);
end;
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #5 : 08-10-2008 18:28 » |
|
См. строку 58. Там есть синтаксическая ошибка.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #6 : 08-10-2008 22:26 » |
|
li6051, У тебя должна быть процедура onPaint или что то типа этого. В ней и вычерчивай фигуры. Эта процедура будет вызываться автоматически системой, когда для формы нужно обновить изображение. Чтобы принудительно попросить систему обновить изображение, сушествует функция update. Дальше сам думай.
Кстати в написании названий я могу и ошибаться, смотри Help.
|
|
« Последнее редактирование: 08-10-2008 22:29 от Finch »
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
zubr
Гость
|
|
« Ответ #7 : 09-10-2008 04:09 » |
|
li6051, открой Help и набери в поиске TCanvas. TCanvas - это Delphi-класс, позволяющий выполнять действия с контекстом устройства. Вот пример с универсальной процедурой создания любой геометрической фигуры в контексте устройства: procedure GeometrFig(Canvas:TCanvas; Points: Array of TPoint; ColorFig: TColor); begin Canvas.Brush.Color := ColorFig; Canvas.Polygon(Points); end;
procedure TForm1.bbRunClick(Sender: TObject); var Points: Array of TPoint; begin SetLength(Points, 4); Points[0].X := 100; Points[0].Y := 100; Points[1].X := 200; Points[1].Y := 100; Points[2].X := 200; Points[2].Y := 200; Points[3].X := 100; Points[3].Y := 200; GeometrFig(Canvas, Points, clRed); Points := nil; end;
Надеюсь ты понял, что универсальная процедура - это procedure GeometrFig. Как видишь все просто.
|
|
|
Записан
|
|
|
|
li6051
Гость
|
|
« Ответ #8 : 09-10-2008 13:45 » |
|
RXL, Finch, zubr, Спасибо, ребята, за помощь! ) Чувствую себя как блондинка ! У меня еще вопрос: Вот значит нажимаю я кнопку"Ок" - появляеся у меня треугольник, нажимаю кнопку "1" поверх треугольника появляется прямоугольник, а как "очистить Canvas, чтобы при нажатии кнопки "1" треугольник исчезал и появлялся прямоугольник?
|
|
|
Записан
|
|
|
|
li6051
Гость
|
|
« Ответ #9 : 09-10-2008 13:47 » |
|
unit ok1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, ExtCtrls;
type TForm1 = class(TForm) Panel1: TPanel; bbRun: TBitBtn; lbOutput: TLabel; bb2: TBitBtn; bb1: TBitBtn; procedure bbRunClick(Sender: TObject); procedure bb1Click(Sender: TObject);
private { Private declarations } public { Public declarations } end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.bbRunClick(Sender: TObject); var
pol: array[1..3] of TPoint; // êîîðäèíàòû òî÷åê òðåóãîëüíèêà begin MessageBeep(MB_OK); pol[1].x := 100;
pol[1].y := 500;
pol[2].x := 400;
pol[2].y := 100;
pol[3].x := 700;
pol[3].y := 500;
Form1.Canvas.Polygon(pol);
bb1.Show; bb2.Show; bbRun.Hide;
lbOutput.Caption:='Åñëè ôèãóðà êðàñíàÿ íàæìèòå 1,åñëè çåëåíàÿ íàæìèòå 2!'
end;
procedure GeometrFig(Canvas:TCanvas; Points: array of TPoint; ColorFig: TColor); begin Canvas.Brush.Color := ColorFig; Canvas.Polygon(Points); end;
procedure TForm1.bb1Click(Sender: TObject); var Points: array[0..3] of TPoint;
begin
Points[0].X := 100; Points[0].Y := 100; Points[1].X := 200; Points[1].Y := 100; Points[2].X := 200; Points[2].Y := 200; Points[3].X := 100; Points[3].Y := 200; GeometrFig(Canvas, Points, clRed);
end;
end.
zubr, А что значат эти строки: Points := nil; и SetLength(Points, 4);
|
|
|
Записан
|
|
|
|
zubr
Гость
|
|
« Ответ #10 : 09-10-2008 14:49 » |
|
В твоем случае достаточно перед вызовом процедуры GeometrFig вызвать метод Refresh формы. Если бы отрисовку ты делал в событии формы OnPaint, то тогда надо было бы перед отрисовкой сохранять старый цвет кисти канваса и закрашивать отрисованную фигуру старым цветом. SetLength - выделение памяти под динамический массив. Points := nil; - освобождение выделенной памяти Читаем учебник.
|
|
|
Записан
|
|
|
|
li6051
Гость
|
|
« Ответ #11 : 11-10-2008 07:09 » |
|
zubr, Спасибо, за помощь, все получилось! ) Читаем учебник. Как раз этим и занимаюсь
|
|
|
Записан
|
|
|
|
|