Страница 1 из 1

Еще одна проблема с TShape

Добавлено: 29 апр 2005, 13:45
kati
Проблема такая:
У меня есть ScrollBox1 и в нем Image1 и куча динамически созданных Shape. Когда я все это строю, я прописываю Shape1.left:=Image1.left+ля-ля-ля...
А потом у меня идет перемещение этих шейпчиков через drag-and-drop. Так вот когда я их перемещаю, они перемещаются нормально, но меняются координаты Image1...Они становятся отрицательными...и меняются соответственно координаты шейпов...(тоже становятся отрицательными). Подскажите пжлста почему так происходит и как это исправить?

Добавлено: 29 апр 2005, 14:47
Игорь Акопян
в какой момент меняются координаты Image1? при передвижении Shape'ов? Код изменения координат - в студию

Добавлено: 29 апр 2005, 15:33
kati
//здесь я поместила drag-and-drop
procedure TForm1.ScrollBox1StartDrag(Sender: TObject;
var DragObject: TDragObject);
begin
//это я делаю, чтобы запомнить координату, когда мы только схватили шейпчик
xxn:=-1;
end;


procedure TForm1.ScrollBox1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
Accept:=false;
//если мы перетаскиваем шейпчик, то
if (source is TShape) then
begin
//если мы только взяли его, то запоминаем координату...
//эта координата будет относительно шейпчика
if xxn=-1 then xxn:=x;
Accept:=True;
//а это мы определяем какой именно шейпчик взяли
ss:=(FindComponent(TShape(source).Name) as TShape).Name;
delete(ss,1,6);
end;
end;

procedure TForm1.ScrollBox1DragDrop(Sender, Source: TObject; X,
Y: Integer);
begin
//если мы поставили курсор мыши на шейпчик, то координаты будут такие:
if (Sender is TShape) then xn:=ScrollBox1.left+TShape(sender).Left+x
//а если не на шейпчике, то бишь на скроллбоксе, то такие:
else xn:=ScrollBox1.left+x;
//то есть мы привели к одной с-ме координат...
//а теперь из этой координаты вычтем ту, что запомнили в начале...т.е. если мы взяли шейпчик на его середине, то когда поставим его куда-то, это должна быть середина...
xn:=xn-xxn;
//а теперь переприсваиваем координаты шейпчику
(FindComponent('prich_'+ss) as TShape).Left:=ScrollBox1.left+xn;
end;

Почему-то он иногда выдает отрицательные значения у шейпчика...Хотя рисует все там, где надо...