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

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

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

    Так вот все работает почти как надо но все таки не так.
    Вот код моего компонента
    ExpandedWrap disabled
      unit myComponent;
       
      interface
       
      uses
        SysUtils, Classes, Menus, acntUtils, sSkinManager;
       
      type
        TmyComponent = class(TComponent)
        private
          FMyMainMenuItem: TMenuItem;
          FSkinManager: TsSkinManager;
          procedure SetMyMainMenuItem(const Value: TMenuItem);
          procedure FillMyMainMenuItem(parentMI: TMenuItem);
          procedure SetSkinManager(const Value: TsSkinManager);
          { Private declarations }
        protected
          { Protected declarations }
          procedure MenuItemClick(Sender: TObject);
        public
          { Public declarations }
        published
          { Published declarations }
          property MyMainMenuItem: TMenuItem read FMyMainMenuItem write SetMyMainMenuItem;
          property SkinManager: TsSkinManager read FSkinManager write SetSkinManager;
        end;
       
      procedure Register;
       
      implementation
       
      procedure Register;
      begin
        RegisterComponents('Samples', [TmyComponent]);
      end;
       
      { TmyComponent }
       
      procedure TmyComponent.FillMyMainMenuItem(parentMI: TMenuItem);
      var
        i: Integer;
        mi: TMenuItem;
        sl: TStringList;
      begin
        if csDesigning in ComponentState then
          Exit;
        if Assigned(parentMI) and Assigned(FSkinManager) then
        begin
          parentMI.Clear;
          sl := TStringList.Create;
          try
            FSkinManager.GetExternalSkinNames(sl);
            for i := 0 to sl.Count - 1 do
            begin
              mi := TMenuItem.Create(parentMI);
              mi.Name := 'MyExtMenu_' + IntToStr(i);
              mi.Caption := sl[i];
              mi.Checked := mi.Caption = FSkinManager.SkinName;
              mi.OnClick := MenuItemClick;
              mi.RadioItem := True;
              if (i <> 0) and (i mod 20 = 0) then
                mi.Break := mbBreak;
              parentMI.Add(mi);
            end;
          finally
            FreeAndNil(sl);
          end;
        end;
      end;
       
      procedure TmyComponent.MenuItemClick(Sender: TObject);
      begin
        FSkinManager.SkinName := DelChars(TMenuItem(Sender).Caption, '&');
        TMenuItem(Sender).Checked := True;
      end;
       
      procedure TmyComponent.SetMyMainMenuItem(const Value: TMenuItem);
      begin
        FMyMainMenuItem := Value;
        if Value <> nil then
        begin
          Value.FreeNotification(Self);
          FillMyMainMenuItem(value);
        end;
      end;
       
      procedure TmyComponent.SetSkinManager(const Value: TsSkinManager);
      begin
        FSkinManager := Value;
      end;
       
      end.

    Почти заключается в том что при старте программы пункты меню не создаются автоматом, но если в формкриэйт написать
    myComponent1.MyMainMenuItem := меню_айтем;
    то меню создается и все работает отлично.

    Как мне сделать чтобы пункты меню не создавались при старте проги без всяких там записей в формкриэйт?

    Добавлено
    Ах да значение для MyMainMenuItem в IDE установлено такое же какое я устанавливаю в формкриэйт.
      ибо когда загружается форма из ресурса то сначала присваивается MyMainMenuItem а потом SkinManager. и получается что условие if Assigned(parentMI) and Assigned(FSkinManager) then даст отрицательное значение.
        Как я понял вариант решения только один, это переназвать SkinManager например в aSkinManager тогда он бут грузится раньше и все заработает?
          нет. намного правильнее это сделать обновление меню и из SetSkinManager.
            действительно, ступил :D
              Зачем такие сложности? Сделай обычный класс, который будет создаваться в OnCreate формы и все
                Может так
                ExpandedWrap disabled
                  procedure TmyComponent.Loaded;
                  begin
                    inherited Loaded;
                    if Assigned(MyMainMenuItem) then FillMyMainMenuItem(MyMainMenuItem);
                  end;


                Добавлено
                А может лучше написать наследника TsSkinManager, который будет выполнять дополнительный функционал
                Сообщение отредактировано: DimaBr -
                  Цитата DimaBr @
                  А может лучше написать наследника TsSkinManager, который удет выполнять дополнительный функционал

                  возможно, но имхо лучше отдельный компонент
                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                  0 пользователей:


                  Рейтинг@Mail.ru
                  [ Script execution time: 0,0318 ]   [ 16 queries used ]   [ Generated: 27.04.24, 19:51 GMT ]