| 
| 
 | Вопрос # 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
 Комментарий к оценке: То что надо :-) Спасибо |  
 Мини-форум вопросаМини-форум пуст. Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |