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

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

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

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

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 24.10.2011, 11:17   #1
phasha
Форумчанин
 
Регистрация: 24.03.2011
Сообщений: 130
По умолчанию как сделать так что бы первая операция вызывалась лишь один раз?

Код:
procedure tcircle.move(sender: TObject);
var i,stepy,stepx:Integer;
begin   
if i <>0 then begin         //
        stepx:=-1;           //
   stepy:=-1;   end;i:=0;//вот эта

  if ((placement.X+stepx-radius>0)and(placement.X+stepx+radius<width )) then begin
         stepx:=-stepx;          end ;

   if ((placement.Y+stepy-radius>0)and(placement.Y+stepy+radius<height ))
       then  begin  stepy:=stepy*(-1);    end;
       show(true);
       placement:=Point(placement.X+stepx,placement.Y+stepy);
        show;
end;
phasha вне форума
Старый 24.10.2011, 11:42   #2
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Это вы, товарищ, что-то напутали.
Локальные переменные Delphi не инициализирует и при обращении к такой перменной (if i<>0) ее значение может быть каким угодно, т.е. не предсказуемым.
В результате, проверка значения становится бессмысленной.
Если бы i :=0; была вначале процедуры, то какая-то логика в проверке была бы, хотя тоже бесполезной. Тем более, что дальше переменная i нигде не используется.

---
В чем предполагалась смысловая нагрузка на переменную i?
К сожалению, в приведенном фрагменте кода никакой логики ее применения не просматривается.

Последний раз редактировалось Прик; 24.10.2011 в 11:45.
Прик вне форума
Старый 24.10.2011, 11:44   #3
Dush
Форумчанин
 
Регистрация: 29.09.2011
Сообщений: 116
По умолчанию

а где вы i инициализируете? у вас она объявляется как локальная переменная и сразу проверяется ее значение...
Dush вне форума
Старый 24.10.2011, 11:47   #4
phasha
Форумчанин
 
Регистрация: 24.03.2011
Сообщений: 130
По умолчанию

так я это сделал что бы параметр шагов появлялся тока один раз а изменялся по условию ниже.грубо говоря пытаюсь сделать чтобы шарик отталкивался от граней...
Код:
unit Unit2;

interface
 uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,ExtCtrls;
  type tcircle=class
  radius:Integer;
  color:TColor;
  placement:TPoint;
  dx,dy:Integer;
  canvas:TCanvas;
  speed:Integer;
  stepx,stepy:Integer;
  timer:ttimer;
  tag:Integer;
  height,width:Integer;
  constructor create(r,h,w,t,x,y:Integer;col:TColor;c:TCanvas);
  destructor destroy; override;
  procedure move(sender:TObject);
  procedure show(transparent:Boolean=false);    end;
implementation

{ tcircle }

constructor tcircle.create(r, h, w, t, x, y: Integer; col: TColor;
  c: TCanvas);
begin   inherited create;
height:=h;width:=w;dx:=x;dy:=y;tag:=t;color:=col;canvas:=c;radius:=r;
placement:=Point(random(width-2*radius-1)+radius +1,random(height-2*radius-1)+radius+1);
speed:=10;
timer:=ttimer.create(nil);
timer.interval:=speed;
timer.ontimer:=move;
timer.enabled:=True;
end;

destructor tcircle.destroy;
begin
timer.enabled:=False;
timer.free;
  inherited;
end;

procedure tcircle.move(sender: TObject);
var i,stepy,stepx:Integer;
begin
        stepx:=-1;
   stepy:=-1;
  if ((placement.X+stepx-radius>0)and(placement.X+stepx+radius<width )) then begin
         stepx:=-stepx;          end ;

   if ((placement.Y+stepy-radius>0)and(placement.Y+stepy+radius<height ))
       then  begin  stepy:=stepy*(-1);    end;
       show(true);
       placement:=Point(placement.X+stepx,placement.Y+stepy);
        show;
end;
procedure tcircle.show(transparent: Boolean);
begin
      if transparent then begin
        canvas.Brush.Color:=clWhite;
        canvas.Pen.Mode:=pmWhite;
        canvas.Ellipse(placement.X-radius+dx,placement.Y-radius+dy,placement.X+radius+dx,placement.Y+radius+dy);
      end
      else begin
        canvas.Brush.Color:=color;
        canvas.Pen.Mode:=pmCopy;
        canvas.Ellipse(placement.X+dx-radius,placement.Y-radius+dy,placement.X+radius+dx,placement.Y+radius+dy);
        canvas.TextOut(placement.X+dx-trunc(canvas.TextWidth(inttostr(tag))),placement.Y+dy-trunc(canvas.TextHeight('1')/2),IntToStr(tag));
      end;
end;

end.
мне товарищи уже подсказывали на этом сайте что нужно границы обозначить типом Trect но сам я воплотить это так и не сумел...
phasha вне форума
Старый 24.10.2011, 11:54   #5
phasha
Форумчанин
 
