Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.03.2010, 19:13   #1
Lisёноk
Пользователь
 
Регистрация: 08.03.2010
Сообщений: 75
По умолчанию Не работает цикл

Здравствуйте!

Мне необходимо было показать увеличение и уменьшение кругов в объекте Image.

Я написала следующий цикл:

Код:
procedure Ellipse1 (x,y: integer);
var r,i, Rnew: integer ;
begin
r:=0;
for i:=65 downto 45 do
begin
Rnew:=r+i;
Form1.DoubleBuffered:=TRUE;
Application.ProcessMessages;
image1.Canvas.Ellipse(Image1.Width DIV 4 + Rnew,Image1.Height DIV 3 - Rnew,
                      Image1.Width DIV 4 - Rnew, Image1.Height DIV 3 + Rnew);

sleep (100);

end;
end;

procedure Ellipse2  (x,y: integer);
var r,i, Rnew: integer ;
begin
r:=0;
for i:=45 to 65 do
begin
Rnew:=r+i;
Form1.DoubleBuffered:=TRUE;
Application.ProcessMessages;
image1.Canvas.Ellipse(Image1.Width DIV 2 + Rnew, Image1.Height DIV 3 - Rnew,
                      Image1.Width DIV 2 - Rnew, Image1.Height DIV 3 + Rnew);

sleep (100);
end;
end;

begin
WITH Image1.Canvas DO
BEGIN
Brush.Color:=clMedGray;
Pen.Color:=clMaroon;
Pen.Style:=psSolid;
Pen.Width:=4;
Font.Size:=20;
Font.Style:= [fsItalic, fsBold];
Brush.Style:=bsClear;
Font.Color:=clBlue;
TextOut (430, 300, 'Магнитофон');
FillRect(Image1.ClientRect);
MoveTo(Image1.Width DIV 3 - 40,Image1.Height DIV 3 + 40);
LineTo(Image1.Width DIV 2 ,Image1.Height DIV 3 - 40);
Brush.Color:=clSilver;

Ellipse(Image1.Width DIV 4 + 65, Image1.Height DIV 3 - 65,
       Image1.Width DIV 4 - 65, Image1.Height DIV 3 + 65);
Ellipse(Image1.Width DIV 2 + 45, Image1.Height DIV 3 - 45,
        Image1.Width DIV 2 - 45, Image1.Height DIV 3 + 45);
Ellipse1 (10,20);
Ellipse2 (10,20);
end;
end;
end.

Все работало. За одним исключением. Круги изменяли размер поочередно, а не одновременно.

Я заменила этот цикл другим:

Код:
procedure Ellipse1 (x, y: integer);
var r,i,j, Rnew, Rnew1: integer ;

begin
r:=0;
for i:=45 to 65 do

Rnew:=r+i;
Form1.DoubleBuffered:=TRUE;
Application.ProcessMessages;
sleep(10);
image1.Canvas.Ellipse(Image1.Width DIV 4 + Rnew,Image1.Height DIV 3 - Rnew,
                      Image1.Width DIV 4 - Rnew, Image1.Height DIV 3 + Rnew);

for j:=65 downto 45 do
Rnew1:=r+j;
Form1.DoubleBuffered:=TRUE;
Application.ProcessMessages;
sleep(10);
image1.Canvas.Ellipse(Image1.Width DIV 2 + Rnew1, Image1.Height DIV 3 - Rnew1,
                      Image1.Width DIV 2 - Rnew1, Image1.Height DIV 3 + Rnew1);




end;

begin
WITH Image1.Canvas DO
BEGIN
Brush.Color:=clMedGray;
Pen.Color:=clMaroon;
Pen.Style:=psSolid;
Pen.Width:=4;
Font.Size:=20;
Font.Style:= [fsItalic, fsBold];
Brush.Style:=bsClear;
Font.Color:=clBlue;
TextOut (430, 300, 'Магнитофон');
FillRect(Image1.ClientRect);
MoveTo(Image1.Width DIV 3 - 40,Image1.Height DIV 3 + 40);
LineTo(Image1.Width DIV 2 ,Image1.Height DIV 3 - 40);
Brush.Color:=clSilver;

{Ellipse(Image1.Width DIV 4 + 45, Image1.Height DIV 3 - 45,
       Image1.Width DIV 4 - 45, Image1.Height DIV 3 + 45);
Ellipse(Image1.Width DIV 2 + 65, Image1.Height DIV 3 - 65,
        Image1.Width DIV 2 - 65, Image1.Height DIV 3 + 65); }
