Страница 10 из 12

Re: Управление изображением на мониторе через COM порт

Добавлено: Вт дек 28, 2010 12:46:30
FRIM@N
значит сажусь за фотошоп - рисовать

собственно вот Изображение

лифт имеется отдельно, взгляните может я какие косяки не доглядел?И вообще как выглядит?

Re: Управление изображением на мониторе через COM порт

Добавлено: Чт дек 30, 2010 23:09:26
FRIM@N
http://kurspk2009.narod.ru/progr/delphi/animeDelphi.htm

там внизу есть листинг исходника


только вот при запуске встает на первом операторе unit pav; это опять каклй-то доп. нестандартный юнит?непрописан путь к открываемым картинкам--это как дельфи их находить будет,только по именам?что бы изменить направления движения на вертикальное нужно просто вместо X понаставить Y?Чему равен шаг shx? Для чего нужны ограничения "if x>500 then shx:=shx*-1;// ограничение справа"?

Код: Выделить всё

unit pav;

interface



uses

  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

  ExtCtrls;



type

  TForm1 = class(TForm)

    procedure FormCreate(Sender: TObject);

    procedure Timer1Timer(Sender: TObject);

    procedure rmKeyDown(Sender: TObject; var Key: Word;

      Shift: TShiftState);

  private

    { Private declarations }

  public

    { Public declarations }

  end;

//Описание типов переменных

var

  Form1: TForm1;

  fon:tbitmap;//ГРАФИЧЕСКИЙ ОБРАЗ дома

  KORB:TBITMAP;//ГРАФИЧЕСКИЙ ОБРАЗ лифта

  x:integer;//координаты X лифта

  shx:integer;//Шаг движения лифта  по X



implementation



{$R *.DFM}



//Старт главной формы

procedure TForm1.FormCreate(Sender: TObject);

begin

shx:=6;

//

fon:=tbitmap.Create;//

korb:=tbitmap.Create;//

//

fon.LoadFromFile('Dom.bmp');//Загрузить в переменную 'fon' файл  'fon.bmp'

//

korb.LoadFromFile('lift.bmp');//Загрузить в переменную 'korb' файл  'korb.bmp'

korb.transparent:=true;//Прозрачность вокруг контура корабля

//

image1.Canvas.Draw(0,0,fon);//

image1.Canvas.Draw(x,60,korb);//

end;



//Работа таймера движение корабля

procedure TForm1.Timer1Timer(Sender: TObject);

begin

x:=x+shx;//текущая координата + шаг

if x>500 then shx:=shx*-1;// ограничение справа

if x<0 then shx:=shx*-1;//ограничение слева

image1.Canvas.Draw(0,0,fon);//возобновление фона

image1.Canvas.Draw(x,60,korb);//движение корабля

//

end;

end.

Re: Управление изображением на мониторе через COM порт

Добавлено: Пт дек 31, 2010 11:28:16
Murlock
когда дельфя подсвечивает ошибку, она ее распознаёт(даёт ей номер) и расшифровывает в самом нижнем списке окна с программным текстом. у вас скорее всего юнит был переименован вручую после создания. так делать нельзя. используйте дла переименований инспектор проекта. shx(shy) измеряется в пикселях.

Re: Управление изображением на мониторе через COM порт

Добавлено: Пт дек 31, 2010 13:47:30
FRIM@N
я произвел некоторую рихтовку,добавил в форму объекты таймера и image выпилил ненужные процедуры направление движения с клавиатуры и о чудо все запустилось без ошибок --только в форме пустой белый экран без движения.

Код: Выделить всё


unit Unit1;

interface



uses

  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

  ExtCtrls;



type

  TForm1 = class(TForm)
    img1: TImage;
    img2: TImage;
    tmr1: TTimer;

    procedure FormCreate(Sender: TObject);
    procedure Tmr1Timer(Sender: TObject);

  private

    { Private declarations }

  public

    { Public declarations }

  end;

//Îïèñàíèå òèïîâ ïåðåìåííûõ

var

  Form1: TForm1;

  Dom:tbitmap;//ÃÐÀÔÈ×ÅÑÊÈÉ ÎÁÐÀÇ äîìà

  lift:TBITMAP;//ÃÐÀÔÈ×ÅÑÊÈÉ ÎÁÐÀÇ ëèôòà

  x:integer;//êîîðäèíàòû X ëèôòà

  shx:integer;//Øàã äâèæåíèÿ ëèôòà  ïî X



implementation



{$R *.DFM}



//Ñòàðò ãëàâíîé ôîðìû

procedure TForm1.FormCreate(Sender: TObject);

begin

shx:=6;

//

Dom:=tbitmap.Create;//

lift:=tbitmap.Create;//

//
Dom.LoadFromFile('Dom.bmp');//Çàãðóçèòü â ïåðåìåííóþ 'fon' ôàéë  'fon.bmp'

//

