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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.05.2011, 16:41   #1
kaizer131
Пользователь
 
Регистрация: 21.03.2009
Сообщений: 52
По умолчанию перетаскивание динамически созданных объектов

Подскажите как реализовать перетаскивание мышью динамически созданных объектов?
есть процедура, нормально осуществляющая перетаскивание статично созданного объекта
Код:
procedure Tfrm_Main.drag_Terminal;
const
  SC_DragMove = $F012;
begin
  begin
  ReleaseCapture;
  Panel1.Perform(WM_SysCommand, SC_DragMove, 0);
  end;
end;
но она отказывается навешиваться на динамические объекты
Код:
gr_Term.OnMouseDown:=drag_Terminal(self);
Вопрос 1
Почему, в этой строке возникает ошибка
[DCC Error] main.pas(97): E2010 Incompatible types: 'TMouseEvent' and 'procedure, untyped pointer or untyped parameter'

Вопрос 2
Как в строке
Код:
 Panel1.Perform(WM_SysCommand, SC_DragMove, 0);
отправить сообщение о переносе именно тому объекту на котором была нажата левая кнопка мыши?
Движение - жизнь. Остановка - ... ?
kaizer131 вне форума Ответить с цитированием
Старый 14.05.2011, 18:51   #2
niki2012
Пользователь
 
Аватар для niki2012
 
Регистрация: 03.01.2011
Сообщений: 64
По умолчанию

1. Процедуру надо задать в виде procedure xxx(Sender as Тип_объекта), тогда можно будет вызывать ее от объекта.
2. Чтобы использовать в процедуре объект, вызвавший ее, используйте (sender as тип_объекта).left и т.п.
Программист - это не тот, кто пишет программы, а тот, чьи программы работают.
niki2012 вне форума Ответить с цитированием
Старый 14.05.2011, 19:11   #3
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

вообще надо писать так, как написано в справке по 'TMouseEvent' и там будет написано полное объявление, вот такое
Код:
TMouseEvent = procedure (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer) of object;
phomm вне форума Ответить с цитированием
Старый 14.05.2011, 19:14   #4
kaizer131
Пользователь
 
Регистрация: 21.03.2009
Сообщений: 52
По умолчанию

Если писать так
Код:
procedure drag_Terminal(Sender as TObject);
ругается на as
Движение - жизнь. Остановка - ... ?
kaizer131 вне форума Ответить с цитированием
Старый 14.05.2011, 19:20   #5
kaizer131
Пользователь
 
Регистрация: 21.03.2009
Сообщений: 52
По умолчанию

Цитата:
Сообщение от phomm Посмотреть сообщение
вообще надо писать так, как написано в справке по 'TMouseEvent' и там будет написано полное объявление, вот такое
Код:
TMouseEvent = procedure (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer) of object;
Не совсем понял куда это писать и почему процедура безымянная , такое в Delphi допустимо ?
Движение - жизнь. Остановка - ... ?
kaizer131 вне форума Ответить с цитированием
Старый 14.05.2011, 19:37   #6
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

фейспалм...
Код:
procedure drag_Terminal(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer) of object;
это Вам для объявления процедуры.
а то , что в справке, это конечно же объявление процедурного типа

Последний раз редактировалось phomm; 14.05.2011 в 19:39.
phomm вне форума Ответить с цитированием
Старый 14.05.2011, 19:54   #7
kaizer131
Пользователь
 
Регистрация: 21.03.2009
Сообщений: 52
По умолчанию

Что то я в тупике ....
Нашёл свой старый код. Вот последовательность инициализации и присвоения
Код:
procedure myonClick3 (Sender: TObject);

procedure Tround1.myonClick3(Sender: TObject);
begin
……….
end;

// объекты а генерились в run-time
a.OnClick:=myOnclick3;
И всё там работало ...
Но насколько помню он написан был в 2007 делфе а сейчас работаю в 2009.
И такой подход не сработал...
Движение - жизнь. Остановка - ... ?
kaizer131 вне форума Ответить с цитированием
Старый 14.05.2011, 19:55   #8
kaizer131
Пользователь
 
Регистрация: 21.03.2009
Сообщений: 52
По умолчанию

Цитата:
Сообщение от phomm Посмотреть сообщение
фейспалм...
Код:
procedure drag_Terminal(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer) of object;
это Вам для объявления процедуры.
а то , что в справке, это конечно же объявление процедурного типа
Ругается на of object
Движение - жизнь. Остановка - ... ?
kaizer131 вне форума Ответить с цитированием
Старый 14.05.2011, 20:42   #9
kaizer131
Пользователь
 
Регистрация: 21.03.2009
Сообщений: 52
По умолчанию

С процедурой вроде разобрался
Теперь вопрос можно ли получить объект по имени и назначить конкретно ему обработчик?
Поясню объекты gr_Term создаются динамически при двойном нажатии на панель,
соответственно каждому из них назначаю имя и tag.
Код:
gr_Term.Tag:=term_Index;
gr_Term.Name:='Ter'+InttoStr(term_Index);
term_Index тип integer увеличивающаяся на единицу, с каждым созданным объектом.
как мне теперь назначать на них обработчики при создании?
Понятно что будет выглядеть как то так
Код:
gr_Term.OnMouseDown:=drag_Terminal ;
но как сделать чтобы OnMouseDown навешивалась именно на созданную gr_Term.
что то типа
Код:
gr_Term['индекс tag'].OnMouseDown:=drag_Terminal ;
или
Код:
gr_Term.getName('Ter1').OnMouseDown:=drag_Terminal ;
Движение - жизнь. Остановка - ... ?
kaizer131 вне форума Ответить с цитированием
Старый 14.05.2011, 20:48   #10
kaizer131
Пользователь
 
Регистрация: 21.03.2009
Сообщений: 52
По умолчанию

Может быть создавать массив gr_Term?
Движение - жизнь. Остановка - ... ?
kaizer131 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сохранение динамически созданных объектов Marsel737 Общие вопросы Delphi 25 15.12.2009 14:24
Свойства динамически созданных объектов. Dorithur Общие вопросы Delphi 4 12.12.2009 15:35
Обработка событий динамически созданных объектов в С++ Builder Shafty Помощь студентам 1 26.02.2009 16:11
Метка в динамически созданных пунктах MainMenu Alter Компоненты Delphi 4 30.06.2008 22:51