Ellipse1 (10, 20);
application.ProcessMessages;
sleep(10);
//Ellipse2 (10,20);
end;
end;
Теперь картинка не изменяется вообще. Что необходимо изменить в цикле?
Я самый порочный ангел и самый безгрешный демон...
Lisёноk вне форума Ответить с цитированием
Старый 17.03.2010, 21:49   #2
Скандербег
Форумчанин
 
Регистрация: 04.04.2009
Сообщений: 438
По умолчанию

Код:
var
  R1, R2 : TRect;

procedure Ellipse1;
var i : integer;
begin
  for i := 1 to 20 do begin
    Form1.image1.Canvas.Pen.Color := clMaroon;
    Form1.image1.Canvas.Arc(R1.Left, R1.Top, R1.Right, R1.Bottom, R1.Left, R1.Top, R1.Left, R1.Top);
    InflateRect(R1, -1, 1);

    Form1.image1.Canvas.Pen.Color := clWhite;
    Form1.image1.Canvas.Arc(R2.Left, R2.Top, R2.Right, R2.Bottom, R2.Left, R2.Top, R2.Left, R2.Top);
    InflateRect(R2, 1, -1);

    Application.ProcessMessages;
    sleep (100);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var i : integer;
begin
  Form1.DoubleBuffered:=TRUE;
  WITH Image1.Canvas DO BEGIN
    Brush.Color:=clMedGray;
    Pen.Color:=clMaroon;
    Pen.Style:=psSolid;
    Pen.Width:=2;
    Font.Size:=20;
    Font.Style:= [fsItalic, fsBold];
    Brush.Style:=bsClear;
    Font.Color:=clBlue;
    TextOut (430, 300, 'Магнитофон');
    FillRect(Image1.ClientRect);
    MoveTo(Image1.Width DIV 3 - 40,Image1.Height DIV 3 + 40);
    LineTo(Image1.Width DIV 2 ,Image1.Height DIV 3 - 40);
    Brush.Color:=clSilver;

    R1 := Rect(Image1.Width DIV 4 + 45, Image1.Height DIV 3 - 45,
               Image1.Width DIV 4 - 45, Image1.Height DIV 3 + 45);
    R2 := Rect(Image1.Width DIV 2 + 45, Image1.Height DIV 3 - 45,
               Image1.Width DIV 2 - 45, Image1.Height DIV 3 + 45);
    Ellipse(R1);

    Brush.Color := clMaroon;
    InflateRect(R2, -20, 20);
    Ellipse(R2);

    Brush.Color := clMedGray;
    InflateRect(R2, 20, -20);
    Ellipse(R2);
    InflateRect(R2, -20, 20);

    Ellipse1;
  end;
end;
Скандербег вне форума Ответить с цитированием
Старый 18.03.2010, 17:07   #3
Lisёноk
Пользователь
 
Регистрация: 08.03.2010
Сообщений: 75
По умолчанию

Спасибо!
А можно пояснить, что такое:

Код:
   Form1.image1.Canvas.Arc(R1.Left, R1.Top, R1.Right, R1.Bottom, R1.Left, R1.Top, R1.Left, R1.Top);
    InflateRect(R1, -1, 1);
и

Код:
 InflateRect(R2, -20, 20);
Я самый порочный ангел и самый безгрешный демон...
Lisёноk вне форума Ответить с цитированием
Старый 18.03.2010, 17:49   #4
Скандербег
Форумчанин
 
Регистрация: 04.04.2009
Сообщений: 438
По умолчанию

Arc - метод TCanvas (один из многих, таких, например, как Ellipse, FillRect и пр.), который рисует дугу. Дугу можно замкнуть в круг, как показано в примере. Отличие от Ellipse в том, что при рисовании дуги как круга внутренняя поверхность не заполняется каким-либо цветом, а рисуется только окружность.

InflateRect - функция API (функция Windows), которая позволяет пропорционально увеличивать или уменьшать размеры прямоугольников, заданные структурой TRect (эллипс и дуга в программе рисуются по координатам прямоугольника).
Скандербег вне форума Ответить с цитированием
Старый 19.03.2010, 18:24   #5
Lisёноk
Пользователь
 
Регистрация: 08.03.2010
Сообщений: 75
По умолчанию

Большое спасибо!!!
Я самый порочный ангел и самый безгрешный демон...
Lisёноk вне форума Ответить с цитированием
Старый 23.03.2010, 21:39   #6
Lisёноk
Пользователь
 
Регистрация: 08.03.2010
Сообщений: 75
По умолчанию

А вот мне теперь сказали дальше развить лабу. Попросили получить из нее бобины, на которые наматывается нитка. Я по аналогии сделала:
Код:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Image1: TImage;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


var
R1, R2 : TRect;

