![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Привязка к графическому объекту вне зависимости от масштаба [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?