![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Добавление published свойства
RASkov © (2006-09-10 05:27:00)Подскажите пожалуйста как при написании компанента добавить ему паблишед свойство чтобы в инспекторе объектов, значение свойства выбиралось из выподающего списка. В список должны добавляться компаненты имеющиеся на форме и имеющие Canvas. В написании компанент опыта мало т.е. нет.
TMyCompanent = class(TCompanent)
private
FCanvas: TCanvas;
....
published
property Canvas: TCanvas ....?????...
....
end;
Можно кусок примера как это делается. Т.е. если "кинуть" мой компанент на читую("голую") форму то в Инсп.Объектов у моего компанента в списке свойства Canvas должна быть Form1. Бросили на форму Image1 - и его в список. Ну и так всех у кого есть канва.
Юрий Зотов (2006-09-17 17:28:00) [101]> RASkov (17.09.06 02:04) [19]
> как вот организовать проверку
Универсального способа не существует (по крайней мере, легального).
Заведомо известно, что канву имеют TGraphicControl (и все его потомки) и TCustomControl (и все его потомки) - поэтому проверку можно построить на простой принадлежности к этим классам (оператор is). Но такая проверка не будет полностью достоверной, потому что никто не мешает написать свой объект с любым предком и ввести в него канву (привязавшись к любому окну и получив его DC).
Если свойство (или поле) типа TCanvas объявлено в секции published и объект компилировался с опцией M+ (или наследовался от TPersistent), то можно построить фильтрацию на механизмах RTTI - получить список свойств (или полей), пройти по нему и определить наличие свойств (или полей) типа TCanvas. Но и такое решение тоже не будет полным, потому что свойство (или поле) типа TCanvas выносить в published просто незачем, так что вряд ли кто станет это делать; с другой стороны, это свойство (или поле) реально нужно в секции public (или protected) - а для них RTTI не работает.
Можно строить фильтрацию и на любой комбинации двух изложенных подходов - но и в этом случае полностью достоверной она все равно не будет.
Поэтому универсального способа не существует (по крайней мере, легального). Вообще же, возникает ощущение, что Вы ищете решение задачи не там, где его можно найти. В чем она первоначально заключается?
RASkov (2006-09-17 02:04:00) [102]Ладно, если никак не получится фильтровать в списке без редактора свойства, то вот таким вот способом добился ограничение выбора из списка в инспекторе свойства CanvasControls
TMyComponent = class(TComponent)
private
fCanvasControls: TGraphicControl;
procedure SetCanvasControls(Value: TGraphicControl);
published
property CanvasControls: TGraphicControl read fCanvasControls write SetCanvasControls;
end;
procedure TMyComponent.SetCanvasControls(Value: TGraphicControl);
begin
if Value is TPaintBox then FCanvasControls := Value;
//или
//if Value Imeet Canvasthen FCanvasControls := Value;
else raise.Create('Нельзя это');
end;
Подскажите как вот организовать проверкуif Value Imeet Canvasthen, т.е. как опредилить - имеет ли Value доступную канву?
Ну рано мне пока с редакторами делать....
Подсмотрел как делается у TUpDown свойство Associate и... нихрена толком не понял кроме того, что привел выше. Спасибо.
RASkov (2006-09-17 00:11:00) [103]А без редактора свойства ни как? силами компанента...
Ну вот както TDataSource и свойство DataSet или TUpDown и свойство Associate справляются без редакторов....?
DimaBr (2006-09-13 11:19:00) [104]
> RASkov (12.09.06 22:56) [16]
Я имел в виду следующее: можно написать редактор свойства ( как предлагал Джо ©), который просматривает все компоненты в поиске порождённых от TGraphicControl и TCustomControl, однако мой компонент, поражденный от TContol со своей канвой он не найдёт.
RASkov (2006-09-12 22:56:00) [105]> [8] DimaBr (11.09.06 15:59)
> > А Canvas еще есть и у TGraphicControl.
> Такая постановка задачи сводится к нулю. Я напишу свой потомок
> от TControl со своей реализацией Canvas. Его компонент мой
> контрол не найдёт.
Т.е. ты скроешь у своего контрола канву? Мне как раз и нужно в список добавлять такие контролы, у которых она не скрыта, так как мой(я) компанент(а), (как правильно - то?), будет рисовать на ней. Для таких целей можно и жестко сделать типа
TMyComponent = class(TComponent)
private
fCanvasControls: TImage;
public
procedure Notification(AComponent: TComponent; Operation: TOperation);override;
published
property CanvasControls: TImageread fCanvasControls write fCanvasControls;
end;
Ну это неправильно. А вообще хотелось бы, что бы туда (в списокproperty CanvasControls) попала и форма и тот же PaintBox, Image... Т.е. те которые собственно и предназначены для рисования ну и форма в первую очередь.
В данный момент выше написанное проверить не могу (нет Delphi под рукой), но вот заинтересовали пара ответов это [15] и еще больше [2]
Не могли бы Вы нимного прокомментировать их?
В часности [15], т.к. по [2] почти, или наверное, полность описано про мое свойство... останется только добраться до Делфей и проверить а вот [15]...
Спасибо.
Наиль (2006-09-12 15:24:00) [106]Из старых форумов
type
THackCheckListBox = class(TCheckListBox);
//.................
var
ACheckListBox : TCheckListBox;
begin
//.....................
THackCheckListBox(ACheckListBox).MultiSelect := ?
//.....................
end;
RASkov (2006-09-12 12:51:00) [107]Спасибо всем.
В принципе, меня устроило и это
published
property CanvasControls: TGraphicControl read fCanvasControls write fCanvasControls;
Единственный косяк для моих целей, это то, что туда конечно же не попадает форма....
DimaBr (11.09.06 14:28) [6]
> Джо © (11.09.06 13:50) [5]
> Автору же не все наследники TComponent нужны.
Добраться до канвы можно с помощью Hask касса. А все наследники и не покажутся, только выше TCustomControls
А можно пример "добраться до канвы можно с помощью Hask касса"...
DimaBr (2006-09-11 16:39:00) [108]
> Хм, 18 против 25 никак нельзя назвать "решительным перевесом",
> не так ли? ;)
25 Custom-ов вырастут в большое количество компонентов.
Наиль (2006-09-11 16:34:00) [109]
> От TGraphicControl - 18 ( в основном уже конечные компоненты),
> к тому же виндовс о них ничо не знает.
Очень не редко предлагается делать украшательства для программ на основе TImage. И если кто-то прислушивается к таким советам, то перевес может быть обратным.
Джо (2006-09-11 16:26:00) [110]> От TGraphicControl - 18 ( в основном уже конечные компоненты)
> , к тому же виндовс о них ничо не знает.
Причем тут Windows и его знание о чем-то?
Хм, 18 против 25 никак нельзя назвать "решительным перевесом", не так ли? ;)
DimaBr (2006-09-11 16:16:00) [111]От TCustomControls непосредственно пораждено 25 объектов ( в основном TCustom...)
От TGraphicControl - 18 ( в основном уже конечные компоненты), к тому же виндовс о них ничо не знает.
Джо (2006-09-11 16:02:00) [112]> [8] DimaBr (11.09.06 15:59)
>
> > А Canvas еще есть и у TGraphicControl.
>
> Такая постановка задачи сводится к нулю.
Тогда непонятно, почему такое предпочтение именно к TCustomControls :)
DimaBr (2006-09-11 15:59:00) [113]
> А Canvas еще есть и у TGraphicControl.
Такая постановка задачи сводится к нулю. Я напишу свой потомок от TControl со своей реализацией Canvas. Его компонент мой контрол не найдёт.
Джо (2006-09-11 15:19:00) [114]> [6] DimaBr (11.09.06 14:28)
>
> > Джо © (11.09.06 13:50) [5]
> > Автору же не все наследники TComponent нужны.
>
> Добраться до канвы можно с помощью Hask касса.
Неизвестно, нужно ли это автору. Канва-то, небось, не зря спрятана. Впрочем, тут слово за ним.
> только выше TCustomControls
А Canvas еще есть и у TGraphicControl.
DimaBr (2006-09-11 14:28:00) [115]
> Джо © (11.09.06 13:50) [5]
> Автору же не все наследники TComponent нужны.
Добраться до канвы можно с помощью Hask касса. А все наследники и не покажутся, только выше TCustomControls
Джо (2006-09-11 13:50:00) [116]> [4] DimaBr (11.09.06 13:43)
> Редактор свойства типа TComponentProperty уже умеет искать
> компоненты по формам и предлагать выпадающий список.
Да, точно, забыл. Только я все-же за свой редактор, ибо, для корректной работы, нужно будет в список помещать не всех наследников TCustomControl, а только тех, у кого Canvas в public. Да еще TGraphicControl. Автору же не все наследники TComponent нужны.
DimaBr (2006-09-11 13:43:00) [117]Редактор свойства типа TComponentProperty уже умеет искать компоненты по формам и предлагать выпадающий список.
Джо (2006-09-11 13:32:00) [118]> [2] DimaBr (11.09.06 09:31)
> Не совсем так, думаю достаточно сделать следующее
И каким образом этот код поможет сделать так "чтобы в инспекторе объектов, значение свойства выбиралось из выподающего списка"?
DimaBr (2006-09-11 09:31:00) [119]
> Джо © (10.09.06 21:32) [1]
Не совсем так, думаю достаточно сделать следующее
TMyComponent = class(TComponent)
private
fCanvasControls: TCustomControls;
public
procedure Notification(AComponent: TComponent; Operation: TOperation);override;
published
property CanvasControls: TCustomControl read fCanvasControls write fCanvasControls;
end;
procedure TMyComponent.Notification(AComponent: TComponent; Operation: TOperation);
begin
If (Operator = opRemove) and (AComponent = CanvasControls) then CanvasControls := nil;
end;
Джо (2006-09-10 21:32:00) [120]Нужно зарегистрировать свой редактор свойств, вызвав RegisterPropertyEditor. Редактор (наследник TPropertyEditor) должен иметь атрибут paValueList). Примеры написания редакторов смотри в файле DesignEditors.pas.