procedure Ellipse1;
var i : integer;
begin
for i := 1 to 20 do
begin
Form1.image1.Canvas.Pen.Color := clMaroon;
Form1.image1.Canvas.Arc(R1.Left, R1.Top, R1.Right, R1.Bottom, R1.Left, R1.Top, R1.Left, R1.Top);
InflateRect(R1, -1, 1);

Form1.image1.Canvas.Pen.Color := clWhite;
Form1.image1.Canvas.Arc(R2.Left, R2.Top, R2.Right, R2.Bottom, R2.Left, R2.Top, R2.Left, R2.Top);
InflateRect(R2, 1, -1);

Application.ProcessMessages;
sleep (100);
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var i : integer;
begin
Form1.DoubleBuffered:=TRUE;
WITH Image1.Canvas DO BEGIN
Brush.Color:=clMedGray;
Pen.Color:=clMaroon;
Pen.Style:=psSolid;
Pen.Width:=2;
Font.Size:=20;
Font.Style:= [fsItalic, fsBold];
Brush.Style:=bsClear;
Font.Color:=clBlue;
TextOut (430, 300, 'Маяк');
FillRect(Image1.ClientRect);
MoveTo(Image1.Width DIV 3 - 40,Image1.Height DIV 3 + 40);
LineTo(Image1.Width DIV 2 ,Image1.Height DIV 3 - 40);
Brush.Color:=clSilver;

R1 := Rect(Image1.Width DIV 4 + 45, Image1.Height DIV 3 - 45,
               Image1.Width DIV 4 - 45, Image1.Height DIV 3 + 45);
R2 := Rect(Image1.Width DIV 2 + 45, Image1.Height DIV 3 - 45,
               Image1.Width DIV 2 - 45, Image1.Height DIV 3 + 45);
Ellipse(R1);

Brush.Color := clMaroon;
InflateRect(R2, -20, 20);
Ellipse(R2);

Brush.Color := clMedGray;
InflateRect(R2, 20, -20);
Ellipse(R2);
InflateRect(R2, -20, 20);

Ellipse1;
end;
end;


procedure Ellipse2;
var i : integer;
begin
for i := 1 to 20 do
begin
Form1.image1.Canvas.Pen.Color := clWhite;
Form1.image1.Canvas.Arc(R1.Left, R1.Top, R1.Right, R1.Bottom, R1.Left, R1.Top, R1.Left, R1.Top);
InflateRect(R1, 1, -1);

Form1.image1.Canvas.Pen.Color := clMaroon;
Form1.image1.Canvas.Arc(R2.Left, R2.Top, R2.Right, R2.Bottom, R2.Left, R2.Top, R2.Left, R2.Top);
InflateRect(R2, -1, 1);

Application.ProcessMessages;
sleep (100);
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var i : integer;
begin
Form1.DoubleBuffered:=TRUE;
WITH Image1.Canvas DO BEGIN
Brush.Color:=clMedGray;
Pen.Color:=clMaroon;
Pen.Style:=psSolid;
Pen.Width:=2;
Font.Size:=20;
Font.Style:= [fsItalic, fsBold];
Brush.Style:=bsClear;
Font.Color:=clBlue;
TextOut (430, 300, 'Маяк');
FillRect(Image1.ClientRect);
MoveTo(Image1.Width DIV 3 - 40,Image1.Height DIV 3 + 40);
LineTo(Image1.Width DIV 2 ,Image1.Height DIV 3 - 40);
Brush.Color:=clSilver;

R1 := Rect(Image1.Width DIV 4 + 65, Image1.Height DIV 3 - 65,
               Image1.Width DIV 4 - 65, Image1.Height DIV 3 + 65);
R2 := Rect(Image1.Width DIV 2 + 45, Image1.Height DIV 3 - 45,
               Image1.Width DIV 2 - 45, Image1.Height DIV 3 + 45);
Ellipse(R2);

Brush.Color := clMaroon;
InflateRect(R1, 5, -5);
Ellipse(R1);

Brush.Color := clMedGray;
InflateRect(R1, -3, 3);
Ellipse(R1);
InflateRect(R1, 3, -3);

Ellipse2;
end;
end;
end.
Но у меня есть небольшие косяки((( Во втором цикле идет неверная намотка нити. Подскажите, пожалуйста, что нужно подправить?
Я самый порочный ангел и самый безгрешный демон...
Lisёноk вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Цикл не работает doniyor Общие вопросы Delphi 1 06.12.2009 15:52
Почему не работает цикл? Marsik Помощь студентам 0 18.11.2009 15:01
Почему не работает цикл??? kobolok Помощь студентам 1 06.05.2009 12:24
Почему не работает цикл????? Marsik Помощь студентам 2 22.06.2008 14:16
Цикл не работает...? Иринкаа Помощь студентам 6 17.11.2007 00:27