Проблема такая:
У меня есть ScrollBox1 и в нем Image1 и куча динамически созданных Shape. Когда я все это строю, я прописываю Shape1.left:=Image1.left+ля-ля-ля...
А потом у меня идет перемещение этих шейпчиков через drag-and-drop. Так вот когда я их перемещаю, они перемещаются нормально, но меняются координаты Image1...Они становятся отрицательными...и меняются соответственно координаты шейпов...(тоже становятся отрицательными). Подскажите пжлста почему так происходит и как это исправить?
Еще одна проблема с TShape
Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду
- Игорь Акопян
- Сообщения: 1440
- Зарегистрирован: 13 окт 2004, 17:11
- Откуда: СПБ
- Контактная информация:
в какой момент меняются координаты Image1? при передвижении Shape'ов? Код изменения координат - в студию

//здесь я поместила 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;
Почему-то он иногда выдает отрицательные значения у шейпчика...Хотя рисует все там, где надо...
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;
Почему-то он иногда выдает отрицательные значения у шейпчика...Хотя рисует все там, где надо...