Форум: "Компоненты";
Текущий архив: 2006.10.22;
Скачать: [xml.tar.bz2];
ВнизНе инициализируются переменные в конструкторе Найти похожие ветки
← →
Plotnick (2006-02-28 16:44) [0]Создаю компонент от TGraphicControl.
В конструкторе производится инициализация начальными значениями. Ну, например...
FBtnWidths := 20;
FVertMovement := False;
FMaxValue := Now;
FMinValue := FMaxValue - 90;
FMaxHeight := 68;
FMinHeight := 0;
Эти значения используются в
procedure Paint; override;
Однако при первом вызове Paint все они оказываются непроинициализированными. Так, например FBtnWidths оказывается равной нулю.
Что я не так делалю или не делаю?
← →
MBo © (2006-02-28 16:47) [1]>Что я не так делалю или не делаю?
Более полный код приведи
← →
Plotnick (2006-02-28 16:56) [2]Точнее так. Если через ObjectInspector, то все получается. А если в конструкторе, то нет. Это касается, как published, так и не published свойств.
← →
Plotnick (2006-02-28 16:58) [3]
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;
............................
Можно чуть конкретнее, что именно привести?
← →
Reindeer Moss Eater © (2006-02-28 17:06) [4]Волшебство бывает, но не в программировании.
У тебя есть приватное поле, объявленное в конкретном классе.
Изменения значения поля возможны только операциями присвоения.
Ищи по тексту, где у тебя идет присвоение значения FBtnWidths.
← →
Plotnick (2006-02-28 17:06) [5]Еще такой момент:
Если я в конструкторе напишу Bitmap := TBitmap.Create
то конструктор отработает и Bitmap создастся, но в Paint он становится равен nil, хотя такого приравнивания у меня нет в коде.
И еще, на компоненте у меня руками создаются кнопки со стрелками, стрелки в виде битмапов загружаются из ресурсов. Но в дизайнтайме дельфи кричит, что ресурс не найден, хотя в рилтайме все работает.
← →
Plotnick (2006-02-28 17:10) [6]
> Ищи по тексту, где у тебя идет присвоение значения FBtnWidths.
Есть такое место:
procedure TEZGraphScroll.SetBtnWidths(const Value: Integer);
Однако, чуть выше я написал про битмап. Все то же самое.
Кроме того, те значения которые я задаю в конструкторе, не отображаются в ObjectInspectore. То есть не происходит начальная инициаизация при помещении компонента на форму.
← →
Plotnick (2006-02-28 17:28) [7]Все, спасибо. Сам разобрался. Вся беда, похоже исключительно из-за дельфовых заморочек с работающими двумя копиями дельфи с одновременной правкой компонентов.
← →
Юрий Зотов © (2006-03-01 10:02) [8]> Plotnick (28.02.06 17:28) [7]
Вся беда, похоже, не в этом, а в том, что в объявлении конструктора пропущено слово override.
← →
Гошик Кувшинов (2006-03-03 12:21) [9]а ещё может быть, что конструктор предка создаёт окно и сразу его показывает и тогда первый вызов paint будет раньше, чем твой код в конструкторе. попробуй сделать присвоения до вызова inherited create
← →
ancara © (2006-03-03 13:24) [10]
> Гошик Кувшинов (03.03.06 12:21) [9]
конструктор предка создаёт окно и сразу его показывает и тогда первый вызов paint будет раньше
невозможно, т.к. для рисования нужно DC, а без Parent"а его не получить,
поэтому после Create будет SetParent и только потом Paint. Вызов Paint без Parent"а приведет к собщениюControl "" has no parent window.
Страницы: 1 вся ветка
Форум: "Компоненты";
Текущий архив: 2006.10.22;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.046 c