На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Обязательно выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.

Этот раздел предназначен для вопросов, посвященных разработке компонентов, а также для тестирования собственных бесплатных компонентов с открытым исходным кодом.

Здесь запрещается:
1. Размещать ссылки на какие-либо коммерческие компоненты, реализующие требуемую функциональность.
2. Обсуждать и тестировать коммерческие компоненты или компоненты с закрытым кодом.
3. Давать ссылки на сайты с исходным кодом компонентов. Все тестируемые исходные коды должы быть размещены на сайте ИСХОДНИКИ.RU.
Модераторы: Rouse_, DimaBr
  
> Редактор свойств для выбора файла
    Вместо диалогового окна открытия файлов создаваемое в процедуре Edit, появляется диалоговое окно открытия файлов с параметрами по умолчанию. Т.е. даже фильтр *.* Похоже, что процедура не срабатывет.
    Как решить проблему?

    ExpandedWrap disabled
      unit desMBList;
       
      interface
      uses
      SysUtils, DesignIDE, DesignEditors, DesignIntf, TypInfo, Dialogs, MBList1;
       
      type
       
      TFileNameProperty = class(TPropertyEditor) // редактор свойств для выбора файла XML
        public
          function GetAttributes: TPropertyAttributes; override;
          procedure Edit; override;
        end;
       
        procedure Register;
       
      implementation
       
      procedure Register;
      begin
        RegisterPropertyEditor(TypeInfo(TFileName), TMBList, 'XMLDocumentPath', TFileNameProperty);
      end;
       
      function TFileNameProperty.GetAttributes: TPropertyAttributes;
        begin
          Result := [paDialog];
        end;
       
      procedure TFileNameProperty.Edit;
      var
        OpenDialog: TOpenDialog;
      begin
        OpenDialog:=TOpenDialog.Create(nil);
        try
          OpenDialog.Title := 'Выберите xml файл.';
          OpenDialog.FileName := '';
          OpenDialog.Filter := 'XML Files (*.xml)|*.xml';
          OpenDialog.HelpContext := 0;
          OpenDialog.Options := OpenDialog.Options + [ofPathMustExist, ofFileMustExist, ofForceShowHidden];
          if OpenDialog.Execute then
            //SetValue(OpenDialog.Filename);
        finally
          OpenDialog.Free;
        end;
      end;
       
      end.


    Я реорганизовал проект, как было расписано в Где искать DsgnIntf.dcu, DesignIDE.dcu и Proxies.pas?. Но, похоже, что вышеуказанный (Design-time) код не присоединяется к коду компонента (Run-time).
    Сообщение отредактировано: TechnoMag -
      1. Добавьте desMBList в инсталиционный пакет
      2. Добавьте в пакет DesignIde.dcp (DelphiX\Lib)
      3. Instal
        Цитата DimaBr @
        1. Добавьте desMBList в инсталиционный пакет

        Если вы о uses, то выдается ошибка Circular unit references, т.к. по инструкции (ссылку я указал выше) в desMBList в uses я указал MBList (главный пакет).
        Если о desMBList.dcp то не работает. Вроде даже не привязывается этот файл.
          У вас есть пакет, которым вы инсталлируете свой компонент в палитру. Вот туда и нужно добавить файл регистрации редактора свойства, а в Requires - DesignIde. Делается это кнопочкой Add.
          user posted image
            Пробовал. Может у Вас получится. Вполне вероятно, что я не правильно реорганизовал прект. Delphi 7.

            MsBList.7zПрикреплённый файлMBList.7z (16,01 Кбайт, скачиваний: 178)
              1. Уберите в desMBList "uses DesignIDE"
              2. Уберите из первого пакета DesignIDE
              3. Добавьте во второй пакет DesignIDE
                Цитата DimaBr @
                1. Уберите в desMBList "uses DesignIDE"
                2. Уберите из первого пакета DesignIDE
                3. Добавьте во второй пакет DesignIDE

                Что считать первым пакетом, что вторым? :blush:
                  В приложенном примере два пакета (dpk) (Хотя это можно объеденить и в один).
                  Первый пакет Package1.dpk инсталирует компонент в палитру компонентов. (если в опциях поставить RunTime Only), то будет возможность подгружать ваш компонент в приложение в виде библиотеки (bpl), но об этом пока рано.
                  Второй пакет desPackage1.dpk инсталирует редактор свойства. На нём стоит галочка DedignTime Only и это правильно !

                  Если вы не собираетесь использовать компонент в библиотеках, динамически подгружать (LoadLibrary), и динамически создавать, то можно объединить RunTime и DesignTime в один пакет, поставить соответствующую галочку добавить оба ваших файла (с компонентом и редактором), добавить пакет дизайнера - DesignIde.
                    При попытке инсталляции объединенного компонента (с файлами MBList.pas и desMBList.pas в одном пакете .bpl) IDE намертво виснет. Такое же было когда весь код был в одном файле.
                      Повторяю ещё раз, выполните пункт № 1. Уберите DesignIDE в секции USES файла desMBList.pas
                        Ура получилось установить компонент!
                        Но в редакторе свойств после выбора файла пишет [Unknown]

                        ExpandedWrap disabled
                          unit desMBList;
                           
                          interface
                          uses
                          Forms, Classes, SysUtils, DesignEditors, DesignIntf, TypInfo, Dialogs, MBList1;
                           
                          type
                           
                          TFileNameProperty = class(TPropertyEditor) // редактор свойств для выбора файла XML
                            public
                           
                              function GetAttributes: TPropertyAttributes; override;
                              procedure Edit; override;
                            end;
                           
                            procedure Register;
                           
                          implementation
                           
                          procedure Register;
                          begin
                            RegisterPropertyEditor(TypeInfo(TFileName), TMBList, 'XMLDocumentPath', TFileNameProperty);
                          end;
                           
                          function TFileNameProperty.GetAttributes: TPropertyAttributes;
                            begin
                              Result := [paDialog];
                            end;
                           
                          procedure TFileNameProperty.Edit;
                          begin
                            with TOpenDialog.Create(Application) do
                            try
                              Filter := 'XML Files (*.xml)|*.xml';
                              Title := 'Выберите файл со списком параметров';
                              HelpContext := 0;
                              FileName := GetStrValue;
                              Options := Options + [ofPathMustExist, ofFileMustExist, ofForceShowHidden];
                              if Execute then
                                SetStrValue(FileName);
                            finally
                              Free;
                            end;
                          end;
                           
                          end.
                        Сообщение отредактировано: TechnoMag -
                          ExpandedWrap disabled
                            TFileNameProperty = class(TStringProperty)
                            Спасибо! Бальшущий вопрос решен. :D
                            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                            0 пользователей:


                            Рейтинг@Mail.ru
                            [ Script execution time: 0,1134 ]   [ 18 queries used ]   [ Generated: 28.04.24, 04:15 GMT ]