![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Взаимодействие с компонентами [D2005, XP]
Илья_666 © (2016-02-28 19:28:00)Всем добрый вечер!
Есть компонент - наследник TCustomControl, который создает на себе несколько панелей (как в дизайн-, так и в ран-тайм).
Собственно, интересует, как можно в дизайне взаимодействовать с панелями, подобно тому, как это получается у TPageControl'a и его TabSheet'ов.
Ну или как будто просто положить на форму стандартную панель, а на нее еще 3 панели.
Код TPageControl'a я смотрел, но так и не понял, как он это творит.
Подскажите, пожалуйста, в каком направлении копать.
Заранее спасибо.
Илья_666 (2016-03-21 17:43:00) [1]
> Макс Черных © (18.03.16 02:04) [17]
Возьмите, пожалуйста, за правило читать все, что написано до Вас.
Это избавит Вас от многих проблем как в жизни, так и в интернете.
> Илья_666 (02.03.16 18:50) [9]
Читать до наступления просветления.
З.Ы.
cmDesignHittest не помогло бы в моем случае.
Макс Черных (2016-03-18 02:04:00) [2]
> Но дело в том, что все в том же дизайн-тайм, при попытке
> клика на любую панель, клик проходит по родительскому компоненту
> и он же и выделяется, и в объект-инспекторе работать можно
> только с ним, но не с панелью.А я бы хотел реализовать возможность
> клика и работы как с родительским компонентом, так и с панелями
> в дизайн-тайм.
Коли так, то стоит разобраться для чего нужно сообщение CM_DESIGNHITTEST и что будет если оному в Message.Result вернуть единицу.
Илья_666 (2016-03-04 17:42:00) [3]Юрий Зотов, спасибо еще раз за помощь)
Игорь Шевченко (2016-03-03 18:13:00) [4]Илья_666 (03.03.16 17:05) [13]
Можно выяснять интересующие вас подробности, например, в чате ? На сайте есть чат, не надо его путать с форумом.
Юрий Зотов (2016-03-03 17:45:00) [5]> Получается, такие пакеты можно использовать вне Делфи?
Можно откомпилировать программу с RT-пакетами. Тогда размер сильно уменьшается, но требуемые для нее пакеты придется таскать вместе с ней.
Илья_666 (2016-03-03 17:05:00) [6]Юрий Зотов, спасибо за описание в сообщении [10]. У меня есть несколько компонентов, написанных для себя. Как раз доделаю с панельками контрол и оформлю пакеты, как полагается))
Германн, а что значит эта строка:
> RT-пакеты почти никто не пользует, кроме самой Дельфи
? Получается, такие пакеты можно использовать вне Делфи?
Игорь Шевченко, ну зачем Вы так грубо с братом по цеху? Ай-яй-яй, это же не наш метод)
Игорь Шевченко (2016-03-03 12:35:00) [7]
> Которую вряд ли кто другой оценит. Ибо RT-пакеты почти никто
> не пользует, кроме самой Дельфи. :)
Можно ты свои фантазии будешь держать при себе, а не делиться ими с форумом ? Дай отдохнуть и фонтану.
Германн (2016-03-03 01:03:00) [8]
> Осознаем свою необычайную крутизну!
Которую вряд ли кто другой оценит. Ибо RT-пакеты почти никто не пользует, кроме самой Дельфи. :)
Юрий Зотов (2016-03-02 21:26:00) [9]> мне казалось, что создавать компоненты в через подобные
> редакторы невозможно
Создать компонент можно откуда угодно, лишь бы был доступен его конструктор (а для визуальных компонентов - еще и Parent).
Ну и чтобы было совсем грамотно, сделайте так:
1. Создаем 2 пакета: rin-time (RT) и design-time (DT).
2. В пакет RT помещаем модуль самого компонента и модули, требуемые ему для работы в run-time. Больше ничего в пакет RT не помещаем.
3. В пакет DT помещаем модуль с редактором и процедурой Register (в которой 2 строчки - регистрация самого компонента и его редактора). Если компонент имеет собственную иконку, помещаем ее ресурс тоже в пакет DT.
4. В секции required пакета DT указываем пакет RT.
5. Компилируем пакет RT в доступный для IDE каталог.
5. Инсталлируем пакет DT в IDE.
6. Осознаем свою необычайную крутизну!!!
Илья_666 (2016-03-02 18:50:00) [10]Юрий Зотов, спасибо за пример. Помимо него я только что нашел пример на
http://docwiki.embarcadero.com/RADStudio/Seattle/en/Changing_the_Double-click_Behavior
procedure TMyEditor.Edit;
var
FontDlg: TFontDialog;
begin
FontDlg := TFontDialog.Create(Application);
try
if FontDlg.Execute then
MyComponent.FFont.Assign(FontDlg.Font);
finally
FontDlg.Free
end;
end;
я попробовал таким же образом вставить панель, используя контекстное меню и получилось такое:
procedure TPanelEditor.ExecuteVerb(Index: Integer);
var
Panel: TPanel;
begin
Inherited ExecuteVerb(Index);
case Index of
0:
begin
Panel:= TPanel.Create(Designer.Root);
Panel.Parent := Designer.Root;
Panel.Name := Designer.UniqueName('Panel');
Designer.SelectComponent(Panel);
Designer.Modified;
end;
end;
end;
Теперь панелька может обрабатываться через инспектор объектов и даже быть удаленной))
Честно говоря, раньше мне казалось, что создавать компоненты в через подобные редакторы невозможно, можно лишь вызвать какую-нибудь процедуру из компонента указанного класса. Но, видимо я ошибался.
Спасибо Вам, Юрий Зотов, за потраченное на дилетанта время))
Юрий Зотов (2016-03-01 21:02:00) [11]Редактор компонента привязывается не к отдельному компоненту, а к его КЛАССУ (то есть, сразу ко всем компонентам этого класса).
См. RegisterComponentEditor.
interface
type
TMyComponentEditor = class(TMyComponent)
public
procedure Edit; override;
function GetVerb(Index: Integer): String; override;
function GetVerbCount: Integer; override;
procedure ExecuteVerb(Index: Integer); override;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponentEditor(TMyComponent, TMyComponentEditor)
end;
procedure TMyComponentEditor.Edit;
// Процедура редактирования выбранных компонентов
// Вызывается двойным щелчком по одному из них, либо из меню
begin
ShowMessage('Вызвана процедура Edit')
end;
procedure TMyComponentEditor.ExecuteVerb(Index: Integer);
// Выполняет команду меню с индексом Index
begin
case Index of
0: Edit; // Умалчиваемая команда - редактирование
1: ShowMessage('Пункт 1 выполнен')
end
end;
function TMyComponentEditor.GetVerb(Index: Integer): String;
// Возвращает названия пунктов меню
begin
case Index of
0: Result := 'Edit...';
1: Result := 'Once more';
end
end;
function TMyComponentEditor.GetVerbCount: Integer;
// Возвращает количество пунктов меню
begin
Result := 2;
end;
Илья_666 (2016-03-01 18:25:00) [12]Юрий Зотов, я пошерстил исходники VCL, но ничего, связанного с PageControl так и не нашел. Почитал про TComponentEditor, но таки не понял, как он именно привязывается к PageControl'у, что дает возможность создавать компоненты. Вот застрял тут и все. Печально.
Юрий Зотов (2016-02-29 23:14:00) [13]Это называется "редактор компонента". Его надо написать и зарегистрировать в IDE. Примеры есть в VCL
Илья_666 (2016-02-29 21:24:00) [14]Ладно, а что если зайти с другой стороны. У стандартного TPageControl есть PopupMenu в дизайне, в котором есть пункт "New page", нажатие на который приводит к добавлению страницы.
Если не ошибаюсь, то реализовать такое меню можно через некие пакеты с названиями DesignXXX.pas. Но суть не в этом. Суть в том, что, возможно, выделение только что добавленной страницы (а также иных страниц pageControl'a) происходит через некий код в обработчике пункта "New page".
Только вот теперь вопрос: как увидеть исходники обработчика "New page" стандартного TPageControl?
Ни у кого никаких мыслей случаем нет на этот счет?
Илья_666 (2016-02-29 18:50:00) [15]Юрий Зотов, к сожалению, SetSubComponent не помог, равно как и назначение в качестве Owner'a для моих панелей формы, на которой лежит весь компонент. Я пробовал использовать SetDesigning(true, true), но это явно дурной тон. К тому же, такой вариант также некорректно работает.
Юрий Зотов (2016-02-29 13:47:00) [16]> Как будто вы положили TPanel на форму, а на нее
> положили еще две TPanel.
В этом случае большая панель будет только родителем, а владельцем будет форма. А у Вас большая панель - и родитель, и владелец. Возможно, дело в этом.
Еще посмотрите SubComponent. Деталей уже не помню, но похоже, что это и есть то, что Вам надо.
Илья_666 (2016-02-28 23:25:00) [17]Юрий Зотов, если речь идет о csAcceptsControls, то этот флаг выставлен в ControlStyle компонента. Если Вы не имели в виду флаг, то никакой информации по AcceptControls я не нашел.
Я же говорю о том, что мой компонент создает в дизайн-тайм на себе несколько стандартных TPanel. Это работает прекрасно и мой компонент является владельцем и родителем панелей. Но дело в том, что все в том же дизайн-тайм, при попытке клика на любую панель, клик проходит по родительскому компоненту и он же и выделяется, и в объект-инспекторе работать можно только с ним, но не с панелью.
А я бы хотел реализовать возможность клика и работы как с родительским компонентом, так и с панелями в дизайн-тайм.
Как будто вы положили TPanel на форму, а на нее положили еще две TPanel. Теперь у вас есть возможность выделить кликом как родительскую панель и работать с ней через объект-инспектор, так и выделить любую из child-панелей и работать с ними через инспектор.
Вот как такое сделать для дизайн-тайм?
Юрий Зотов (2016-02-28 22:22:00) [18]См. AcceptControls