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

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

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

    Два вопроса по редакторам свойств.

    Первый редактор должен показать в свойстве Directory или Folder папку, которую я выбираю в диалоге OpenDialog:

    ExpandedWrap disabled
      unit FileName;
       
      interface
      uses
        Windows, Messages, SysUtils, Variants, Dialogs, DesignIntf, Classes, Forms,
        DesignEditors, TypInfo;
       
      type
        TFileNameProperty = class(TPropertyEditor)
        public
          function GetAttributes: TPropertyAttributes; override;
          procedure Edit; override;
        end;
       
        procedure Register;
       
      implementation
       
      function TFileNameProperty.GetAttributes: TPropertyAttributes;
      begin
        Result := [paDialog]
      end;
       
      procedure TFileNameProperty.Edit;
      begin
        with TOpenDialog.Create(Application) do
        try
            Title := GetName; { name of property as OpenDialog caption }
            Filename := GetValue;
            Filter := 'All Files (*.*)|*.*';
            HelpContext := 0;
            Options := Options + [ofShowHelp, ofPathMustExist, ofFileMustExist];
            if Execute then
              SetValue(Filename);
        finally
            Free
        end
      end;
       
      procedure Register;
      begin
        RegisterPropertyEditor(TypeInfo(TFileName), nil, '', TFileNameProperty)
      end;


    Но, я получаю весь путь с файлом. Как правильно изменить код, чтобы получать только нужную директорию?

    Второй редактор должен в свойстве About просто показать форму. Примерный код ниже:

    ExpandedWrap disabled
      unit AboutDlg;
       
      interface
       
      uses Windows, Messages, SysUtils, Variants, DesignIntf, Classes, Forms,
           DesignEditors, TypInfo, AboutDlgForm, Controls, MyComponent3;
       
      type
        TAboutDlgProperty = class(TStringProperty)
        public
          function GetAttributes: TPropertyAttributes; override;
          procedure Edit; override;
          function MyComponent: TMyComponent;
        end;
       
      implementation
       
      function TAboutDlgProperty.GetAttributes: TPropertyAttributes;
      begin
        Result := [paDialog]
      end;
       
      procedure TAboutDlgProperty.Edit;
      begin
        AboutForm := TAboutForm.Create(nil);
        try
          // show the dialog box
          if AboutForm.ShowModal = mrOK then
            Set?????Value(??????????);
        finally
          AboutForm.Free;
        end;
      end;
       
      function TAboutDlgProperty.MyComponent : TMyComponent;
      begin
        Result := GetComponent(0) as TMyComponent;
      end;
       
      procedure Register;
      begin
        RegisterPropertyEditor(TypeInfo(Integer), TMyComponent, 'About', TAboutDlgProperty)
      end;
       
      end.


    Что неверно прописано в коде, чтобы открывать форму диалога About?
    Как нужно в данном случае прописывать процедуру Edit?

    Спасибо.
    Сообщение отредактировано: SkAndriy -
      1. ExtractFilePath
      2. Свойство About обычно не устанавливают, следовательно Set?????Value - не нужно
        касательно первого,
        ExtractFileDir
        либо
        SelectDirectory из QDialogs

        второй вопрос не совсем понял :)
          Да, если я использую конструкцию:

          ExpandedWrap disabled
            procedure TFileNameProperty.Edit;
            begin
              with TOpenDialog.Create(nil) do
              try
                  Title := GetName; { name of property as OpenDialog caption }
                  FileName := GetValue;
                  Filter := 'All Files (*.*)|*.*';
                  HelpContext := 0;
                  Options := Options + [ofShowHelp, ofPathMustExist, ofFileMustExist];
                  if Execute then
                    SetValue(ExtractFileDir(FileName));
              finally
                  Free
              end
            end;


          То в свойство компонента прописывается путь к директории, где он лежит.
          Но, мне нужно просто выделит директорию и все.
          Мне не нужно искать и выделять файл. Как в этом случае поступить.

          По второму вопросу:

          Я хочу просто показать диалог (свою форму) с информацией о компонента.
          Как изменить выше приведенный код в этом случае?
          Если Set?????Value не нужно, то что нужно указать?

          Спасибо.
            Первый вопрос решил заменив ЕOpenDialog на TFolderDialog.

            а вот воторой вопрос не получается решить.
            Нужно просто показать форму-диалог "О компоненте".
            Как это сделать корректно?
            Спасибо
            Сообщение отредактировано: SkAndriy -
              1. С помощью OpenDialod нельзя выбрать папку, используйте SelectDirectory или SHBrowseForFolder.
              2. Ничего не нужно указывать, вы же ничего не присваиваете свойству.
              ExpandedWrap disabled
                procedure TAboutDlgProperty.Edit;
                begin
                  with TAboutForm.Create(nil) do
                    try
                      ShowModal
                    finally
                      Free;
                    end;
                end;
                Не получается вызвать форму-диалог About.
                Нет в свойстве кнопки с тремя точками.

                Привожу код вцелом:

                ExpandedWrap disabled
                  unit AboutDlg;
                   
                  interface
                   
                  uses Windows, Messages, SysUtils, Variants, DesignIntf, Classes, Forms,
                       DesignEditors, TypInfo, AboutDlgForm;
                   
                  type
                    TAboutDlgProperty = class(TStringProperty)
                    public
                      function GetAttributes: TPropertyAttributes; override;
                      procedure Edit; override;
                    end;
                   
                  implementation
                   
                  function TAboutDlgProperty.GetAttributes: TPropertyAttributes;
                  begin
                    Result := [paDialog]
                  end;
                   
                  procedure TAboutDlgProperty.Edit;
                  begin
                    with TAboutForm.Create(nil) do
                    try
                        ShowModal
                    finally
                        Free;
                    end;
                  end;
                   
                  procedure Register;
                  begin
                    RegisterPropertyEditor(TypeInfo(String), TMyComponent, 'About', TAboutDlgProperty)
                  end;
                   
                  end.


                Где ошибка?

                Спасибо.
                  А где объявление свойства ?
                    пробовал и так

                    ExpandedWrap disabled
                      property About : Integer read FAbout write FAbout;


                    в свойстве ноль, кнопка с тремя точками отсутствует

                    и так

                    ExpandedWrap disabled
                      property About : String read FAbout write FAbout;


                    кнопка есть, но открывается редактор строки? a не моя форма AboutForm.

                    Может надо как-то иначе?

                    Спасибо
                    Сообщение отредактировано: SkAndriy -
                      ExpandedWrap disabled
                        property About: string read fAbout write SetAbout;
                         
                         
                        procedure SetAbout;
                        begin
                         // ничего не делаем
                        end;
                         
                        RegisterPropertyEditor(TypeInfo(string), TMyComponent, 'About', TAboutDlgProperty)
                        При такой конструкции есть кнопка с тремя точками в свойстве, но после ее нажатия получаем не мое окно About, а окно String-Edit.
                        Как изменить ситуацию?

                        Спасибо
                        Сообщение отредактировано: SkAndriy -
                          У редактора String нет дополнительного окна редактирования, что то вы путаете.
                          ExpandedWrap disabled
                            TMyComponent = class(TComponent)
                              private
                                fAbout: string;
                                procedure SetAbout(const Value: string);
                              published
                                property About: string read fAbout write SetAbout;
                              end;
                             
                             TAboutDlgProperty = class(TStringProperty)
                              public
                                function GetAttributes: TPropertyAttributes; override;
                                procedure Edit; override;
                              end;
                             
                             
                            implementation
                             
                            procedure Register;
                            begin
                              RegisterComponents('Standard', [TMyComponent]);
                              RegisterPropertyEditor(TypeInfo(String), TMyComponent, 'About', TAboutDlgProperty)
                            end;
                             
                            procedure TMyComponent.SetAbout(const Value: string);
                            begin
                            end;
                             
                            { TAboutDlgProperty }
                             
                            function TAboutDlgProperty.GetAttributes: TPropertyAttributes;
                            begin
                              Result := [paDialog];
                            end;
                             
                            procedure TAboutDlgProperty.Edit;
                            begin
                              with TForm.Create(nil) do
                              try
                                ShowModal
                              finally
                                Free;
                              end;
                            end;
                             
                            end.
                            Доброе утро!

                            Я так и сделал, точно по Вашему последнему коду, но у меня появляется вот такое диалоговое окно как Вы можете видеть в аттач.
                            У меня Delphi 2010. Может в этом проблема? Подскажите, Мастера, как все же можно вызвать просто свою собственную форму.

                            Спасибо.

                            Прикреплённый файлПрикреплённый файлpropert_editor.jpg (26,96 Кбайт, скачиваний: 540)
                              Не знаю, вот Delphi 2009

                              Прикреплённый файлПрикреплённый файлMyComponent.JPG (28,55 Кбайт, скачиваний: 561)
                                Думается мне, что процедуру Register нужно либо самому явно вызывать в initialization модуля, либо хотя бы объявить в interface
                                  Покажите весь код модуля с формой и регистрацией
                                    с процедурой Register все нормально. вызывается где положено. а выскакивает окно редакторования строки. Почему?
                                    Спасибо
                                      сейчас должен ехать в институт, вечером выложу. спасибо. просто магия какая-то с этим окном.
                                        все получилось, виной модуль стороннего компонента был. спасибо.
                                        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                        0 пользователей:


                                        Рейтинг@Mail.ru
                                        [ Script execution time: 0,0843 ]   [ 21 queries used ]   [ Generated: 20.04.24, 01:32 GMT ]