Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Не инициализируются переменные в конструкторе [D6, Win2k]


Plotnick ©   (2006-02-28 16:44:00) 

Создаю компонент от TGraphicControl.
В конструкторе производится инициализация начальными значениями. Ну, например...

 
 FBtnWidths := 20;

 FVertMovement := False;
 FMaxValue := Now;
 FMinValue := FMaxValue - 90;
 FMaxHeight := 68;
 FMinHeight := 0;


Эти значения используются в

procedure Paint; override;


Однако при первом вызове Paint все они оказываются непроинициализированными. Так, например FBtnWidths оказывается равной нулю.

Что я не так делалю или не делаю?


ancara   (2006-03-03 13:24:00) [1]


> Гошик Кувшинов   (03.03.06 12:21) [9]

конструктор предка создаёт окно и сразу его показывает и тогда первый вызов paint будет раньше


невозможно, т.к. для рисования нужно DC, а без Parent'а его не получить,
поэтому после Create будет SetParent и только потом Paint. Вызов Paint без Parent'а приведет к собщению
Control '' has no parent window.


Гошик Кувшинов   (2006-03-03 12:21:00) [2]

а ещё может быть, что конструктор предка создаёт окно и сразу его показывает и тогда первый вызов paint будет раньше, чем твой код в конструкторе. попробуй сделать присвоения до вызова inherited create


Юрий Зотов   (2006-03-01 10:02:00) [3]

> Plotnick   (28.02.06 17:28) [7]

Вся беда, похоже, не в этом, а в том, что в объявлении конструктора пропущено слово override.


Plotnick   (2006-02-28 17:28:00) [4]

Все, спасибо. Сам разобрался. Вся беда, похоже исключительно из-за дельфовых заморочек с работающими двумя копиями дельфи с одновременной правкой компонентов.


Plotnick   (2006-02-28 17:10:00) [5]


> Ищи по тексту, где у тебя идет присвоение значения FBtnWidths.


Есть такое место:
procedure TEZGraphScroll.SetBtnWidths(const Value: Integer);

Однако, чуть выше я написал про битмап. Все то же самое.
Кроме того, те значения которые я задаю в конструкторе, не отображаются в ObjectInspectore. То есть не происходит начальная инициаизация при помещении компонента на форму.


Reindeer Moss Eater   (2006-02-28 17:06:00) [6]

Волшебство бывает, но не в программировании.
У тебя есть приватное поле, объявленное в конкретном классе.
Изменения значения поля возможны только операциями присвоения.
Ищи по тексту, где у тебя идет присвоение значения FBtnWidths.


Plotnick   (2006-02-28 17:06:00) [7]

Еще такой момент:
Если я в конструкторе напишу Bitmap := TBitmap.Create
то конструктор отработает и Bitmap создастся, но в Paint он становится равен nil, хотя такого приравнивания у меня нет в коде.

И еще, на компоненте у меня руками создаются кнопки со стрелками, стрелки в виде битмапов загружаются из ресурсов. Но в дизайнтайме дельфи кричит, что ресурс не найден, хотя в рилтайме все работает.


Plotnick   (2006-02-28 16:58:00) [8]


constructor TEZGraphScroll.Create(AOwner: TComponent);
begin
 inherited Create(AOwner);
 Width := 260;
 Height := 70;

 FBtnWidths := 20;

 FVertMovement := False;
 FMaxValue := Now;
 FMinValue := FMaxValue - 90;
 FMaxHeight := 68;
 FMinHeight := 0;
 FViewHeight := FMaxHeight - FMinHeight;
 FViewWidth := FViewHeight/GetTimeInOneHorzPixel;
 FHorzPos := FMinValue;
 FVertPos := FMinHeight;

 CustomDrawBk := False;
 CustomDrawView := False;
 BkColor := clWhite;
 ViewColor := clRed;

end;

procedure TEZGraphScroll.DrawButtons;
var
 BtnHeight: Integer;
 LeftR,RightR: TRect;
 Border: Integer;
 BmWidth: Integer;
 LeftBmP,RightBmP: TPoint;
begin
   BtnHeight := Height;
   LeftR := Rect(0,0,FBtnWidths,BtnHeight);
   RightR := Rect(Width - FBtnWidths,0,Width,BtnHeight);

   if FLeftBtnDown then
     Border := BDR_SUNKENOUTER
   else
     Border := BDR_RAISEDINNER;

............................


Можно чуть конкретнее, что именно привести?


Plotnick   (2006-02-28 16:56:00) [9]

Точнее так. Если через ObjectInspector, то все получается. А если в конструкторе, то нет. Это касается, как published, так и не published свойств.


MBo   (2006-02-28 16:47:00) [10]

>Что я не так делалю или не делаю?
Более полный код приведи


Наверх

Титульная страница Поиск, карта сайта Написать письмо