Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 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

Комментарий к оценке: То что надо :-) Спасибо

Мини-форум вопроса

Мини-форум пуст.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:52
Выполнено за 0.03 сек.