Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Добавление свойства


RASkov ©   (2006-09-10 03:38:00) 

Подскажите пожалуйста как при написании компанента добавить ему паблишед свойство чтобы в инспекторе объектов, значение свойства выбиралось из выподающего списка. В список должны добавляться компаненты имеющиеся на форме и имеющие Canvas. В написании компанент опыта мало т.е. нет.

TMyCompanent = class(TCompanent)
private
FCanvas: TCanvas;
....
published
property Canvas: TCanvas ....?????...
....
end;

Можно кусок примера как это делается. Т.е. если "кинуть" мой компанент на читую("голую") форму то в Инсп.Объектов у моего компанента в списке свойства Canvas должна быть Form1. Бросили на форму Image1 - и его в список. Ну и так всех у кого есть канва.


RASkov   (2006-09-11 12:18:00) [1]


> PSPF2003 ©   (11.09.06 08:01) [11]

Книги этой нет, но да ладно, спасибо. А вот модуль DesignEditors надо будет посмотреть...


Наиль   (2006-09-11 10:19:00) [2]


> Свойство Canvas никакого отношения к RTTI не имеет.

Действительно, с какого перепугу решил, что Canvas - published?
Это наверное из-за упоминания TImage. C недосыпу принял Canvas за Picture.


Loginov Dmitry   (2006-09-11 10:03:00) [3]

Свойство Canvas никакого отношения к RTTI не имеет.


Наиль   (2006-09-11 08:09:00) [4]

Для начала открой модуль DesignEditors [D7].
Найди класс TComponentProperty. Тебе нужно создать потомка от него, поэтому проанализируй.
Метод для перекрывания GetValues.
Список "нужен-ненужен" создаётся этой строкой:
 Designer.GetComponentNames(GetTypeData(GetPropType), Proc);
Суть кода - передать дизайнеру процедурную переменную Proc, с помощью которой Object Inspector должен получить список. Дизайнер вызывает эту процедуру необходимое число раз передавая в качестве параметра имена подходящих компонент.
Твоя задача - подсунуть вместо Proc свою поцедуру MyProc, которая:
1. Делает проверку наличия у компонента свойства Canvas
2. Передаёт в переменую Proc имя подходящего компонента
Примерно так:
var
 P: PPropInfo;
begin
 // Здесь находим xComponent по имени
 ...
 // Далее п.1 и п.2
 P := GetPropInfo(xComponent, PropName);
 if P <> nil then Proc(s);


PS. Прочитай статью "RTTI" на этом сайте.


PSPF2003   (2006-09-11 08:01:00) [5]

Если вопросы по созданию компонентов ищи: “Валерий Фаронов Искусство создания компонентов Delphi” Там найдешь ответы на все свои вопросы.


PSPF2003   (2006-09-11 07:57:00) [6]


> Никто не подскажет?

Что?


RASkov   (2006-09-10 19:36:00) [7]

Никто не подскажет?


RASkov   (2006-09-10 17:23:00) [8]

На каком месте вообще происходит фильтрация и как это свойство заполняется?
в конструкторе? а как заполнить список с выборкой нужен-ненужен... но наверное всетаки не в конструкторе потому что если бросить на форму Image1 и в моем компаненте его(Image1) выбрать, а потом удалить с формы Image1 он должен пропасть из списка.... это уже наверное не в конструкторе.


RASkov   (2006-09-10 17:18:00) [9]

И это.... компанент пишу для себя, в свет может и не выйдет. Поэтому не обращайте внимание на то что вопрос задает "новичек" и если Вы выложите код то я его припишу к своему компаненту и это будет "единственное нормальное место в компаненте"...Я учусь и с Вашей помощью это удается намного лучше чем с книгами. Многие книги тут так обосрали (некоторые у меня есть) отсюда вывод..., да и просто ответ на конкретно заданный вопрос намного понятней и поучительней для меня чем строить тот же самый велосипед через ж, я неспорю, что я сам догадаюсь как это сделать но как я это сделаю....вопрос...может вооще не тем путем пойду. А на вопрос типа что ответом и сдесь могут сбить с толку у меня реакция нормально общие принцыпы мне известны могу подкорректировать.
Хотя есть одна нормальная книга и она у меня имеет первый приоритет это Delphi 4 для профессионалов Марко Кэнту, хорошая книга хоть и для 4 но актуальна и для Delphi 7 на которой и работаю. А вот с Фленовым поспешил...хотя и там есть моменты(идеи) из которых можно что-то сделать.
Блин, не получается в двух словах:) Народ здесь краткость не понимает и это нормально:)
Спасибо.


RASkov   (2006-09-10 16:49:00) [10]

Поправка к [5]
В список property CanvasCtrl: TGraphicControl


RASkov   (2006-09-10 16:48:00) [11]

Т.е. при таком описании property CanvasCtrl: TGraphicControl read FCanvasControl write FCanvasControl;
В список ( property CanvasControl: TCustomControl;) попадают все контролы и которые надо и которые не надо. Как их отфильторовать, что бы попадали только те у кого канва доступна напрямую т.е. Form1.Canvas, Image1.Canvas, PaintBox.Canvas, и ижи с ними, а вот Label хоть и от TGraphicControl он туда не должен попасть - в список CanvasCtrl.
Из моего компанента происходит рисование на этой канве. Т.е. если выбрали в MyCompanent.CanvasCtrl:=Form1; то компанент должен рисовать на канве формы.
Спасибо.


RASkov   (2006-09-10 16:40:00) [12]

> [3] Anatoly Podgoretsky ©   (10.09.06 15:38)

Да это понятно, просто я думал вручную надо заполнять список(поле).
Хотя оно наверное так и должно быть в моем случае. Вопрос как это сделать?


Anatoly Podgoretsky   (2006-09-10 15:38:00) [13]

RASkov   (10.09.06 15:14) [2]
А какие действия, раз не используются никакие методы, а только доступ до поля.


RASkov   (2006-09-10 15:14:00) [14]

> [1] Loginov Dmitry ©   (10.09.06 10:26)

Вот так просто оказывается добавить свойство? И что не надо описывать никаких действий в разделе implementation?
Тока тады надо наверное так
property CanvasCtrl: TGraphicControlread FCanvasControl write FCanvasControl;
Отсюда вопросы:
1 почему в список не попадает форма?
2 как в этот список добавлять такие компаненты у которых доступен канвас? А то получается туда и Label'ы лезут а их туда не надо.
Ну на первый вопрос ответ я наверное знаю - потому что форма не от TGraphicControl. А на второй - Label'ы туда лезут все из-за того же TGraphicControl.
Можно кусок кода про это мое свойство полностью т.к. <В написании компанент опыта мало т.е. нет.>
Спасибо.


Loginov Dmitry   (2006-09-10 10:26:00) [15]

Все компоненты, идущие от TCustomControl, имеют свойство Canvas. Тогда можно попытаться так:


published
 property CanvasControl: TCustomControl read FCanvasControl write FCanvasControl;


В некоторых компонентах свойство Canvas закрыто, придется открывать его самостоятельно.


Наверх

Титульная страница Поиск, карта сайта Написать письмо