lift.LoadFromFile('lift.bmp');//Çàãðóçèòü â ïåðåìåííóþ 'korb' ôàéë  'korb.bmp'
//

img1.Canvas.Draw(0,0,Dom);//

img2.Canvas.Draw(x,60,lift);//

end;


//Ðàáîòà òàéìåðà äâèæåíèå êîðàáëÿ

procedure TForm1.tmr1Timer(Sender: TObject);
begin
  x:=x+shx;//òåêóùàÿ êîîðäèíàòà + øàã

if x>500 then shx:=shx*-1;// îãðàíè÷åíèå ñïðàâà

if x<0 then shx:=shx*-1;//îãðàíè÷åíèå ñëåâà

img1.Canvas.Draw(0,0,Dom);//âîçîáíîâëåíèå ôîíà

img2.Canvas.Draw(x,60,lift);//äâèæåíèå êîðàáëÿ

end;

end.


Re: Управление изображением на мониторе через COM порт

Добавлено: Пт дек 31, 2010 13:57:30
Murlock
при старте х неопределено и может быть любым. присвойте ему 500 в событии Form1.OnCreate

Re: Управление изображением на мониторе через COM порт

Добавлено: Пт дек 31, 2010 14:49:54
FRIM@N
var

Form1: TForm1;

Dom:tbitmap;//ÃÐÀÔÈ×ÅÑÊÈÉ ÎÁÐÀÇ äîìà

lift:TBITMAP;//ÃÐÀÔÈ×ÅÑÊÈÉ ÎÁÐÀÇ ëèôòà

x:integer;//êîîðäèíàòû X ëèôòà

shx:integer;

здесь дописать Form1.OnCreate;x:=500;
и почему именно 500?

или вот http://www.delphi-guru.pp.ua/news/otkry ... -12-13-113 открыть сразу гиф картинку ,для меня это будет проще намного, правда я не понял как установить библиотеку

Re: Управление изображением на мониторе через COM порт

Добавлено: Сб янв 01, 2011 22:08:16
Murlock
img2.Canvas.Draw(x,y,lift);
здесь: что-бы двигаться по вертикали х следует оставить фиксированным, и менять y.
y следует описать в var и проинициализировать внутри OnCreate.
gif лучше не использовать. могут получиться проблемы со связью изображения с внутринними программными событиями.
я бы просто нарисовал 3 или более разных бмп и показывал их по-мере надобности. но это всё рюшечки. самое главное - добиться правильности ВВ в порт. для этого достаточно и лабеля или эдита.

Re: Управление изображением на мониторе через COM порт

Добавлено: Сб янв 01, 2011 22:19:43
FRIM@N
лабель и эдит нужны были просто что бы действительно увидеть результат --получилось или нет , но так как это оказалось непросто я подумал что проще аралельно сообразить подпрограммы к которым будет переходить основная по команде с кнопки --как в общем-то и задумывалось
я бы просто нарисовал 3 или более разных бмп
ну я планирую сам дом сделать фоном,а лифт корабликом который будет перерисовыватся
я просмотрел программу и не нашел событие OnCreate только FormCreate и по прежнему открыт вопрос как программа находит картинки,т.к. она их ненаходит --при запуске белая форма,я поместил картинки в папку с проектом и даже пытался засунуть их перетаскиванием в форму

Re: Управление изображением на мониторе через COM порт

Добавлено: Сб янв 01, 2011 22:48:34
Murlock
загрузить картинку просто:
в менеджере объектов есть свойство picture тип - TBitmap. рядом кнопка с тремя точками. жмёте - диалог загрузки файла. по-моему, изображение встраивается в программный код. для инициализации переменных используйте FormCreate.

Re: Управление изображением на мониторе через COM порт

Добавлено: Сб янв 01, 2011 23:10:10
FRIM@N
он пишет Stream ream error и не загружает файл,тип файла БМП поставлен,да и сам он бмп

Re: Управление изображением на мониторе через COM порт

Добавлено: Сб янв 01, 2011 23:14:15
Murlock
какой у файла размер? может этот файл открыт какой другой программой? у меня нормально загружается.

Re: Управление изображением на мониторе через COM порт

Добавлено: Сб янв 01, 2011 23:19:48
FRIM@N
1024х768 так же я поставил в инспекторе
\\точно весь фэйл в размере --сам лифт нормально загрузился--какой максимальный размер можно туда затюхать?он кстати стал отображатся в форме при запуске ,но никуда не едет

Re: Управление изображением на мониторе через COM порт

Добавлено: Сб янв 01, 2011 23:27:18
Murlock
зачем так много? поставте флаг stretch, и этим вы растяните ваш битмап на весь canvas. после установки на окно обоих картинок, меньшую следует двигать её свойством top.

Re: Управление изображением на мониторе через COM порт

