Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Привязка к графическому объекту вне зависимости от масштаба [D7, WinXP]


Zheksonz ©   (2008-09-26 10:17:00) 

Имеется графический объект загруженный в компонент класса TImage, его контуры обозначены компонентом класса TShape. При увеличении масштаба изображения необходимо пропорционально увеличивать Shape, что я делаю при помощи перемножения на коэффициент разницы, но при этом происходит смещение изображения относительно компонента Shape.

Я думал, что можно будет использовать тот же коэффициент, для сдвига Shape в направлении изображения, но этот вариант не сработал. Кто знает, как рашить этот вопрос, подскажите, что нужно сделать. Спасибо.


{RASkov}   (2008-09-26 13:38:00) [1]

Попробуй так:
unit Unit1;
interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls;
type
 TForm1 = class(TForm)
   Image1: TImage;
   Shape1: TShape;
   procedure FormCreate(Sender: TObject);
   procedure FormResize(Sender: TObject);
 private { Private declarations }
   StartW, StartH, SL, ST, SW, SH: Integer;
 public { Public declarations }
 end;

var Form1: TForm1;

implementation
{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 DoubleBuffered:=True;
 StartW:=Image1.Width;
 StartH:=Image1.Height;
 SL:=Shape1.Left-Image1.Left;
 ST:=Shape1.Top-Image1.Top;
 SW:=Shape1.Width;
 SH:=Shape1.Height;
end;

procedure TForm1.FormResize(Sender: TObject);
var KofW, KofH: Extended;
begin
 KofW:=Image1.Width/StartW;
 KofH:=Image1.Height/StartH;

 Shape1.Left:=Image1.Left+Round(SL*KofW);
 Shape1.Top:=Image1.Top+Round(ST*KofH);
 Shape1.Width:=Round(SW*KofW);
 Shape1.Height:=Round(SH*KofH);
end;

end.


{RASkov}   (2008-09-26 13:26:00) [2]

> [2] Zhekson   (26.09.08 10:26)

Image растянут на всю форму?
Т.е. имеет Image.Left=0, Image.Top=0, Image.Width=Width и Image.Height=Height, так?


Vlad Oshin   (2008-09-26 12:40:00) [3]


> во столько раз увеличивать Shape и во столько раз изменится
> его left

ну и тоp, естественно :), просто не дописал, надеюсь ты его тоже меняешь?
Увеличение может быть по разным осям разное
причем, надо брать иногда наоборот. 1/К.
В зависимости от того увеличивается или уменьшается

KH=image.Heght1/image.Heght2;
KW=image.Width1/image.Width2;

shape1.left:=shpe1.left*(1/KW)
shape1.top:=shape1.top*(1/KH)
shape1.Width:=shape1.Width*(1/KW)
shape1.Heght:=shape1.Heght*(1/KH)


Zhekson   (2008-09-26 12:33:00) [4]

Спасибо Влад, буду разбираться.


Vlad Oshin   (2008-09-26 12:26:00) [5]

я ручкой на бумажке прикинул - должно


Zhekson   (2008-09-26 12:25:00) [6]

я так и сделал, но результата нет... ещё раз всё перепроверю...


Vlad Oshin   (2008-09-26 12:13:00) [7]

во столько раз увеличивать Shape и во столько раз изменится его left


Zheksonz   (2008-09-26 12:04:00) [8]

предположим есть коэфициент, во сколько раз увеличил, дальше его как использовать???


Vlad Oshin   (2008-09-26 11:40:00) [9]


> Увеличил Image на 1000

не на, а в
во сколько увеличил?


Zheksonz   (2008-09-26 11:26:00) [10]

не, без поллитры не разберёшься...

установил Shape по определённым ориентирам на изображении сверху и слева... записал координаты, сверху 33 пикс., слева 64 пикс. Увеличил Image на 1000(прибавил по высоте и ширине по 1000че и растянул). установил Shape на зараее заданные ориентиры и получил сверху: было 33, стало 62; слева было 64, стало 118. Какие будут варианты???


Zhekson   (2008-09-26 10:50:00) [11]

мысля крутится, может сам разберусь... просто уже введена пара коэффициентов, которые всё время нужно учитывать...


Vlad Oshin   (2008-09-26 10:35:00) [12]

код давай, писать с 0 лень
скорее всего коэффициент подобрать можно, но не так просто


Zhekson   (2008-09-26 10:28:00) [13]

всмысле не поэтому, а вообще в нуле, а Shape обозначает контуры определённого объекта на изображении.


Zhekson   (2008-09-26 10:26:00) [14]

Забыл сказать, Shape, имеет меньший диаметр, поэтому Image всё время в нуле, по обеим осям.


Vlad Oshin   (2008-09-26 10:24:00) [15]

Shape1.Left:=image1.Left?


Наверх

Титульная страница Поиск, карта сайта Написать письмо