Cоздание новых компонент
Подскажите как добавить в компонент свойство ркализующие выбор одного из компонентов формы (т.е. чтобы в свойстве были перечисленны все другие компоненты формы в виде ComboBox)
[ Это Сообщение было отредактировано Meskalito в 2001-11-01 1830 ]
Ладно. Ворос не совсем по компонентам. Что бы добавть в компонету ComboBox, тебе просто нужно добавить ComboBox. А вот что бы в него листь компонентов загнать, это уже нужно через свойство Parent обращаться, а там кажется есть Controls что-ли? Типа контролы которые на нем лежат. Посмотри в общем. Хотя вот если эту компоненту положат не на форму, а на панель, скажем...
любое количество строк а не какой-либо перечислимый тип предварительно объявленный а юните! Но все равно спасибо!!!!
ЗЫ Если можно впишите примерчик!!!
[ Это Сообщение было отредактировано Meskalito в 2001-11-03 2301 ]
TNewControl=class(TWinControl)
FControlTWinControl;
published
property ControlTWinControl read FControl write FControl;
end;
А там уж Дельфя сама все сделает.
А что-то со вторым не очень врубаюсь. А как же ты этот список туда заганять будешь? Компонента-то должна быть создана уже со всеми свойствами. Да и вообще, насколько я знаю, Object Inspector не вклячает в себя никакого редактора для списков или массивов.
[ Это Сообщение было отредактировано Fantasist в 2001-11-05 1804 ]
А по поводу любого количества строк ну работает же это в дельфяшном компонете TDataSource перечисляет же он как-то TTable - ы в свойстве DataSet причем сколько TTable столько и строк в свойстве!
Это делается с помощью так называемыx редакторов свойств (Property Editor's). Писать подробно долго, посмотри исходники RXLib (юнит RxDsgn) или что-то типа Марко Канту (Mastering Delphi, Delphi Developer's handbook)
СПАСИБО!!!
Только я что-то не понял,что у тебя не получается. Я вроде написал все, у меня так работает. Вот как это в DataSource реализованно, но это только для DataSet
TDataSource = class(TComponent)
private
FDataSet TDataSet;
.
.
procedure TDataSource.SetDataSet (ADataSet TDataSet);
.
.
.
published
DataSetTDataSet read FDataSet write setDataSet;
procedure TDataSource.SetDataSet(ADataSet TDataSet);
begin
write SetDataSet;
if IsLinkedTo(ADataSet) then DatabaseError(SCircularDataLink);
if FDataSet <> nil then FDataSet.RemoveDataSource(Self);
if ADataSet <> nil then ADataSet.AddDataSource(Self);
end;
[ Это Сообщение было отредактировано Fantasist в 2001-11-06 2255 ]
{ TDataSetProperty }
type
TDataSetProperty = class(TComponentProperty)
private
FCheckProc: TGetStrProc;
procedure CheckComponent(const Value: string);
public
procedure GetValues(Proc: TGetStrProc); override;
end;
procedure TDataSetProperty.CheckComponent(const Value: string);
var
J: Integer;
Dataset: TDataset;
begin
Dataset := TDataset(Designer.GetComponent(Value));
for J := 0 to PropCount - 1 do
if TDataSource(GetComponent(J)).IsLinkedTo(Dataset) then
Exit;
FCheckProc(Value);
end;
procedure TDataSetProperty.GetValues(Proc: TGetStrProc);
begin
FCheckProc := Proc;
inherited GetValues(CheckComponent);
end;
Обрати внимание, ты делаешь проверку на цикличность (circular datalinks) при присваивании, а здесь исключён сам Datasource, ни в одном борландовском DataSet.Datasource ты не увидишь его собственный DataSource - его просто напросто нет в списке в ObjectInspector'e. В конце модуля стоит такая строчка:
RegisterPropertyEditor(TypeInfo(TDataSet), TDataSource, 'DataSet', TDataSetProperty);
Она то и назначает редактор свойства (Property Editor), который будет использоваться при формировании всех свойств типа TDataSet, у всех компонентов типа TDataSource, при условии, что свойство называется 'DataSet'. Такие вот делы, если я правильно понял сабж, в чём, благодаря твоим постингам, уже начинаю сомневаться.
Ну нельзя же каждую рожицу как нападок на себя воспринимать.
То что я имел в виду (а не то что ты подумал), так это первое: ответ на самый первый вопрос который я сначала не правильно понял. (не будешь же ты предлагать писать свой эдитор если он в Delphi уже и так описан?) Второе: действительно правильно - если ты хочешь делать published свойства своих типов, то будь любезен пиши свой эдитор. Если же хочешь воспользоваться стандартными, то найди другой путь. Что ты тут такого нашел.
Так что все. Не обижайся. Я вижу твой уровень, ты действительно профессионал. А я просто веселый человек.