Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Геометрическая фигура  (Прочитано 13853 раз)
0 Пользователей и 1 Гость смотрят эту тему.
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
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 08-10-2008 15:39 » 

li6051, код в студию!

Судя по всему, языка ты совсем не знаешь. PROCEDURE - это объявление процедуры, но для ее вызова это не нужно.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
li6051
Гость
« Ответ #2 : 08-10-2008 15:43 » 

А как ее вызвать? Краснею
Записан
li6051
Гость
« Ответ #3 : 08-10-2008 16:20 » 

Цитата
li6051, код в студию!
Краснею Краснею Краснею Что это за код такой? Краснею Краснею Краснею(Ну, очень стыдно!)
Записан
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
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 08-10-2008 18:28 » 

См. строку 58. Там есть синтаксическая ошибка.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Finch
Спокойный
Администратор

il
Offline 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, Спасибо, за помощь, все получилось! Улыбаюсь)
Цитата
Читаем учебник.
Как раз этим и занимаюсь Улыбаюсь
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines