Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.08.2016, 16:05   #1
Dozent
Форумчанин
 
Регистрация: 21.05.2008
Сообщений: 495
По умолчанию Создать в рантайме перетаскиваемый компонент

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

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

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

Я кинуть 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)
Чта делать я в замешательстве!!! Подскажите пожалуйста....
Dozent вне форума Ответить с цитированием
Старый 15.08.2016, 17:44   #2
Dozent
Форумчанин
 
Регистрация: 21.05.2008
Сообщений: 495
По умолчанию

Код:
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;
Dozent вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Генерация компонентов в рантайме Mutagena Помощь студентам 8 29.11.2009 22:47
создать компонент димах Компоненты Delphi 3 14.09.2009 18:25
Смена WndProc в рантайме VVVadim Win Api 1 28.04.2009 18:16
Timer в рантайме amandra Компоненты Delphi 1 28.11.2008 01:48