Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.118.136.46] |
|
Страницы: (3) [1] 2 3 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Прошу прощения, если получится дубликат -
Пробую создать класс от TTabControl(Шаблон брал из М. Фленова - Библия Делфи - создание графических часов). Объявляю published-свойство типа TBitmap Прописываю для него read,write. Компилится, устанавливается новым компонентом на мою вкладку. При попытке задать в диспетчере объектов стартовую картинку через редактор рисунков дает Acsess violation. Спинной мозг подсказывает, что память еще не назначена и машине трудно что-либо записать в адрес 0х00000000. Чего я не учел? |
Сообщ.
#2
,
|
|
|
Цитата rdx0 @ Чего я не учел? FBitmap := TBitmap.Create в конструкторе? |
Сообщ.
#3
,
|
|
|
Неет... А разве до конструктора доходит ход в дизайнтайме?
|
Сообщ.
#4
,
|
|
|
ясен пень доходит. Как же контролы на форме появляются?
|
Сообщ.
#5
,
|
|
|
То есть, если я Вас правильно понял, в конструкторе моего TChild (TTabControl) нужно FBitMap·у уже что-то присвоить? И не ссылку на файл, который мне хотелось бы задать из диспетчера объектов?
|
Сообщ.
#6
,
|
|
|
Цитата rdx0 @ нужно FBitMap·у уже что-то присвоить? И не ссылку на файл, Чтобы загрузить файл в битмап, надо этот битмап создать сначала. Наиболее логично это делать в конструкторе компонента-владельца. |
Сообщ.
#7
,
|
|
|
Уверен, не понимаю, что делаю . Пробовал в конструкторе вбить Picture:=TBitmap.Create- вообще не дает поместить компонент на форму - Acsess violation. Создал в классе заглушечный битмэп, откриэйтил его в конструкторе и присвоил его значение моему свойству. Теперь проект вроде бы и не возражает, но на месте моего битмэпа рисует серый квадрат малевича... (Кстати, моя версия хэлпа утверждает, что TBitmap.Create - исключительно для рантайма) Может, его нужно как-то на канве отрисовать? invalidate и refresh не помогают...
|
Сообщ.
#8
,
|
|
|
Цитата rdx0 @ Picture:=TBitmap.Create- вообще не дает поместить компонент на форму - Acsess violation Picture - это что? |
Сообщ.
#9
,
|
|
|
Это как раз мной создаваемое published-свойство. То есть, без проставки заставить заработать не сумел..
|
Сообщ.
#10
,
|
|
|
Код в студию, зачем угадывать что вы там написали
|
Сообщ.
#11
,
|
|
|
Цитата rdx0 @ Это как раз мной создаваемое published-свойство. То есть, без проставки заставить заработать не сумел.. TBitmap - это не визуальный контрол, и даже не TComponent. Поэтому при загрузке формы он автоматически не создается, его нужно самому создавать в конструкторе родительского компонента. К тому же это просто хранилище картинки со средствами ее программного "рисования" в памяти, а выводить\копировать эту картинку на экран нужно либо самому "ручками", либо использовать для этого стандартный компонент TImage. Для чего тебе понадобился именно TBitmap? Используй TImage и не парься |
Сообщ.
#12
,
|
|
|
To DimaBr:
Если я верно понял, код компонента, пытающегося использовать битмэп? To Guru: С TImage тоже не срослось, та же попытка чтения с адреса 0 |
Сообщ.
#13
,
|
|
|
Конечно код компонента, хотя бы те места где вы объявляете свойство, создаёте и назначаете его
|
Сообщ.
#14
,
|
|
|
Боюсь замусорить тему, но затрудняюсь ркшить, что значимо- а что нет. Поэтому вот:
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. |
Сообщ.
#15
,
|
|
|
Ужасно. Даже не вникая что тут вообще происходит видно, что битмап не уничтожается, в случае установки битмапа снаружи, внутренний так же потерян. с BG тоже самое. Инвалидейт в конструкторе... хм...
В общем, в топку. Только сейчас обратил внимание... BGBitmap: TBitmap; BGImage: TImage; в паблике! Зачем? короче, нафиг. |