Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Свойство компонента (массив, список)  (Прочитано 8930 раз)
0 Пользователей и 1 Гость смотрят эту тему.
SCRIBE
Гость
« : 02-09-2015 09:33 » 

Доброе утро.

Появилась вот такая задачка.
Создаю свой компонент. Есть список строк, который грузиться из файла, надо его запихнуть в свойство компонента, чтобы можно было выбирать в инспекторе как set набор. Не нашел как это реализовать, компоненты которые так умеют, ничего не говорят, объявив свойство string и все. Но они подгружают список (например список доступных баз данных и т.д.), а как, загадка.

Буду благодарен за помощь.

Добавлено через 18 минут и 13 секунд:
походу надо рыть в RegisterPropertyEditor
« Последнее редактирование: 02-09-2015 09:51 от SCRIBE » Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 02-09-2015 12:57 » 

Если не ошибаюсь, для стадии визарда у компонентов есть отдельный код.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
SCRIBE
Гость
« Ответ #2 : 02-09-2015 13:37 » new

Да, спасибо, уже нашел, по хорошему создаются два юнита, для runtime и для designtime.
Ссыль: http://stackoverflow.com/questions/14709590/custom-propertyeditors-they-never-seem-to-appear

Вот то, что у меня заработало, файл регистрации компонента, тут нет runtime кода (Delphi 2010):

Код: (Delphi)
Uses
       ............, DesignIntf, DesignEditors;        
       //примечание, если не находит их, добавляем в наш .dpk "requires  ......, DesignIDE;"
       //также тут должен быть подключен ваш runtime юнит.

type
  TPTHStringProperty = class(TStringProperty)
  public
    function GetAttributes: TPropertyAttributes; override;
    procedure GetValueList(List: TStrings); virtual; abstract;
    procedure GetValues(Proc: TGetStrProc); override;
  end;

  TPathsProperty = class(TPTHStringProperty)
    procedure GetValueList(List: TStrings); override;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('MyComp', [TMyComp]);
  RegisterPropertyEditor(TypeInfo(string), TMyComp, 'Paths', TPathsProperty);
  // естественно в вашем компоненте должно быть объявлено свойство 'Paths' с типом string.
end;

{ TPTHStringProperty }

function TPTHStringProperty.GetAttributes: TPropertyAttributes;
begin
  Result := [paDialog, paValueList, paSortList];
end;

procedure TPTHStringProperty.GetValues(Proc: TGetStrProc);
var
  I: Integer;
  Values: TStringList;
begin
  Values := TStringList.Create;
  try
    GetValueList(Values);
    for I := 0 to Values.Count - 1 do Proc(Values[I]); //этот Proc и выводит то что надо
  finally
    Values.Free;
  end;
end;

{ TPathsProperty }

// тут любым для вас доступным способом получаете тот список, который надо отобразить
procedure TPathsProperty.GetValueList(List: TStrings);
var
  F: TIniFile;
begin
  try
    F:= TIniFile.Create('какой-то файл');
    F.ReadSections(List);
  finally
    F.Free;
  end;
end;

Бонус:
В моей задаче сам файл из которого вытягивается список, находиться в папке с самой программой, поэтому в designmode возникли проблемы с получением прямого пути к нему (Application.ExeName или paramstr(0) не работают). Вот решение, для получения пути к вашему проекту из designmode надо:
  1. Подключить в uses ToolsAPI.
  2. Использовать метод GetActiveProject.FileName.
Вуаля=)
« Последнее редактирование: 02-09-2015 13:40 от ..::SCRIBE::.. » Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines