Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.217.220.114] |
|
Страницы: (3) 1 [2] 3 все ( Перейти к последнему сообщению ) |
Сообщ.
#16
,
|
|
|
Что в топку - это я понимаю.Процентов сорок - неубитые следы неудачных экспериментов(Это к вопросу "зачем?") То же самое с инвалидейтом. А можно поподробнее об "видно, что битмап не уничтожается, в случае установки битмапа снаружи, внутренний так же потерян."?
Добавлено Виноват, недостаточно грамотен, прошу уточнения - теги [сode=pas] ... [/сode] -скобки ставим? |
Сообщ.
#17
,
|
|
|
Итак, разберём конструктор
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", а свойства без префикса. У вас же почему-то наоборот procedure TMnSch.SetBGBitmap(Value: TBitmap); begin fView.Assign(Value); // здесь нужно присваивать не СВОЙСТВУ а ПОЛЮ invalidate; end; |
Сообщ.
#18
,
|
|
|
Ну-у... По крайней мере, не пытается читать с нулевого адреса, сглатывает и запоминает файл, назначенный битмэпу.НО НЕ ОТОБРАЖАЕТ!!На экране - тот же пустой серенький квадратик. И насчет полей: у Фленова, с которого я бессовестно копировал исходники, это слово не упоминается в разделе "разработка компонентов". Так что я не в теме - что есть "поле", а что есть "свойство". Если не напряжет, просветите?
|
Сообщ.
#19
,
|
|
|
TMyComponent = class(TComponent) private fIntVal: integer; // поле, поля начинаются с буквы "f" published property IntVal: integer read fIntVal write fIntVal; // свойство, которое ссылается на поле end; И не верю я что у Феленова в разработке компонентов этого нет Добавлено Что значит "НО ОТОБРАЖАЕТ" ? А где он должен его отображать ? Опишите вашу задачу, что вы хотите получить вообще, а то получается диалог слепого и глухого. |
Сообщ.
#20
,
|
|
|
Цитата 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-а. |
Сообщ.
#21
,
|
|
|
Цитата rdx0 @ Так что я не в теме - что есть "поле", а что есть "свойство". Свойство это property, для которого заданы способы\методы чтения (read) и записи (write). Если ты присваиваешь значение полю, например BGImage:=TImage.Create(AOwner), то присваиваемое значение непосредственно записывается в это поле (как в переменную), а если свойству fBG, для которого определен метод записи SetBGImage, то присваиваемое значение передается в этот метод, а там: опаньки - вместо простой записи стоит fBG.Assign(Value), но т.к. в конструкторе все неинициализированные поля, включая fBG, равны nil, то получается обращение к nil-объекту и соотв-но:- присваивал бы не свойству, а полю - все срослось бы |
Сообщ.
#22
,
|
|
|
1. To Moderator:
У Фленова я даже текстовый поиск включал... Забыл обложку, но файл, по-моему, называется DelphyBib.rar. Руководство называет это мнемосхемой. Т.е. подложенная картинка, отображающая схему производственного процесса, на которую мне нужно набросать активные управляемые элементы. Добавлено 2.To Guru: Да битмэп я уже выкинул, имиджу парент проверю.(См.выше - нужен именно дизайн-тайм). Спасибо за понимание, на работе завал, раньше понедельника не успею осознать.. |
Сообщ.
#23
,
|
|
|
Вот только сегодня дотянулись руки.. Нет у имиджа парентов, только парентшоухинт! А в дизайнере самому TImage сопоставлен комбобокс, но если я пытаюсь 1)положить на TForm заранее заготовленный имидж 2)Для свойства моего компонента класса TImage выбрть его из комбобокса, где он появился 3)Наблюдаю окно с ошибкой "Не могу присвоить класс TImage классу TImage"
Перечитал текст - полный бред, прошу прощения за квадратную голову (( |
Сообщ.
#24
,
|
|
|
Ещё раз ! Объясните, что ваш компонент ДОЛЖЕН делать.
|
Сообщ.
#25
,
|
|
|
Так. Это сущность, унаследованная от TPageControl, на первом листе которого должнра быть нарисована картинка, содержащая схему испытательного стенда. И на эту схему в дизайн тайме мне нужно накидать в нужных местах нужных размеров управляемых элементов. Чессслово, я не знаю, что Вас не устраивает в объяснении
|
Сообщ.
#26
,
|
|
|
Цитата rdx0 @ Нет у имиджа парентов, только парентшоухинт! Parent есть у всех контролов, только это не published-свойство, а public, которое устанавливается в рантйме. Для контролов, созданных в дизайнере, оно присваивается автоматически при загрузке формы из dfm в зависимости от того на каком родительском конроле расположен данный контрол. Раз ты сам создаешь Image, то и сам должен установить ему свойство Parent или вызвать метод InsertControl его родителя. А также Цитата rdx0 @ в дизайнере самому TImage сопоставлен комбобокс - это поведение по умолчанию для присваивания свойству внешнего контрола. Если контрол у тебя уже создан, и тебе нужно обеспечить доступ к его свойствам в дизайнере, то нужно сразу после создания этого контрола (в конструкторе панели) вызвать его метод SetSubComponent(true) ... FBGImage:=TImage.Create(Self); FBGImage.SetSubComponent(true); FBGImage.Parent:=Pages[0]; ... //установка прочих св-в, например Align:=alClient; |
Сообщ.
#27
,
|
|
|
То есть вы хотите, что бы при заброске компонента на форму (наследника TPageControl), в нём уже была одна страница, на которой был TImage ?
Идея прогрессивная, реализация возможна, но возникает несколько вопросов: 1. А нужен ли такой КОМПОНЕНТ ? 2. Вы собираетесь его использовать в нескольких местах ? 3. Почему именно TPageControl, а не TPanel ? 4. Что будет если удалить первую страницу ? |
Сообщ.
#28
,
|
|
|
To Guru:
Мне нужен именно дизайн-тайм. Если можно, поподробнее об "метод SetSubComponent(true)", а то мне справка какую-то фигню несет (( To Moderator^ 1.Ну, а чем плохо? 2.Пока в одном, но есть перспективы. Расчитываю, как на тематический рост 3.Пэйдж, ибо хотелось бы на соседних вкладках иметь графики, протокол событий и настройку железа 4.Зачем? И кому я это разрешу? |
Сообщ.
#29
,
|
|
|
Цитата rdx0 @ Если можно, поподробнее об "метод SetSubComponent(true)", а то мне справка какую-то фигню несет (( В справке помимо основного описания есть еще ссылки See also на ту же тему... Суть в том, что (по умолчанию) в dfm-файл сохраняются свойства только тех компонентов, Owner-ом которых является форма. К ним относятся все компоненты "брошенные" на форму в дизайне. Если какой-то из компонентов формы имеет св-во также являющееся компонентом, то по умолчанию предполагается, что это ссылка на некий другой компонент формы. Соотв-но в инспекторе объектов для этого свойства отображается комбобокс, в котором перечислены все компоненты формы данного типа, которые можно присвоить в качестве ссылки данному свойству. Чтобы изменить такое поведение по умолчанию, у TComponent предусмотрен ComponentStyle = csSubComponent и метод SetSubComponent, который устанавливает этот стиль. Если установить этот стиль у компонента, являющегося свойством другого компонента, то это св-во рассматривается уже не как внешняя ссылка, а как встроенный суб-компонент, для которого нужно отображать\редактировать его свойства в дизайне и сохранять их в dfm-файл. Простейшим примером такого встроенного компонента является EditLabel:TBoundLabel компонента TLabeledEdit. В конструкторе TBoundLabel вызывается метод SetSubComponent(true), устанавливающий у EditLabel стиль csSubComponent. Поэтому в дизайне этому свойству сопоставляется не комбобокс, а раскрывающийся список свойств EditLabel. |
Сообщ.
#30
,
|
|
|
1.Ну, а чем плохо?
Плохо то, что вы пытаетесь единовременную задачу заключить в компонент, при этом не обладаете даже минимумом знаний 3.Пэйдж, ибо хотелось бы на соседних вкладках иметь графики, протокол событий и настройку железа Что мешает забросить ВАШ новоявленный компонент на TPageControl или куда либо ещё ? 4.Зачем? И кому я это разрешу? Если компонент будет установлен в дизайнере, то любой сможет добавить новые страницы (это же TPageControl) и соответственно удалить их |