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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.11.2008, 18:20   #1
kasta
 
Регистрация: 09.11.2008
Сообщений: 7
По умолчанию проблема с прогой mytаbora (амперметр)

При попытке переделать амперметр возникла проблемка.........
Стрелка должна двигаться по окружности, но при вводе числа большего 500 програма либо зависает либо стрлка начинает выдовать всякие приколы.....
стрела должна проделывать оборот по окружности неограниченное число раз...
например при значениии 1000 делала один оборот то окружности, при 3000 три оборота....
не могу сам допетрить.......
Вложения
Тип файла: rar высотомер переделаный.rar (168.3 Кб, 19 просмотров)

Последний раз редактировалось kasta; 13.11.2008 в 18:33.
kasta вне форума Ответить с цитированием
Старый 13.11.2008, 18:30   #2
kasta
 
Регистрация: 09.11.2008
Сообщений: 7
По умолчанию

Код:
код:

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Edit1: TEdit;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
//    procedure RadioGroup1Click(Sender: TObject);

    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

const
  D2R_COEF = 57.324; //degrees to radian
  RATIO = 0.36; //амперы в градусы

var
  Form1: TForm1;
  amp, buffer: TBitmap;
  radius: byte = 200; //радиус стрелки
  amper: integer; //сила тока
  prev: real; //предыдущая величина
razn,ost  : real;
   max:integer; //для плавного хода с замедлением
  anim: boolean; //включает и выключает анимацию
  damper: real; //амперы для отрисовки
  k,n: byte;
implementation

{$R *.DFM}

procedure DrawAmp(var bm: TBitmap);
var
i,lx,ly: integer;
begin
bm.Width:=800;
bm.Height:=800;
with bm.Canvas do
  begin
    Pen.Width:=2;
    Ellipse(45,45,485,485);
 // Font.Style:=[];
  // Font.Style:=[fsBold];

  TextOut(265, 75,'0 ');
  TextOut(376, 106,'1 ');
  TextOut(444, 200,'2 ');
  TextOut(444, 317,'3 ');
  TextOut(376, 410,'4 ');
  TextOut(265, 446,'5 ');
  TextOut(152, 410,'6 ');
  TextOut(80, 317,'7 ');
  TextOut(80, 200,'8 ');
  TextOut(152, 106,'9 ');


  //Rectangle(0,0,500,500);

 // TextOut(10,10,'mA');

 { TextOut(20,84,'0');
  TextOut(28,58,'50');
  TextOut(47,31,'100');
  TextOut(78,20,'150');
  //Brush.Color:=clBlack;
  //Pie(86,86,106,106,96,86,86,96);   }
  for i:=0 to 19 do
    begin
    Pen.Width:=2;
    lx:=265+round(cos((round(i*(360/20))+180)/D2R_COEF)*(220));
    ly:=265+round(sin((round(i*(360/20))+180)/D2R_COEF)*(220));
    MoveTo(lx,ly);
   lx:=265+round(cos((round(i*(360/20))+180)/D2R_COEF)*(205));
    ly:=265+round(sin((round(i*(360/20))+180)/D2R_COEF)*(205));
    LineTo(lx,ly);

    end;

  end;
end;

procedure LoadAmp(var bm: TBitmap; fn: TFileName);
begin
bm.LoadFromFile(fn);
end;

procedure Strelka(a: integer);
var
sx,sy,grad: integer;
radian: double;
begin
grad:=a+270;
radian:=grad /D2R_COEF;
sx:=265+round(cos(radian)*radius);
sy:=265+round(sin(radian)*radius);
buffer.Canvas.MoveTo(265,265);
buffer.Canvas.LineTo(sx,sy);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
edit1.Text:='';
buffer:=TBitmap.Create;
buffer.Width:=500;
buffer.Height:=500;
buffer.Canvas.Pen.Width:=1; //толщина стрелки
amp:=TBitmap.Create;
DrawAmp(amp); //либо эта процедура - программная отрисовка
//LoadAmp(amp,'ampermetr.bmp'); //либо эта - загрузка из файла (100 х 100 pxl)
end;

  procedure TForm1.Timer1Timer(Sender: TObject);
begin
buffer.Canvas.Draw(0,0,amp);
if anim then
  begin
    if ost <> 0 then
      begin
      if razn < 0 then damper:=damper-ost else damper:=damper+ost;
      ost:=0;
      end
    else
     begin
      if razn <0  then damper:=damper-max else damper:=damper+max;
      dec(max);
      if max < 0 then anim:=false;
      end;
  end
else damper:=amper;
Strelka(round(ratio*damper));
Canvas.Draw(0,0,buffer); //10, 10 - координаты амперметра на канве
end;


procedure TForm1.Button1Click(Sender: TObject);

begin
//  var
//k,n: byte;
begin
k:=0;
n:=0;
prev:=amper;
   amper:=StrToInt(edit1.text);
{case RadioGroup1.ItemIndex of
  0: amper:=0;
  1: amper:=20;
  2: amper:=50;
  3: amper:=70;
  4: amper:=100;
  5: amper:=120;
  6: amper:=150;
  end; }
if prev <> amper then
  begin
  razn:=amper - prev;
  anim:=true;
  end;
while n < abs(razn)-k do
  begin
  inc(k);
  n:=n+k;
  end;
max:=k;
ost:=abs(razn)-n;
end;

end;



end.

Последний раз редактировалось kasta; 14.11.2008 в 13:32.
kasta вне форума Ответить с цитированием
Старый 13.11.2008, 23:03   #3
Карась
Участник клуба
 
Аватар для Карась
 
Регистрация: 26.10.2007
Сообщений: 1,244
По умолчанию

Из этой програмки резон урвать (просто лень самому писать) отрисовку циферблата.

Всё что относиться к движению стрелочки лучше написать самому...
(если честно то просто чужии алгоритмы с формулами неперевариваю)
Умом Россию не понять, пока не выпито ноль пять,
А если выпито ноль пять всё делом кажется не хитрым,
Попытка глубже понимать уже попахивает литром...
Карась вне форума Ответить с цитированием
Старый 14.11.2008, 13:32   #4
kasta
 
Регистрация: 09.11.2008
Сообщений: 7
По умолчанию

Да пословицу я эту знаю только легче от этого не стает...

может кто-то знает mytabora это походу его алгоритм.... как с ним связаться ....

Последний раз редактировалось kasta; 14.11.2008 в 14:01.
kasta вне форума Ответить с цитированием
Старый 14.11.2008, 17:43   #5
Карась
Участник клуба
 
Аватар для Карась
 
Регистрация: 26.10.2007
Сообщений: 1,244
По умолчанию

Он чаще всего обитает тут:
http://programmersforum.ru/forumdisplay.php?f=33
Умом Россию не понять, пока не выпито ноль пять,
А если выпито ноль пять всё делом кажется не хитрым,
Попытка глубже понимать уже попахивает литром...
Карась вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с прогой Claster Общие вопросы Delphi 1 11.09.2008 17:53
Помогите с прогой (С++) Meddy Помощь студентам 3 13.07.2008 21:38
подскажите с прогой motaro Помощь студентам 8 12.07.2007 16:40
Помогите с прогой DarthNemo Помощь студентам 2 06.05.2007 18:11