|
Вопрос # 1 327/ вопрос открыт / |
|
Здравствуйте, уважаемые эксперты!
Создан компонент который необходимо перемещать мышкой в рантайме. Компоненты создаются динамически на любом визуальном компоненте, в часности TabSheet (некий вариант дизайнера).
Есть-ли возможность отследить положение перемещенного компонента? (без написания следящего родителя и/или перебора всех компонентов)
 |
Вопрос задал: Тарасов Андрей (статус: Посетитель)
Вопрос отправлен: 10 февраля 2008, 14:32
Состояние вопроса: открыт, ответов: 2.
|
Ответ #1. Отвечает эксперт: Вадим К
Здравствуйте, Тарасов Андрей!
Вы же компонент перетаскиваете, так? значит вы знаете, кого перетаскиваете. Иначе непонятно.
Теперь дальше. Если не хочеться делать перебор всех компонентов в поисках нужного, можно сделать так.
при создании компонента заполнять свойство Name. Но с одним условием - имя должно быть уникальным в пределах одного родителя. Если у вас они создаются и удаляются, то можно завести глобальный счётчик, который будет увеличиваться на 1 при каждом новом созданном компоненте, а имя заполнять где то так
comp.name := 'MyComp'+inttostr(counter);
Но по этому имени нельзя обратиться напрямую, но можно найти компонент. Это просто. Нужен код следующего вида
тип_компонента(родитель.FindControl('имя'))
если в процедуре обработки с этим компонентом предстоит много работы и не хочеться писать каждый раз такую длиную "портянку" (наверно это и напугало вас), то можно просто обявить переменную нужного типа (для многих случаев достаточно переменную типа TControl). И код будет выглядеть где то так
var a:TControl;
begin
a := PageControl1.FindControl('MyComp'+inttostr(i));
if a.ClassName = 'TButton' then TButton(a).Caption := 'Другой';
 |
Ответ отправил: Вадим К (статус: Академик)
Время отправки: 10 февраля 2008, 20:57
Оценка за ответ: 3
Комментарий к оценке: Не получится, компонеты создаются и удаляются динамически, к примеру
MyComp1 и MyComp22... остальные отсутсвуют, как следствие необходимость создавать список имеющихся компонентов или так-же перебирать
|
Ответ #2. Отвечает эксперт: min@y™
А не проще дописать в код компонента какое-нибуть событие? Например:
type
TMyComp = class(...)
private
...
FOnMove: TNotifyEvent;
...
published
...
property OnMove: TNotifyEvent read FOnMove write FOnMove;
...
end;
При перемещении компонента вызывать событие:
interface
type
TMyComp = class(...)
private
...
FOnMove: TNotifyEvent;
...
protected
procedure DoOnMove;
published
...
property OnMove: TNotifyEvent read FOnMove write FOnMove;
...
end;
implementation
procedure TMyComp.DoOnMove;
begin
if Assigned(FOnMove)
then FOnMove(Self);
end;
end;
Затем написать общий обработчик этого события для всех динамически создаваемых компонентов и при их создании присваивать свойству этот обработчик:
procedure CreateNewMyComp(...);
begin
with TMyComp.Create do
begin
Left:= 8;
Top:= 8;
Coption:= 'Траляля';
...
OnMove:= MyCompsOnMove;
end;
end;
procedure MyCompsOnMove(Sender: TObject);
begin
// Необходимые действия...
// Здесь главное - это указатель на экземпляр класса Sender,
// обращаться к свойствам/методам которого можно через
// приведение типов, например:
StatusBar.Panels[0].Text:= 'Перемещён объект ' + TMyComp(Sender).Caption +
'. Координаты: Top = ' + IntToStr(TMyComp(Sender).Top) +
', Left = ' + IntToStr(TMyComp(Sender).Left);
end;
По-моему, так более изящно и просто. Но своё мнение я никому не навязываю.
 |
Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 11 февраля 2008, 08:30
Оценка за ответ: 5
Комментарий к оценке: То что надо :-) Спасибо
|
Мини-форум вопроса
Мини-форум пуст.
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|