Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.08.2010, 08:23   #1
dmitriegorovih
Ещё не
Форумчанин
 
Аватар для dmitriegorovih
 
Регистрация: 04.01.2010
Сообщений: 517
По умолчанию Липкие обьекты

Всем Доброго Утра! В общем я похожий вопрос уже задавал у меня есть некие продвижения но я думаю это не то. Как можно сделать эффект липких объектов?
Воображение важнее, чем знания. (Albert Einstein)
dmitriegorovih вне форума Ответить с цитированием
Старый 31.08.2010, 08:32   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Самое банальное обрабатывать WM_MOVE и WM_MOVING.
Вопрос только в том к чему эти прилипалы должны липнуть.
Или вотъ: http://www.delphiworld.narod.ru/base...y_windows.html
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 31.08.2010, 08:52   #3
dmitriegorovih
Ещё не
Форумчанин
 
Аватар для dmitriegorovih
 
Регистрация: 04.01.2010
Сообщений: 517
По умолчанию

Цитата:
Самое банальное обрабатывать WM_MOVE и WM_MOVING
Да это понятно, а вот как сделать прилипание например image(ов) друг другу?
Воображение важнее, чем знания. (Albert Einstein)
dmitriegorovih вне форума Ответить с цитированием
Старый 31.08.2010, 12:25   #4
krGorka
Пользователь
 
Регистрация: 26.04.2010
Сообщений: 35
По умолчанию

А нельзя ли просто, зная координаты одного image , вычислять координаты следующего .Конечно нужно знать, как должен изначально "прилипнуть" следующий относительно первого.При перетаскивании по клику мыши определять -какой компонент выделен , куда он перетащен- новые координаты. Пересчитать координаты остальных компонентов и сделать перерисовку формы.
krGorka вне форума Ответить с цитированием
Старый 31.08.2010, 12:47   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
При перетаскивании
Во во. Вот тут и назревает вопрос - каким методом перетаскивать. Не все пригодны для интерактивного прилепания.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 31.08.2010, 13:33   #6
dmitriegorovih
Ещё не
Форумчанин
 
Аватар для dmitriegorovih
 
Регистрация: 04.01.2010
Сообщений: 517
По умолчанию

Вот смотрите как я делал перетаскивание окна

а потом на примере вот этого хотел перетаскивать и "приклеивать" image(ы)
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
   b,b2:boolean;
   x2,y2,x3,x4:integer;
implementation

{$R *.dfm}

{ TForm1 }


procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
b:=true;
x2:=x;
y2:=y;
x3:=x;
x4:=x-15;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
if b=true then begin
left:=left+(x-x2);
top:=top+(y-y2);
label1.Caption:=inttostr(x4);
label2.Caption:=inttostr(x);
if left<=15 then begin
if left>=-15 then begin
x2:=x2+left;
b2:=true;
left:=0;
end;
end;
if b2=true then begin
if x-15>=x3 then begin
left:=16;
x2:=x2-16;
b2:=false
end;
end;
if b2=true then begin
if x<=x4 then begin
left:=-16;
x2:=x2+16;
b2:=false
end;
end;
end;
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
b:=false
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
form1.DoubleBuffered:=true;
end;
подглючивает немножко
Воображение важнее, чем знания. (Albert Einstein)
dmitriegorovih вне форума Ответить с цитированием
Старый 31.08.2010, 13:55   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я тебе подскажу каким путем пойтить:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;

type
  TForm1 = class(TForm)
    Image1: TImage;
    Image2: TImage;
    procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var   pt:TPoint;
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  pt:=TImage(Sender).ClientToScreen(Point(x,y));
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var cx2,cx,pt2:TPoint;i:integer;
begin
  if (pt.X>0)and(pt.Y>0) then begin
    pt2:=TImage(Sender).ClientToScreen(Point(x,y));
    TImage(Sender).Left:=TImage(Sender).Left+(pt2.X-pt.X);
    TImage(Sender).Top:=TImage(Sender).Top+(pt2.y-pt.y);
    pt:=pt2;
    cx.X:=TImage(Sender).Left+TImage(Sender).Width div 2;
    cx.y:=TImage(Sender).Top+TImage(Sender).Height div 2;

    for i := 0 to ControlCount - 1 do begin
     if (Controls[i] is TImage)and(Controls[i]<>sender) then begin
       with TImage(Controls[i]) do begin
        cx2.X:=Left+Width div 2;
        cx2.y:=Top+Height div 2;
        if sqrt(sqr(abs(cx.X-cx2.X))+sqr(abs(cx.y-cx2.y)))<10 then
         TImage(Sender).Left:=Left+Width;
       end;
     end;
    end;

  end;
end;

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  pt.X:=-666;pt.y:=-666;
end;

end.
Особо код не доводил до совершенства.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 31.08.2010, 14:06   #8
dmitriegorovih
Ещё не
Форумчанин
 
Аватар для dmitriegorovih
 
Регистрация: 04.01.2010
Сообщений: 517
По умолчанию

Цитата:
Код:
if sqrt(sqr(abs(cx.X-cx2.X))+sqr(abs(cx.y-cx2.y)))<10 then
         TImage(Sender).Left:=Left+Width;
Я чучуть не догоняю вот эта строчка перемещает image когда изображения совмещены вместе я правильно понимаю?
Воображение важнее, чем знания. (Albert Einstein)
dmitriegorovih вне форума Ответить с цитированием
Старый 31.08.2010, 14:37   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
вот эта строчка
Это теорема Пифагора. Если расстояние от центров рисунков менее 10 то прилипить.
Она здесь недоделана, но смысл сам - вычислять расстояние именно так.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 31.08.2010, 15:16   #10
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,596
По умолчанию

sqr(abs(...))
abs лишний.
Arigato вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рисуем обьекты, тоесть я этого не могу((( prouser Общие вопросы C/C++ 2 28.04.2010 10:26
GroupBox обьекты над ним KoBRaAndrey Общие вопросы Delphi 5 30.10.2009 12:43
Обьекты при компиляции prod87 Общие вопросы Delphi 4 28.10.2009 00:37
липкие окна NieL Общие вопросы Delphi 6 02.02.2009 14:42
Как сделать липкие окошки??? lionman Общие вопросы Delphi 1 07.11.2008 20:53