freepascal.ru • Просмотр темы - Label.Parent := Image.Parent Контейнер Image
 

Label.Parent := Image.Parent Контейнер Image

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Label.Parent := Image.Parent Контейнер Image

Сообщение BIT » 17.01.2018 18:28:52

Здравствуйте как Image сделать контейнером например как Panel на котором можно размещать компоненты?
Суть такая создаю динамически Image и размещаю* на нем Label, после Image перетаскиваю мышкой в рунтиме, Image перетаскивается, а Label остается на месте.
Вообщем как их таскать вместе?

Задумка такая текст поверх картинки) Может есть другие варианты?
Рисовать думаю текст не прокатит будет стираться при перетаскивание компонента.
Код: Выделить всё
type

  { TDecorat }

  TDecorat = class
    ImageCreate: TImage;
    LabelCreate: TLabel;
    procedure DecoratorCreateComponent();
    procedure ImageCreateMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);

  private
    { Private declarations }
  public
    { Public declarations }
  end;         

implementation

uses unit1;

{ TDecorat }

procedure TDecorat.DecoratorCreateComponent();
begin

  //---  Создание Image  ---\\
  ImageCreate := TImage.Create(form1);
  ImageCreate.Parent := Form1.GroupBox2;
  ImageCreate.Picture.LoadFromFile('decoratorTextureL2UI1Button_DF_Large_Down.png');
  ImageCreate.Stretch := True;
  ImageCreate.Width := 100;
  ImageCreate.Height := 30;
  ImageCreate.Top := 100;
  ImageCreate.Left := 30;
  ImageCreate.OnMouseMove:=@ImageCreateMouseMove;

  //---  Создание Label  ---\\
  LabelCreate := TLabel.Create(ImageCreate);
  LabelCreate.Parent := ImageCreate.Parent;
  LabelCreate.Caption := 'Текст';
  LabelCreate.Font.Color := $ffffff;
  LabelCreate.Left := ImageCreate.Left   + ImageCreate.Width div 2 - LabelCreate.Width div 2;
  LabelCreate.top := ImageCreate.top + ImageCreate.Height div 2 - LabelCreate.Height div 2         
end;
 


Так таскает оба компонента но хотелось бы, что бы image был контейнером для Label
(обработчик перетаскивания компонента в другом месте там в се ок!)
Код: Выделить всё
//Передаем координаты в Label
procedure TDecorat.ImageCreateMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  LabelCreate.Left := ImageCreate.Left   + ImageCreate.Width div 2 - LabelCreate.Width div 2;
  LabelCreate.top := ImageCreate.top + ImageCreate.Height div 2 - LabelCreate.Height div 2     
end;   

Аватара пользователя
BIT
новенький
 
Сообщения: 25
Зарегистрирован: 29.12.2017 15:44:58

Re: Label.Parent := Image.Parent Контейнер Image

Сообщение LearnMagic » 18.01.2018 00:36:06

Попробуй заменить LabelCreate.Parent := ImageCreate.Parent; на LabelCreate.Parent := ImageCreate;
LearnMagic
новенький
 
Сообщения: 57
Зарегистрирован: 10.11.2016 23:13:38

Re: Label.Parent := Image.Parent Контейнер Image

Сообщение BIT » 18.01.2018 00:46:18

LearnMagic писал(а):Попробуй заменить LabelCreate.Parent := ImageCreate.Parent; на LabelCreate.Parent := ImageCreate;

Компилятор просит что бы я указал Parent по крайне мере я так думаю)
Код: Выделить всё
decorator.pas(55,36) Error: Incompatible type for arg no. 1: Got "TImage", expected "TWinControl"
Аватара пользователя
BIT
новенький
 
Сообщения: 25
Зарегистрирован: 29.12.2017 15:44:58

Re: Label.Parent := Image.Parent Контейнер Image

Сообщение sign » 18.01.2018 06:53:40

BIT писал(а): Может есть другие варианты?

Положите и Image, и Label (и всё что угодно) в контейнер (TPanel).
sign
энтузиаст
 
Сообщения: 931
Зарегистрирован: 30.08.2009 09:20:53

Re: Label.Parent := Image.Parent Контейнер Image

Сообщение LearnMagic » 18.01.2018 10:49:57

Не досмотрел :D
Воспользуйтесь AnchorSide
Код: Выделить всё
LabalCreate.AnchorSideLeft.Control := Image1;
LabalCreate.AnchorSideTop.Control := Image1;
LabelCreate.BorderSpacing.Left := 10;
LabelCreate.BorderSpacing.Top := 4;
LearnMagic
новенький
 
Сообщения: 57
Зарегистрирован: 10.11.2016 23:13:38

Re: Label.Parent := Image.Parent Контейнер Image

Сообщение BIT » 18.01.2018 11:14:20

sign писал(а):
BIT писал(а): Может есть другие варианты?

Положите и Image, и Label (и всё что угодно) в контейнер (TPanel).

Да это понятно но потом надо следить за 3 компонентами да еще и прозрачность у панели не нашел(

Добавлено спустя 3 минуты 34 секунды:
LearnMagic писал(а):Не досмотрел :D
Воспользуйтесь AnchorSide
Код: Выделить всё
LabalCreate.AnchorSideLeft.Control := Image1;
LabalCreate.AnchorSideTop.Control := Image1;
LabelCreate.BorderSpacing.Left := 10;
LabelCreate.BorderSpacing.Top := 4;

Спасибо супер все работает век живи век учись)!

Не знаю вроде глупый вопрос но как отцентрировать label по центру Image при изменения размеров Image Теперь что я делал раньше не работает)

Добавлено спустя 2 часа 24 минуты 12 секунд:
Все разобрался теперь так как я хотел)!
Код: Выделить всё
  LabelCreate := TLabel.Create(ImageCreate);
  LabelCreate.Parent := ImageCreate.Parent;
  LabelCreate.AnchorSideLeft.Control := ImageCreate;
  LabelCreate.AnchorSideTop.Control := ImageCreate;

  LabelCreate.AnchorSideLeft.Side := asrCenter;
  LabelCreate.AnchorSideTop.Side := asrCenter; 
Аватара пользователя
BIT
новенький
 
Сообщения: 25
Зарегистрирован: 29.12.2017 15:44:58

Re: Label.Parent := Image.Parent Контейнер Image

Сообщение Python » 24.01.2018 23:22:59

Лично я бы воспользовался тем же подходом, что и в TLabeledEdit. Интерфейс находится в файле extctrls.pp, реализация в lcl\include\customlabelededit.inc. То есть передвигается только основной контрол (TImage), а Label повторяет движения, но при этом элементы как таковые не связаны отношениями.
Python
новенький
 
Сообщения: 12
Зарегистрирован: 23.01.2018 21:50:17


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6

Рейтинг@Mail.ru