Не вызывается событие Paint

scorpyx
Дата: 08.07.2009 10:56:00
Доброго времени суток. Пишу компонент. Компонент состоит из 2 наследников от TCustomControl, При Creat компонента создаётся первый наследник, в конструкторе которого создаётся второй наследник:
constructor TSCChart.CreateSCChart(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FBuffer := TBitmap.Create;
  FBuffer.Width := Screen.Width;
  FBuffer.Height := Screen.Height;
  FRender := TGDIPGraphics.CreateGDIP;

  FScale := TScaleControl.CreateSC(Self.Parent); // собственно создание второго обьекта, наследника TCustomControl
end;
далее в перегруженом методе CreateWnd:
procedure TSCChart.CreateWnd;
begin
  inherited;
  FScale.Parent := Self.Parent;  // присваиваю парента
  FScale.Align := alLeft;
  FScale.Width := 100;
end;
Парент у обоих бьектов один и тот же, обьекты создаются и отображаются на форме нормально, у обоих обьектов перегружен метод Paint, и вот в чём загвоздка - первый обьект созданый от TSCChart перерисовывается нормально, а второй обьект который был создан внутри первого, не перерисовывается, в отладчике посмотрел к нему не приходит событие Paint, пробовал посадить на Api WM_Paint, событие так же не приходит. подскажите куда смотреть и копать. С уважением scorpyx/
DimaBr
Дата: 08.07.2009 11:40:20
Кода мало. Не ясно, как вызываетя CreateSCChart
scorpyx
Дата: 08.07.2009 11:53:26
DimaBr
Кода мало. Не ясно, как вызываетя CreateSCChart

вызывается вполне обычно, в креате формы:
procedure TfDiagram.FormCreate(Sender: TObject);
begin
  SCChart := TSCChart.CreateSCChart(Panel1);
  SCChart.Parent := Panel1;
  SCChart.Align := alClient;
end;
scorpyx
Дата: 08.07.2009 11:56:54
Так же было проверено, что Panel1 имеет 2 детей расположеных на ней, визуально я вижу обьект созданный от TScaleControl, но посылка к нему сообщений ни к чему не приводит, он нормально растягиваетсяпри изменении размера формы, но событие CanResize (перегруженное), не происходит. Пробовал создать обьект в креате формы, всё отлично отображается и происходит приём собщений.
scorpyx
Дата: 08.07.2009 12:23:01
Как ни странно но если я указываю FScale.Parent := Self.Parent.Parent (то есть Форма), то обьект отрабатывает как надо. Что то я совсем не пойму ничего.
scorpyx
Дата: 08.07.2009 13:32:54
В общем очень странная картина, не извесно почему, если я в креате формы:
procedure TfDiagram.FormCreate(Sender: TObject);
begin
  SCChart := TSCChart.CreateSCChart(Panel1);
  SCChart.Parent := Panel1;
  SCChart.Align := alClient;

  SCChart.Scale.Parent := Panel1; // присваиваю парент для обьекта
  SCChart.Scale.Width := 100;
  SCChart.Scale.Align := alLeft;
end;
всё проходит нормально, но это же коряво так как компонент должен сам создавать свои внутренние обьекты, сответсвенно и паренты им присваивать, вопрос остаётся открытым.
DimaBr
Дата: 08.07.2009 14:11:07
procedure TSCChart.SetParent(AParent: TWinControl);
begin
  inherited SetParent(AParent);
  if FScale = nil then exit;
  FScale.Parent := AParent;
end;
scorpyx
Дата: 08.07.2009 15:30:36
DimaBr, большое спасибо, помогло, немного переделал правда:
procedure TSCChart.SetParent(AParent: TWinControl);
begin
  inherited SetParent(AParent);
  if Assigned(FScale) then
    FScale.Parent := AParent;
end;
Но при удалении всё же возникает ошибка, как ни странно.
scorpyx
Дата: 08.07.2009 15:36:52
переделал в деструкторе метод удаления
был:
FScale.Free
теперь:
FreeAndNil(FScale);

Всё превосходно, ещё раз большое спасибо DimaBr.