Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Cоздание новых компонент

637
01 ноября 2001 года
Meskalito
5 / / 20.01.2000
В общем-то вопрос простой
Подскажите как добавить в компонент свойство ркализующие выбор одного из компонентов формы (т.е. чтобы в свойстве были перечисленны все другие компоненты формы в виде ComboBox)

[ Это Сообщение было отредактировано Meskalito в 2001-11-01 1830 ]
449
01 ноября 2001 года
Fantasist
124 / / 20.06.2000
Хм... Meskalito... Где-то это имя я уже встречал. Уж не у Кастанеды ли!

Ладно. Ворос не совсем по компонентам. Что бы добавть в компонету ComboBox, тебе просто нужно добавить ComboBox. А вот что бы в него листь компонентов загнать, это уже нужно через свойство Parent обращаться, а там кажется есть Controls что-ли? Типа контролы которые на нем лежат. Посмотри в общем. Хотя вот если эту компоненту положат не на форму, а на панель, скажем...
637
04 ноября 2001 года
Meskalito
5 / / 20.01.2000
Как TComboBox вставить в копонент я знаю, меня интересовало другое как в Object Inspector - е сделать свойство с выпадающим списком причем чтобы туда можно было забить
любое количество строк а не какой-либо перечислимый тип предварительно объявленный а юните! Но все равно спасибо!!!!

ЗЫ Если можно впишите примерчик!!!

[ Это Сообщение было отредактировано Meskalito в 2001-11-03 2301 ]
449
05 ноября 2001 года
Fantasist
124 / / 20.06.2000
А, ну, это просто. Примерно так

TNewControl=class(TWinControl)
FControlTWinControl;

published
property ControlTWinControl read FControl write FControl;
end;

А там уж Дельфя сама все сделает.

А что-то со вторым не очень врубаюсь. А как же ты этот список туда заганять будешь? Компонента-то должна быть создана уже со всеми свойствами. Да и вообще, насколько я знаю, Object Inspector не вклячает в себя никакого редактора для списков или массивов.



[ Это Сообщение было отредактировано Fantasist в 2001-11-05 1804 ]
637
05 ноября 2001 года
Meskalito
5 / / 20.01.2000
Ну попробовал я! Свойство с выпадающим списком создается, а вот как туда что-нибудь вписать не знаю ( ну чайник я .... ГЫ)! Вот!

А по поводу любого количества строк ну работает же это в дельфяшном компонете TDataSource перечисляет же он как-то TTable - ы в свойстве DataSet причем сколько TTable столько и строк в свойстве!
591
06 ноября 2001 года
x77
40 / / 20.03.2000
Это делается с помощью так называемыx редакторов свойств (Property Editor's). Писать подробно долго, посмотри исходники RXLib (юнит RxDsgn) или что-то типа Марко Канту (Mastering Delphi, Delphi Developer's handbook)
Аноним
СПАСИБО!!!
449
07 ноября 2001 года
Fantasist
124 / / 20.06.2000
Правилино! Editor надо писать.
Только я что-то не понял,что у тебя не получается. Я вроде написал все, у меня так работает. Вот как это в 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 ]
591
07 ноября 2001 года
x77
40 / / 20.03.2000
Fantasist, не понял, к чему была улыбочка, ну да ладно. Ты не перечисляешь таблицы, не создаёшь сам их список. То, что ты написал - это стандартный код, использующий те самые Property Editor's, над которыми, как я понял, ты ухмылялся. Чтобы было понятно, вот как это реализовано в самой Delphi:
 
 
{ 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'. Такие вот делы, если я правильно понял сабж, в чём, благодаря твоим постингам, уже начинаю сомневаться.
449
07 ноября 2001 года
Fantasist
124 / / 20.06.2000
Ха-ха-ха. Спасибо x77, как реализованно это в Delphi я знаю, сам не раз смотрел.
Ну нельзя же каждую рожицу как нападок на себя воспринимать.

То что я имел в виду (а не то что ты подумал), так это первое: ответ на самый первый вопрос который я сначала не правильно понял. (не будешь же ты предлагать писать свой эдитор если он в Delphi уже и так описан?) Второе: действительно правильно - если ты хочешь делать published свойства своих типов, то будь любезен пиши свой эдитор. Если же хочешь воспользоваться стандартными, то найди другой путь. Что ты тут такого нашел.

Так что все. Не обижайся. Я вижу твой уровень, ты действительно профессионал. А я просто веселый человек.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог