Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Почему не работает метод TCanvas в конструкторе?


Автор: ivan219 16.1.2008, 06:31
Прослема собственно стостоит вот в чём:
Код

TFEdit = class(TCustomControl)
.
.
constructor TFEdit.Create(AOwner: TComponent);
begin
.
.
  Canvas.TextHeight('asdf');
end;

Если вызывать TextHeight, TextWidth класса Canvas в constructore то при помещении компонента на форму возникает такое сообщение "Control " has no parent window." интересно по чему?

Автор: MetalFan 16.1.2008, 09:07
потому, что у контрола еще не назначен парент во время выполнения кода конструктора.

Автор: ivan219 16.1.2008, 12:06
Что-то я не пойму ведь с Canvas работать можно там цвет стиль менять.
А проблема возникает вот в этой API функции
Код

Windows.GetTextExtentPoint32(FHandle, PChar(Text), Length(Text), Result);

И не понятно причём тут Parent smile 

Автор: ama_kid 16.1.2008, 12:27
Цитата
Что-то я не пойму ведь с Canvas работать можно там цвет стиль менять
Это ты работаешь с внутренними свойствами объекта Canvas, которые не зависят от внешних объектов, но FHandle - это хендл окна, с которым работает канва, т.е. в данном случае - должен быть хендл парента и пока он не присвоен - такая ошибка будет появляться... 
Как вариант - я обычно (когда уверен, где и как будет использоваться компонент) делаю так:
Код
constructor TXxxx.Create(AOwner: TComponent);
begin
  inherited;
  Parent:=AOwner as TWinControl;
  //здесь уже парент присвоен и можно делать любые действия
end;
ну и конечно в конструктор передаю владельца с рассчетом, что он и будет парентом...

Автор: MetalFan 16.1.2008, 12:35
ama_kid, не самый лучший способ, но как вариант конечно сойдет...
а лучше вынести доп.код в другой метод. например так:
Код

  TSomeClass.Init( AParent: TWinControl );
  begin
    Parent := AParent;
    ....
  end;

Автор: ivan219 17.1.2008, 00:46
Ну вобщем всё стало боле мене ясно, спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)