Добавлено: Сб янв 01, 2011 23:47:08
FRIM@N
поставте флаг stretch
там 2 значения тру и фальш--при обоих она остается меньше окна формы
меньшую следует двигать её свойством top.
двигать можно и мышкой но точность маленькая(( а каким свойством ее сдвинуть по горизонтали?

Re: Управление изображением на мониторе через COM порт

Добавлено: Сб янв 01, 2011 23:59:40
Murlock
при установке флага stretch в тру картинка растягивается до размеров рамки картинки.
по горигонтали картингка двигается её свойством left

Re: Управление изображением на мониторе через COM порт

Добавлено: Вс янв 02, 2011 00:24:01
FRIM@N
а можно сделать так что бы картинка вставала по окну формы после запуска
взависимости от его размеров?

Re: Управление изображением на мониторе через COM порт

Добавлено: Вс янв 02, 2011 13:03:14
Murlock
у рамки рисунка есть свойство anchors содержащее 4 компонента. установите их все в тру, и будет.

Re: Управление изображением на мониторе через COM порт

Добавлено: Вс янв 02, 2011 16:09:34
FRIM@N
почти получилось,у меня после запуска картинка не влезала в монитор если развернуть окно формы --появлялась прокрутка ,после изменения anchors все получилось но несоразмерно изменялся лифт и дом,у лифта я этот параметр тоже менял,вернул все на место прокрутка исчезла волшебным образом :)))

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

Код: Выделить всё

procedure TForm1.tmr1Timer(Sender: TObject);
begin
   y:=y+shx;//текущая координата + шаг

if y>500 then shx:=shx*-1;// ограничение справа \\\зачем эти ограничения может их убрать?

if y<0 then shx:=shx*-1;//ограничение слева

img1.Canvas.Draw(0,0,Dom);//возобновление фона

img2.Canvas.Draw(y,60,lift);//движение корабля \\\\цифра 60 это начальные координаты?тогда почему  только 1 цифра ?

end;


Re: Управление изображением на мониторе через COM порт

Добавлено: Пн янв 03, 2011 11:45:05
Murlock
первая цифра -у вас называется y и Вы её меняете, хотя она описывает координату X. и у Вас она менняться не должна
вторая цифра - 60 это положение по Y она у Вас не меняется, а нужно менять её.
двигать canvas внутри рамки рисунка - некошерно. лучше меняйте img2.top это работает коректнее. шаг движения вычисляется из относительных размеров рисунков(img1.High и img2.High )

Re: Управление изображением на мониторе через COM порт

Добавлено: Пн янв 03, 2011 18:24:01
FRIM@N
он встает на первом же top а если применить анимацию в виде AVI файла ее размеры тоже можно будет растаскивать по форме?старт \стоп с нужных кадров?

Код: Выделить всё



interface



uses

  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

  ExtCtrls;



type

  TForm1 = class(TForm)
    img1: TImage;
    img2: TImage;
    tmr1: TTimer;

    procedure FormCreate(Sender: TObject);
    procedure Tmr1Timer(Sender: TObject);
  

  private

    { Private declarations }

  public

    { Public declarations }

  end;

//Îïèñàíèå òèïîâ ïåðåìåííûõ

var

  Form1: TForm1;

  Dom:tbitmap;//ÃÐÀÔÈ×ÅÑÊÈÉ ÎÁÐÀÇ äîìà

  lift:TBITMAP;//ÃÐÀÔÈ×ÅÑÊÈÉ ÎÁÐÀÇ ëèôòà

  y:integer;//êîîðäèíàòû y ëèôòà

  shx:integer;//Øàã äâèæåíèÿ ëèôòà  ïî y
  



implementation



{$R *.DFM}



//Ñòàðò ãëàâíîé ôîðìû

procedure TForm1.FormCreate(Sender: TObject);

begin

shx:=6;

//

Dom:=tbitmap.Create;//

lift:=tbitmap.Create;//

//
Dom.LoadFromFile('Dom.bmp');//Çàãðóçèòü â ïåðåìåííóþ 'Dom' ôàéë  'Dom.bmp'

//

lift.LoadFromFile('lift.bmp');//Çàãðóçèòü â ïåðåìåííóþ 'lift' ôàéë  'lift.bmp'
//

img1.top.Draw(0,0,Dom);//

img2.top.Draw(60,x,lift);//

end;


//Ðàáîòà òàéìåðà äâèæåíèå ëèôòà

procedure TForm1.tmr1Timer(Sender: TObject);
begin
   y:=y+shx;//òåêóùàÿ êîîðäèíàòà + øàã

if y>500 then shx:=shx*-1;// îãðàíè÷åíèå ñïðàâà

if y<0 then shx:=shx*-1;//îãðàíè÷åíèå ñëåâà

img1.top.Draw(0,0,Dom);//âîçîáíîâëåíèå ôîíà

img2.top.Draw(60,x,lift);//äâèæåíèå êîðàáëÿ

end;

end.