Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как перетаскивать компоненты в Run-Time? 
:(
    Опции темы
Гость_Nik
Дата 27.1.2005, 14:12 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Нашел такой вот совет:

"Возьмите форму, бросьте на нее панель, на onMouseDown панели прицепите код:

procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
ReleaseCapture;
Panel1.Perform(WM_SYSCOMMAND, $F012, 0);
end;

Теперь в run-time панель можно таскать как в дизайне... "

Сделал. И действительно - панельку можно тягать мышкой без проблем. А тот же самый код, но с
TShape не работает. Ни в какую. Помогите чайнику!?
Мне нужно перемещать по мышкой разные геометрические фигуры. Хотя бы для начала простые(круг, квадрат и т.д.).Во время перемещения фигуры должны полностью прорисовываться.
Можно ли для этого использовать какие-нибудь готовые компоненты? И какие если они есть?
С TShape у меня это не получается! smile

  Вверх
Snowy
Дата 27.1.2005, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 18
Всего: 484



Зачем изобретать велосипед?
У Shape выставляешь свойство DragMode в автоматическое, затем пишешь 2 события:
Код

procedure TForm1.FormDragOver(Sender, Source: TObject; X, Y: Integer;
 State: TDragState; var Accept: Boolean);
begin
 Accept:=true;
end;

procedure TForm1.FormDragDrop(Sender, Source: TObject; X, Y: Integer);
begin
 TControl(source).Top:=y; TControl(source).Left:=x;
end;

PM MAIL   Вверх
p0s0l
Дата 27.1.2005, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 16
Всего: 112



Если пользовать готовым Drag'ом, то при перемещении просто курсор сменится... Если же надо, чтобы при перетаскивании таскался и сам компонент, то либо нужно в OnDragOver поставить перемещение Source (+ еще небольшие доработки), либо же два других способа:
1)
Самое простое - поместить TShape в TPanel, у TPanel убрать Caption и сделать плоским, тогда Perform делай не у TShape, а у TPanel... Этот способ плох тем, что TPanel непрозрачный... Зато самый простой smile

2)
Немного другой способ - это обрабатывать событие OnMouseMove у TShape. Отличие в том, что мышь не будет ограничена в своём перемещении... Если что, то можно сделать проверку выхода TShape за границы формы...
Код
var
 LastPos : TPoint; // просто глоб. переменная

procedure TForm1.Shape2MouseMove(Sender: TObject; Shift: TShiftState; X,
 Y: Integer);
begin
 with TControl(Sender) do
 begin
   if ssLeft in Shift then
     SetBounds(Left + (Mouse.CursorPos.X - LastPos.X), Top + (Mouse.CursorPos.Y - LastPos.Y), Width, Height);
   LastPos := Mouse.CursorPos;
 end;
end;
(это событие можешь назначить любым контролам, не только TShape, но и TImage, TPanel к примеру...)



--------------------
С уважением, г-н Посол.
PM   Вверх
SteelHat
Дата 28.1.2005, 08:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 27.1.2005

Репутация: нет
Всего: нет



Спасибо за ответы. Сейчас буду разбираться.
PM MAIL   Вверх
SteelHat
Дата 28.1.2005, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 27.1.2005

Репутация: нет
Всего: нет



Протяни человеку руку помощи он её по локоть и откусит smile.
Сделал как советовали. Получилось. Но smile ...
При перемещении фигура прорисовывается с "помехами". По ней пробегают заметные полосы. А это совсем плохо.
Объясню, что я хочу сделать:
Мне нужна программа для тренировки зрения. На черном фоне помещаются набор фигур. Красного и синего цвета. Одеваются очки с красным и синим стеклами. Из этих фигур необходимо собрать заданный рисунок.
Это программа для тренировки бинокулярного зрения.
Ключевая проблема для меня это то самое перемещения фигурю.
Всю остальную "обвязку" (менюшки, набор рисунков, проверки на совмещения фигур, обработка и выдача результатов) я сделаю.
Нужен совет!
smile
PM MAIL   Вверх
p0s0l
Дата 28.1.2005, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 16
Всего: 112



Попробуй поставить свойство DoubleBuffered := true у того контрола, по которому перемещается фигурка (напр. Form1.DoubleBuffered := true;)...



--------------------
С уважением, г-н Посол.
PM   Вверх
SteelHat
Дата 28.1.2005, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 27.1.2005

Репутация: нет
Всего: нет



Ура! Заработало! Спасибо за помощь! smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.0565 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.