Комбинированный визуальный компонент

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

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

Комбинированный визуальный компонент

Сообщение qivi » 20.01.2015 11:01:40

Хотелось бы создать комбинированный визуальный компонент который может иметь потомков, но что бы родителем потомков становился не сам компонент, а встроенная в него для этих целей панель.
То есть допустим я наследую свой компонент от TCustomControl, далее внутри этого компонента объявляю кнопку, заголовок и встроенную панель, их я создаю в конструкторе своего компонента и располагаю на нём.

Если я определю свойство своего компонента иметь потомков ControlStyle:=[csAcceptsControls], эти потомки будут ложиться именно на мой компонент а не на встроенную панель, смогут перекрывать кнопку и заголовок...

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

Прилагаю пример:
KMK.zip
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

Re: Комбинированный визуальный компонент

Сообщение iN0k » 20.01.2015 12:23:52

свойство Parent.
Код: Выделить всё
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
  StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Panel1: TPanel;
    procedure Button1Click(Sender: TObject);
  private
    tstButton: TButton;
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
    tstButton:=TButton.Create(Self); //< кто владелей сомпанента (чье удаление приведет к уничтожению tstButton)
    tstButton.Parent:=Panel1;        //< "на ком лежим"
end;

end.
iN0k
постоялец
 
Сообщения: 146
Зарегистрирован: 18.07.2012 14:09:50

Re: Комбинированный визуальный компонент

Сообщение qivi » 20.01.2015 12:59:43

iN0k писал(а):свойство Parent.

Нет, ты меня не понял. Я создаю компонент, который компилирую и устанавливаю в Лазарус, потом перенашу мышкой его на форму, и хочу на него помещать другие компоненты, но что бы они оказывались не на самом компоненте, а на встроенной в него панели. Как это сделать?
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

Re: Комбинированный визуальный компонент

Сообщение Лекс Айрин » 20.01.2015 13:11:50

qivi, тебе же сказали -- свойство Parent.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Комбинированный визуальный компонент

Сообщение qivi » 20.01.2015 13:25:27

Ну тогда я не понял, можно поразвёрнутее?

Нет, не понял что имеется в виду на счёт парента, практически уверен что Вы не поняли сути вопроса. Откройте мой пример, откомпилируйте, вот он комбинированный компонент в сборе (TMKPanelSvitok), ложим его в режиме дизайнера на форму, в нём (если заглянете в код) есть панель которая может иметь потомков... как теперь на эту встроенную панель в режиме дизайнера положить любые другие контролы?
Последний раз редактировалось qivi 20.01.2015 13:45:42, всего редактировалось 1 раз.
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

Re: Комбинированный визуальный компонент

Сообщение iN0k » 20.01.2015 13:39:12

Лекс Айрин писал(а): тебе же сказали -- свойство Parent

ну это то понятно ...

вот прикрутил ...
Код: Выделить всё
procedure TMKPanelSvitok.ChildHandlesCreated; //override;// called after children handles are created
var i:integer;
begin
    for i:=self.ControlCount-1 downto 0 do begin
        if (self.Controls[i]<>Z) and (self.Controls[i]<>SB) and (self.Controls[i]<>P) then begin
            self.Controls[i].Parent:=p;
        end;
    end;
end;

но эта фигня работает при запуске, но не работает в дизайнере ...

методы связанные со вставкой "детей" для overrid я чет не нашел ...
iN0k
постоялец
 
Сообщения: 146
Зарегистрирован: 18.07.2012 14:09:50

Re: Комбинированный визуальный компонент

Сообщение qivi » 20.01.2015 14:14:52

iN0k спасибо за совет. Это уже интересно.

Я пытался чего ни будь подглядеть в табах и групбоксе... :( но ничего не разобрал...

Кто ни будь ещё может подсказать как это довести доконца?
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

Re: Комбинированный визуальный компонент

Сообщение Лекс Айрин » 20.01.2015 17:04:56

qivi, в дизайнере есть, в подручном меню, пункт "Сменить родителя".

Я не знаю, в чем трабла, но у меня совершенно спокойно отрабатывает код:

Код: Выделить всё
FontItalic.Parent:=Panel4;

Все прекрасно перемещается!!! Единственное, что чекбокс располагается не в том месте где я хотел, но не думаю, что это сильно затруднительно решить.

Тем более, что имя панели Вам известно при использовании Вашего компонента.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Комбинированный визуальный компонент

Сообщение qivi » 20.01.2015 18:24:44

Лекс Айрин, вы загляните в мой пример и компильните его, вы совсем не о том говорите.
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

Re: Комбинированный визуальный компонент

Сообщение iN0k » 20.01.2015 21:58:06

кстати ... таки нашел:
procedure TWinControl.InsertControl(AControl: TControl; Index: integer); virtual;
сделал его аналогично примеру выше ...
ну ... оно работает ... и в редакторе и в рантайме
но опять косяк (проясняющий причины и направления) ... в дизайнТайме, Object Inspektor, Companents tree ... кароче, он НЕ отображает внутреннюю структуру вашего компонента, и ВСЕ что лежит на внутренней панели тоже не покажет :-(

то есть наверно два варианта:
1. как в табах с дополнительным компонентом аля tPage
2. ручная отрисовка гарницы, заголовка и кнопки как в ГроупБох
iN0k
постоялец
 
Сообщения: 146
Зарегистрирован: 18.07.2012 14:09:50

Re: Комбинированный визуальный компонент

Сообщение qivi » 21.01.2015 11:22:16

iN0k огромное тебе спасибо. Сам так глубоко ЛЦЛ не знаю.
Что то не даётся желаемый вариант, попробую по другому, немного попроще сделать.
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия


Вернуться в Lazarus

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

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

Рейтинг@Mail.ru
cron