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

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

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


Страницы: (3) [1] 2 3  все  ( Перейти к последнему сообщению )  
> TBitmap как published-свойство , Возможность инициализации в диспетчере объектов
    Прошу прощения, если получится дубликат -
    Пробую создать класс от TTabControl(Шаблон брал из М. Фленова - Библия Делфи - создание графических часов). Объявляю published-свойство типа TBitmap Прописываю для него read,write. Компилится, устанавливается новым компонентом на мою вкладку. При попытке задать в диспетчере объектов стартовую картинку через редактор рисунков дает Acsess violation. Спинной мозг подсказывает, что память еще не назначена и машине трудно что-либо записать в адрес 0х00000000. Чего я не учел?
      Цитата rdx0 @
      Чего я не учел?

      FBitmap := TBitmap.Create в конструкторе?
        Неет... А разве до конструктора доходит ход в дизайнтайме?
          ясен пень доходит. Как же контролы на форме появляются?
            То есть, если я Вас правильно понял, в конструкторе моего TChild (TTabControl) нужно FBitMap·у уже что-то присвоить? И не ссылку на файл, который мне хотелось бы задать из диспетчера объектов?
              Цитата rdx0 @
              нужно FBitMap·у уже что-то присвоить? И не ссылку на файл,

              Чтобы загрузить файл в битмап, надо этот битмап создать сначала.
              Наиболее логично это делать в конструкторе компонента-владельца.
              Сообщение отредактировано: Relaxander -
                Уверен, не понимаю, что делаю :(. Пробовал в конструкторе вбить Picture:=TBitmap.Create- вообще не дает поместить компонент на форму - Acsess violation. Создал в классе заглушечный битмэп, откриэйтил его в конструкторе и присвоил его значение моему свойству. Теперь проект вроде бы и не возражает, но на месте моего битмэпа рисует серый квадрат малевича... (Кстати, моя версия хэлпа утверждает, что TBitmap.Create - исключительно для рантайма) Может, его нужно как-то на канве отрисовать? invalidate и refresh не помогают...
                  Цитата rdx0 @
                  Picture:=TBitmap.Create- вообще не дает поместить компонент на форму - Acsess violation

                  Picture - это что?
                    Это как раз мной создаваемое published-свойство. То есть, без проставки заставить заработать не сумел..
                      Код в студию, зачем угадывать что вы там написали
                        Цитата rdx0 @
                        Это как раз мной создаваемое published-свойство. То есть, без проставки заставить заработать не сумел..

                        TBitmap - это не визуальный контрол, и даже не TComponent. Поэтому при загрузке формы он автоматически не создается, его нужно самому создавать в конструкторе родительского компонента. К тому же это просто хранилище картинки со средствами ее программного "рисования" в памяти, а выводить\копировать эту картинку на экран нужно либо самому "ручками", либо использовать для этого стандартный компонент TImage. Для чего тебе понадобился именно TBitmap? Используй TImage и не парься :)
                          To DimaBr:
                          Если я верно понял, код компонента, пытающегося использовать битмэп?
                          To Guru:
                          С TImage тоже не срослось, та же попытка чтения с адреса 0 :(
                            Конечно код компонента, хотя бы те места где вы объявляете свойство, создаёте и назначаете его
                              Боюсь замусорить тему, но затрудняюсь ркшить, что значимо- а что нет. Поэтому вот:

                              unit MnSch;

                              interface

                              uses
                              SysUtils, Classes, Controls, ComCtrls, StdCtrls, Graphics, ExtCtrls;

                              type
                              EnumStates=(eOff,eReady,eStart,eOper,eStop,eFault,eMan);
                              TMnSch = class(TPageControl)
                              private
                              { Private declarations }
                              fStates: EnumStates;
                              fItemList: TList;
                              procedure SetBGBitmap(Value:TBitmap);
                              procedure SetBGImage(Value:TImage);
                              protected
                              { Protected declarations }
                              public
                              { Public declarations }
                              fDBChanged: TNotifyEvent;
                              BGBitmap: TBitmap;
                              BGImage: TImage;
                              fInt :integer;
                              fField: TEdit;
                              constructor Create(Aowner:TComponent); override;
                              destructor Destroy; override;
                              procedure GetState;
                              Procedure SetState;
                              procedure Proc1(par1:integer);
                              published
                              { Published declarations }
                              PROPERTY fView: TBitmap read BGBitmap write SetBGBitmap;
                              PROPERTY fBG: TImage read BGImage write SetBGImage;
                              property OnDBChanged: TNotifyEvent read fDBChanged write fDBChanged;
                              end;

                              procedure Register;

                              implementation
                              uses Amber_it, Amber_log, Amber_wr;

                              procedure Register;
                              begin
                              RegisterComponents('RZ', [TMnSch]);
                              end;

                              constructor TMnSch.Create;
                              begin
                              inherited Create(AOwner);
                              BGBitmap:=TBitmap.Create;
                              fView:= BGBitmap;
                              fBG:=TImage.Create(AOwner);
                              invalidate;
                              fField:=nil;
                              end;

                              destructor TMnSch.Destroy;
                              begin
                              inherited Destroy;
                              end;

                              procedure TMnSch.SetBGBitmap(Value: TBitmap);
                              begin
                              fView.Assign(Value);
                              invalidate;
                              end;

                              procedure TMnSch.SetBGImage(Value:TImage);
                              begin
                              fBG.Assign(Value);
                              invalidate;
                              end;

                              //*******************************************************

                              procedure TMnSch.GetState;
                              begin;
                              end;

                              procedure TMnSch.SetState;
                              begin;
                              end;

                              procedure TMnSch.Proc1(par1:integer);
                              begin;
                              fField.Text:=IntToStr(par1);
                              end;

                              end.
                                Ужасно. Даже не вникая что тут вообще происходит видно, что битмап не уничтожается, в случае установки битмапа снаружи, внутренний так же потерян. с BG тоже самое. Инвалидейт в конструкторе... хм...
                                В общем, в топку.

                                Только сейчас обратил внимание...
                                BGBitmap: TBitmap;
                                BGImage: TImage;
                                в паблике! Зачем?

                                короче, нафиг.
                                Сообщение отредактировано: Andy BitOff -
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (3) [1] 2 3  все




                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0418 ]   [ 17 queries used ]   [ Generated: 19.03.24, 02:50 GMT ]