Перейти к содержанию
Fire Monkey от А до Я
  • 0

Создать в рантайме перетаскиваемый компонент


Dozent

Вопрос

Вообщем столкнулся с такой бедой и не знаю как решить!

Мне нужно сделать в какой-то контейнер накидать лайауты, кнопки, имейджи, лейблы и тд.

Потом нужно чтобы это всё можно было таскать по скролбоксу и создавать копию такого же контейнера! Казалось бы всё можно сделать но тут я в тупике, почему? 

Я кинуть TCalloutRectangle на форму в нём расположил как мне нужно элементы и научил его двигаться в скролбоксе!! Сижу я тут такой радуюсь смотрю на код)

procedure TForm1.crtPhaseMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
begin
  zX := X;
  zY := Y;
  zIsDragging := true;
  (Sender as TControl).BringToFront;
  (Sender as TShape).Fill.Color := TAlphaColorRec.Lightblue;
  (Sender as TShape).Root.Captured := (Sender as TShape);
end;

procedure TForm1.crtPhaseMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Single);
begin
  if zIsDragging and (ssLeft in Shift) then
  begin
    (Sender as TControl).Position.X := (Sender as TControl).Position.X + X - zX;
    (Sender as TControl).Position.Y := (Sender as TControl).Position.Y + Y - zY;
    // (Sender as TShape).Fill
  end;
end;

Потом такой же радостный беру и копирую код из другого проекта где у меня прекрасно создавались копии накиданные мной .

procedure TForm1.Button1Click(Sender: TObject);
var
  Layout: TButton;
begin
  Layout := TButton.Create(GridLayout1);
  Layout.Parent := GridLayout1;
  Layout.StyleLookup := 'MainStyle3';
  Layout.Position.X := Layout1.Position.X + 10;
  Layout.Position.Y := Layout1.Position.Y + 10;
  Layout.Visible := true;
  GridLayout1.Height := GridLayout1.Height + Layout.Height;

end;

Сижу и думаю вот контрол сделал он по форме таскается круто шас ещё и научу его многожить)))

Но тут горячая обезьянка подкидывает сурпрайз)

У TCalloutRectangle  и ему подобным нет свойства LoockupStyle. А это значит что стиль я ему предать не могу) Но он хорошо передвигается по форме)

Ок делаю кнопку он вроде как стиль применяет, корява но это возмно мой касяк) Но он не передвигается по форме, а при клике по нему выдаёт ошибку

 

First chance exception at $773ADAE8. Exception class EInvalidCast with message 'Invalid class typecast'. Process RPScenarioEditor.exe (4084)

Чта делать я в замешательстве!!! Подскажите пожалуйста....

Ссылка на комментарий

Рекомендуемые сообщения

  • 0
28 минут назад, Dozent сказал:

Ок делаю кнопку он вроде как стиль применяет

1). Что значит "применяет стиль"? TCalloutRectangle (как и TShape) не являются стилизованными объектами. Соответственно, понятие "стиль" (в контексте FMX) к ним не относится. 
Если нужен стилизованный объект, используйте TCalloutPanel.
2). TButton не является TShape, поэтому возможно из-за этого ошибка преобразования класса (Sender as TShape).
По приведенным фрагментам не понятно, что откуда вызывается. Приложите рабочий пример (п.2.2.5).

Ссылка на комментарий
  • 2
procedure TForm1.Label7Click(Sender: TObject);
var
  Phase: TCalloutRectangle;
begin
  Phase := crtPhase.Clone(ScrollBox1) as TCalloutRectangle;
  Phase.OnMouseDown := crtPhaseMouseDown;
  Phase.OnMouseMove := crtPhaseMouseMove;
  Phase.Parent := ScrollBox1;
  Phase.Position.X := crtPhase.Position.X + 10;
  Phase.Position.Y := crtPhase.Position.Y + 10;
  Phase.Visible := true;
end;

Замените у себя эту процедуру и удалите Button1 (как я и сказал выше, TButton не является TShape - поэтому и ошибка).

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...