Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Создание компонента


Автор: SerK 29.12.2009, 13:15
Добрый день,

создал свой компонент на основе имеджика, нужно сделать так, чтобы на нем была надпись.
Как вариант - думаю динамически создавать лабел, чтобы он помещался на моем компоненте.
Вопрос, как сделать так, чтобы этот лабел перемещался вместе с моим компонентом ?

Автор: sawfish 29.12.2009, 16:27
Имеджика - это TImage?
ИМХО лучше использовать TGraphicControl и в его OnDraw на его канве выводить любые надписи, которые будут (без каких-либо дополнительных усилий) перемещаться вместе с ним.

Автор: SerK 29.12.2009, 20:21
sawfish,

я ставил цель перед собою, чтобы можно было загружать рисунки любых форматов, поэтому Image подходит лучше всех, а TGraphicControl может работать только с битмапами. Нет, конечно, можно все форматы преобразовать к bmp, но тогда овчинка выделки не стоит, нужно создавать компонент аналогичный Image. А так класc TPicture в Image с этим отлично справляется.
Я тут покопался в интернете и нашел делфийский код на эту тему, да не могу его перевести.

Код

procedure TLabelEdit.WMMove(var Msg: TWMMove);

begin
  inherited;

  { заставляем TLabel 'прилипнуть' к верху TEdit }
  if FLabel <> nil then
    with FLabel do
      SetBounds(Msg.XPos, Msg.YPos - Height, Width, Height);
end;



Как перевести inherited;?

Автор: artsb 29.12.2009, 20:29
Цитата(SerK @  29.12.2009,  20:21 Найти цитируемый пост)
Как перевести inherited;? 

Это вроде вызов стандартного обработчика события.

Добавлено через 2 минуты и 12 секунд
Т.е. получается, сдвигаем сам компонент, а потом тащим то что нужно:
Код

  if(FLabel)
    FLabel->SetBounds(Msg->XPos, Msg->YPos - Height, Width, Height);


Добавлено через 4 минуты и 53 секунды
http://cppbuilder.ru/articles/0100.php

Автор: SerK 29.12.2009, 21:24
artsb,
спасибо, пол проблемы решено.

Про  inherited:

Там написано:  TForm::Dispatch(&Message);, но ведь компонент еще не на форме, поэтому TForm здесь не уместно. Как быть? Может просто - Dispatch(&Message)?

Перевод хелпа функции  Dispatch:
Вызывает управляющие методы сообщения для объектов, которые базируются на содержимом параметра Message. То есть это родительский метод?

Автор: artsb 29.12.2009, 21:55
Цитата(SerK @  29.12.2009,  21:24 Найти цитируемый пост)
То есть это родительский метод? 

Ага.
Может попробовать:
Код

TImage::Dispatch(&Message);

Автор: SerK 30.12.2009, 00:13
artsb,
попробую, спасибо.

Автор: SerK 3.1.2010, 10:34
WMMove(var Msg: TWMMove) работает только для оконных компонентов, поэтому мой вариант не подходит. Нужно за основу брать TCustomControl.

Автор: artsb 3.1.2010, 17:28
Ну вы же обрабатываете это событие у своего компонента, а метку просто тащите за собой. Или я что-то не так понял...

Автор: SerK 16.1.2010, 03:33
artsb,
Проблема в том, что метка закрывает собою оконный компонент (родителя), на котором находится, поэтому не знаю как обработать сообщеня мыши.

Автор: artsb 16.1.2010, 12:14
Не знаю конечно... Но что если при создании метки, назначать её родителем не ваш компонент, а родителя вашего компонента (т.е. myLabel->Parent = this->Parent)? Тогда метка будет за пределами вашего компоненте, но вы сможете ей управлять. Сам я этого не проверял smile Но теоретически, должно работать. Если попробуете, отпишитесь потом.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)