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

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

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


Страницы: (3) 1 [2] 3  все  ( Перейти к последнему сообщению )  
> TBitmap как published-свойство, Возможность инициализации в диспетчере объектов
    Что в топку - это я понимаю.Процентов сорок - неубитые следы неудачных экспериментов(Это к вопросу "зачем?") То же самое с инвалидейтом. А можно поподробнее об "видно, что битмап не уничтожается, в случае установки битмапа снаружи, внутренний так же потерян."?

    Добавлено
    Виноват, недостаточно грамотен, прошу уточнения - теги [сode=pas] ... [/сode] -скобки ставим?
      Итак, разберём конструктор
      ExpandedWrap disabled
        constructor TMnSch.Create;
        begin
          inherited Create(AOwner);
          BGBitmap:=TBitmap.Create; // создаём BitMap
          fView:= BGBitmap;         // назначаем картинку картинке (не понятно зачем)
          fBG:=TImage.Create(AOwner); // создаём рисунок, причём сразу же назначаем его
                                      // поскольку записываем не в поле а в свойство
                                      // по идее нужно BGImage := TImage.Create(AOwner);
          invalidate;                 // перерисовываем компонент (это вообще не нужно)
          fField:=nil;
        end;

      Разберитесь с наименованием объектов. поля нужно именовать с буквы "f", а свойства без префикса. У вас же почему-то наоборот


      ExpandedWrap disabled
        procedure TMnSch.SetBGBitmap(Value: TBitmap);
        begin
          fView.Assign(Value); // здесь нужно присваивать не СВОЙСТВУ а ПОЛЮ
          invalidate;
        end;
        Ну-у... По крайней мере, не пытается читать с нулевого адреса, сглатывает и запоминает файл, назначенный битмэпу.НО НЕ ОТОБРАЖАЕТ!!На экране - тот же пустой серенький квадратик. И насчет полей: у Фленова, с которого я бессовестно копировал исходники, это слово не упоминается в разделе "разработка компонентов". Так что я не в теме - что есть "поле", а что есть "свойство". Если не напряжет, просветите?
          ExpandedWrap disabled
            TMyComponent = class(TComponent)
              private
                fIntVal: integer; // поле, поля начинаются с буквы "f"
              published
                property IntVal: integer read fIntVal write fIntVal; // свойство, которое ссылается на поле
            end;

          И не верю я что у Феленова в разработке компонентов этого нет

          Добавлено
          Что значит "НО ОТОБРАЖАЕТ" ? А где он должен его отображать ? Опишите вашу задачу, что вы хотите получить вообще, а то получается диалог слепого и глухого.
          Сообщение отредактировано: DimaBr -
            Цитата rdx0 @
            сглатывает и запоминает файл, назначенный битмэпу.НО НЕ ОТОБРАЖАЕТ!!На экране - тот же пустой серенький квадратик.

            Тебе уже русским языком объяснили, что
            1) TBitmap это просто хранилище картинки, которая сама по себе нигде и никак не отображается.
            2) Для отображения картинок есть компонент TImage, но у него уже есть свое собственное хранилище bmp-картинки - TImage.Picture.Bitmap. Поэтому отдельное\независимое поле BGBitmap:TBitmap тут вообще не нужно - достаточно только TImage (с загрузкой картинки через св-во Picture в дизайне или рантайме).
            и еще
            3) Чтобы TImage отображал загруженную картинку, ему нужно назначить св-во Parent - оконный контрол, на канве которого будет рисоваться изображение. Если св-во Parent не установлено, или Parent-контрол не видим (Visible:=false или закрыт другим контролом), то соотв-но и никакая картинка рисоваться не будет.
            4) Но в качестве контейнера ты используешь TPageControl, который хоть и является оконным, но предназначен только для отображения своих ярлычков и вкладок Pages:TTabSheet. Поэтому непосредственно на TPageControl поместить какой-то контрол в дизайнере просто невозможно, а если в рантайме назначить этому контролу Parent:=PageControl, то он будет просто не видимым. Поэтому, чтобы твой Image нормально отображался в PageControl ему нужно установить в качестве Parent какой-то конкретный TabSheet этого PageControl-а.
              Цитата rdx0 @
              Так что я не в теме - что есть "поле", а что есть "свойство".

              Свойство это property, для которого заданы способы\методы чтения (read) и записи (write). Если ты присваиваешь значение полю, например BGImage:=TImage.Create(AOwner), то присваиваемое значение непосредственно записывается в это поле (как в переменную), а если свойству fBG, для которого определен метод записи SetBGImage, то присваиваемое значение передается в этот метод, а там: :o опаньки - вместо простой записи стоит fBG.Assign(Value), но т.к. в конструкторе все неинициализированные поля, включая fBG, равны nil, то получается обращение к nil-объекту и соотв-но:
              Цитата rdx0 @
              С TImage тоже не срослось, та же попытка чтения с адреса 0 :(
              - присваивал бы не свойству, а полю - все срослось бы :)
              Сообщение отредактировано: leo -
                1. To Moderator:
                У Фленова я даже текстовый поиск включал... Забыл обложку, но файл, по-моему, называется DelphyBib.rar.
                Руководство называет это мнемосхемой. Т.е. подложенная картинка, отображающая схему производственного процесса, на которую мне нужно набросать активные управляемые элементы.

                Добавлено
                2.To Guru:
                Да битмэп я уже выкинул, имиджу парент проверю.(См.выше - нужен именно дизайн-тайм). Спасибо за понимание, на работе завал, раньше понедельника не успею осознать..
                  Вот только сегодня дотянулись руки.. Нет у имиджа парентов, только парентшоухинт! А в дизайнере самому TImage сопоставлен комбобокс, но если я пытаюсь 1)положить на TForm заранее заготовленный имидж 2)Для свойства моего компонента класса TImage выбрть его из комбобокса, где он появился 3)Наблюдаю окно с ошибкой "Не могу присвоить класс TImage классу TImage"
                  Перечитал текст - полный бред, прошу прощения за квадратную голову ((
                    Ещё раз ! Объясните, что ваш компонент ДОЛЖЕН делать.
                      Так. Это сущность, унаследованная от TPageControl, на первом листе которого должнра быть нарисована картинка, содержащая схему испытательного стенда. И на эту схему в дизайн тайме мне нужно накидать в нужных местах нужных размеров управляемых элементов. Чессслово, я не знаю, что Вас не устраивает в объяснении :(
                        Цитата rdx0 @
                        Нет у имиджа парентов, только парентшоухинт!

                        Parent есть у всех контролов, только это не published-свойство, а public, которое устанавливается в рантйме. Для контролов, созданных в дизайнере, оно присваивается автоматически при загрузке формы из dfm в зависимости от того на каком родительском конроле расположен данный контрол. Раз ты сам создаешь Image, то и сам должен установить ему свойство Parent или вызвать метод InsertControl его родителя.
                        А также
                        Цитата rdx0 @
                        в дизайнере самому TImage сопоставлен комбобокс

                        - это поведение по умолчанию для присваивания свойству внешнего контрола. Если контрол у тебя уже создан, и тебе нужно обеспечить доступ к его свойствам в дизайнере, то нужно сразу после создания этого контрола (в конструкторе панели) вызвать его метод SetSubComponent(true)
                        ExpandedWrap disabled
                             ...
                             FBGImage:=TImage.Create(Self);
                             FBGImage.SetSubComponent(true);
                             FBGImage.Parent:=Pages[0];
                             ... //установка прочих св-в, например Align:=alClient;
                        Сообщение отредактировано: leo -
                          То есть вы хотите, что бы при заброске компонента на форму (наследника TPageControl), в нём уже была одна страница, на которой был TImage ?

                          Идея прогрессивная, реализация возможна, но возникает несколько вопросов:
                          1. А нужен ли такой КОМПОНЕНТ ?
                          2. Вы собираетесь его использовать в нескольких местах ?
                          3. Почему именно TPageControl, а не TPanel ?
                          4. Что будет если удалить первую страницу ?
                            To Guru:
                            Мне нужен именно дизайн-тайм. Если можно, поподробнее об "метод SetSubComponent(true)", а то мне справка какую-то фигню несет ((
                            To Moderator^
                            1.Ну, а чем плохо?
                            2.Пока в одном, но есть перспективы. Расчитываю, как на тематический рост
                            3.Пэйдж, ибо хотелось бы на соседних вкладках иметь графики, протокол событий и настройку железа
                            4.Зачем? И кому я это разрешу?
                              Цитата rdx0 @
                              Если можно, поподробнее об "метод SetSubComponent(true)", а то мне справка какую-то фигню несет ((

                              В справке помимо основного описания есть еще ссылки See also на ту же тему...

                              Суть в том, что (по умолчанию) в dfm-файл сохраняются свойства только тех компонентов, Owner-ом которых является форма. К ним относятся все компоненты "брошенные" на форму в дизайне. Если какой-то из компонентов формы имеет св-во также являющееся компонентом, то по умолчанию предполагается, что это ссылка на некий другой компонент формы. Соотв-но в инспекторе объектов для этого свойства отображается комбобокс, в котором перечислены все компоненты формы данного типа, которые можно присвоить в качестве ссылки данному свойству.
                              Чтобы изменить такое поведение по умолчанию, у TComponent предусмотрен ComponentStyle = csSubComponent и метод SetSubComponent, который устанавливает этот стиль. Если установить этот стиль у компонента, являющегося свойством другого компонента, то это св-во рассматривается уже не как внешняя ссылка, а как встроенный суб-компонент, для которого нужно отображать\редактировать его свойства в дизайне и сохранять их в dfm-файл.
                              Простейшим примером такого встроенного компонента является EditLabel:TBoundLabel компонента TLabeledEdit. В конструкторе TBoundLabel вызывается метод SetSubComponent(true), устанавливающий у EditLabel стиль csSubComponent. Поэтому в дизайне этому свойству сопоставляется не комбобокс, а раскрывающийся список свойств EditLabel.
                                1.Ну, а чем плохо?
                                Плохо то, что вы пытаетесь единовременную задачу заключить в компонент, при этом не обладаете даже минимумом знаний
                                3.Пэйдж, ибо хотелось бы на соседних вкладках иметь графики, протокол событий и настройку железа
                                Что мешает забросить ВАШ новоявленный компонент на TPageControl или куда либо ещё ?
                                4.Зачем? И кому я это разрешу?
                                Если компонент будет установлен в дизайнере, то любой сможет добавить новые страницы (это же TPageControl) и соответственно удалить их
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (3) 1 [2] 3  все




                                Рейтинг@Mail.ru
                                [ Script Execution time: 0,1260 ]   [ 18 queries used ]   [ Generated: 17.11.17, 23:14 GMT ]