![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как правильно реализовать AutoSize?
ProgRAMmer Dimonych © (2013-04-03 23:44:00)Пишу наследника от TCustomControl: рисует древовидную структуру с доп. данными. Добился корректной отрисовки при AutoSize = False.
Если установить AutoSize в True, после запуска приложения размеры контрола оказываются нулевыми. Соответственно метод Paint никогда не вызывается — всё. Попробовал делать SetBounds(). В конструкторе — рано, в переопределённом методе Loaded — видимо, тоже.
Полистал исходники VCL, реализацию TImage, TCustomEdit… Ответа не нашёл: слишком много приходится прыгать по методам.
Подскажите, пожалуйста, как правильно реализовать поддержку AutoSize в своём контроле?
ProgRAMmer Dimonych (2013-04-04 00:45:00) [1]> [1] clickmaker © (04.04.13 00:17)
Эм-м-м, пробовал в процессе поиска — не помогло. Сейчас добавил — сработало. Отличие, видимо, в том, что сделал, как и в TImage, отдельный метод, который вызывается каждый раз, когда изменяется картинка.
Спасибо.
---
Если кто-нибудь вдруг будет искать, примерно такого содержания:
procedure TMyTree.TreeChanged;
begin
PreCalcSize; // Рассчитывает координаты узлов, помещает желательные размеры в FReqWidth и FReqHeight
if AutoSize then
SetBounds(Left, Top, FReqWidth, FReqHeight);
if not FDrawing then Invalidate;
end;
По образу и подобию TImage.PictureChanged. CanAutoSize тоже по образу и подобию: ширину-высоту картинки заменил на свои.
clickmaker (2013-04-04 00:17:00) [2]наверно, по аналогии. Где вместо Picture.Width/Height размеры твоей древовидной структуры
function TImage.CanAutoSize(var NewWidth, NewHeight: Integer): Boolean;
begin
Result := True;
if not (csDesigning in ComponentState) or (Picture.Width > 0) and
(Picture.Height > 0) then
begin
if Align in [alNone, alLeft, alRight] then
NewWidth := Picture.Width;
if Align in [alNone, alTop, alBottom] then
NewHeight := Picture.Height;
end;
end;