Регистрация: 24.03.2011
Сообщений: 130
По умолчанию

Цитата:
Сообщение от Dush Посмотреть сообщение
а где вы i инициализируете? у вас она объявляется как локальная переменная и сразу проверяется ее значение...
дело в том что если инициализировать i то каждый раз оно будет принимать то значение что и было в начале и условие будет выполняться всегда,просто уже много перепробовал из мне возможных вещей и в итоге дошел до этого((
phasha вне форума
Старый 24.10.2011, 12:18   #6
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

А нельзя stepx и stepy инициализировать при создании объекта (в Create)?
Не объявлять их локально, а сделать полями класса (ну, как dx и dy, например)?
Тогда и придумывать не надо ничего.
Прик вне форума
Старый 24.10.2011, 12:24   #7
phasha
Форумчанин
 
Регистрация: 24.03.2011
Сообщений: 130
По умолчанию

я и это пробовал...обьекты полностью перестают двигаться...не знаю уже что делать(((
phasha вне форума
Старый 24.10.2011, 12:41   #8
phasha
Форумчанин
 
Регистрация: 24.03.2011
Сообщений: 130
По умолчанию

Код:
unit Unit2;

interface
 uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,ExtCtrls;
  type tcircle=class
  radius:Integer;
  color:TColor;
  placement:TPoint;
  dx,dy:Integer;
  canvas:TCanvas;
  speed:Integer; step:TPoint;
  //stepx,stepy:Integer;
  timer:ttimer;
  tag:Integer;
  height,width:Integer;
  constructor create(r,h,w,t,x,y:Integer;col:TColor;c:TCanvas);
  destructor destroy; override;
  procedure move(sender:TObject);
  procedure show(transparent:Boolean=false);    end;
implementation

{ tcircle }

constructor tcircle.create(r, h, w, t, x, y: Integer; col: TColor;
  c: TCanvas);
begin   inherited create;
height:=h;width:=w;dx:=x;dy:=y;tag:=t;color:=col;canvas:=c;radius:=r;
placement:=Point(random(width-2*radius-1)+radius +1,random(height-2*radius-1)+radius+1);
speed:=1;    step:=Point(-1,-1);
timer:=ttimer.create(nil);
timer.interval:=speed;
timer.ontimer:=move;
timer.enabled:=True;
end;

destructor tcircle.destroy;
begin
timer.enabled:=False;
timer.free;
  inherited;
end;

procedure tcircle.move(sender: TObject);
var stepy,stepx:Integer;
begin
       {stepx:=-1;
   stepy:=-1;}

  if ((placement.X+step.x-radius>0)and(placement.X+step.x+radius<width )) then begin
         step.x:=step.x*(-1);          end;
   if ((placement.Y+step.y-radius>0)and(placement.Y+step.y+radius<height ))
       then  begin  step.y:=step.y*(-1);     end;
          show(true);
       placement:=Point(placement.X+step.x,placement.Y+step.y);
        show;
end;
procedure tcircle.show(transparent: Boolean);
begin
      if transparent then begin
        canvas.Brush.Color:=clWhite;
        canvas.Pen.Mode:=pmWhite;
        canvas.Ellipse(placement.X-radius+dx,placement.Y-radius+dy,placement.X+radius+dx,placement.Y+radius+dy);
      end
      else begin
        canvas.Brush.Color:=color;
        canvas.Pen.Mode:=pmCopy;
        canvas.Ellipse(placement.X+dx-radius,placement.Y-radius+dy,placement.X+radius+dx,placement.Y+radius+dy);
        canvas.TextOut(placement.X+dx-trunc(canvas.TextWidth(inttostr(tag))),placement.Y+dy-trunc(canvas.TextHeight('1')/2),IntToStr(tag));
      end;
end;

end.
сделал шаг типа поинт как координату,может теперь легче будет разбираться))
phasha вне форума
Старый 24.10.2011, 13:53   #9
phasha
Форумчанин
 
Регистрация: 24.03.2011
Сообщений: 130
По умолчанию

все я сделал! всем спасибо за участие!!!)))
phasha вне форума
Закрытая тема


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как програмно сделать так что принтер печатал roborrr Microsoft Office Excel 2 11.03.2011 13:07
Как сделать так что бы прога копировала сама себя? нью Помощь студентам 3 11.01.2010 11:26
Как сделать, чтобы значение в столбце повторялось один раз? Oleg T. Microsoft Office Excel 1 17.12.2008 16:02
Как сделать, чтобы программа запускалась один раз, т.е. повторно запустить нельзя??? Kamikadze_666 Безопасность, Шифрование 7 31.07.2007 08:34
Как сделать что-бы Таймер срабатывал только один раз? Greg Компоненты Delphi 11 16.12.2006 01:25