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

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

Странное поведение якорей TPanel+TEdit+Anchors [D7]


Sha ©   (2009-03-09 12:46:00) 

Вот с чем столкнулся. Отлаживаю компонент. Пытаюсь понять, почему он некорректно перерисовывает себя в ран-тайме (а именно, не действуют якоря у некоторых подкомпонентов).

Упрощенно все сводится к такому примеру. На форме - заякоренная по верху и по низу или выравненная панель, на панели - заякоренный по низу едит. При создании формы (в OnCreate) меняем, например, ее высоту и размер шрифта формы. В результате на время создания едит забывает про свои якоря.

Интересно, что если переставить операторы в FormCreate, то едит не теряет память.
Надеюсь, этому есть разумное объяснение...


unit Unit1;

interface

uses
 StdCtrls,
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Сontrols, Forms, Dialogs, ExtCtrls;

type
 TForm1 = class(TForm)
   Panel1: TPanel;
   Edit1: TEdit;
   Edit2: TEdit;
   procedure FormCreate(Sender: TObject);
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 Height:=Height+100;
 Font.Size:=10;
end;

end.

object Form1: TForm1
 Left = 192
 Top = 107
 Width = 293
 Height = 105
 Caption = 'Form1'
 Color = clBtnFace
 Font.Charset = DEFAULT_CHARSET
 Font.Color = clWindowText
 Font.Height = -11
 Font.Name = 'MS Sans Serif'
 Font.Style = []
 OldCreateOrder = False
 OnCreate = FormCreate
 DesignSize = (
   285
   78)
 PixelsPerInch = 96
 TextHeight = 13
 object Panel1: TPanel
   Left = 0
   Top = 0
   Width = 137
   Height = 78
   Align = alLeft
   Caption = 'Panel1'
   TabOrder = 0
   DesignSize = (
     137
     78)
   object Edit1: TEdit
     Left = 8
     Top = 47
     Width = 121
     Height = 21
     Anchors = [akLeft, akBottom]
     TabOrder = 0
     Text = 'Edit1'
   end
 end
 object Edit2: TEdit
   Left = 152
   Top = 48
   Width = 121
   Height = 21
   Anchors = [akLeft, akBottom]
   TabOrder = 1
   Text = 'Edit2'
 end
end


Германн   (2009-03-11 01:28:00) [1]


> Тимохов ©   (11.03.09 00:51) [7]
>
> Приветствуется любая информация о других компонетов, которые
> себя ведут также же плохо в аналогичном случе.
>

А разве того, что уже приведено Sha ©   (09.03.09 12:46) и  тобой мало?


Тимохов   (2009-03-11 00:51:00) [2]

Приветствуется любая информация о других компонетов, которые себя ведут также же плохо в аналогичном случе.


Тимохов   (2009-03-10 16:36:00) [3]

Видимо, да. Допишу сейчас.


Sha   (2009-03-10 16:34:00) [4]

Тогда и TLabel туда до кучи добавить надо.


Тимохов   (2009-03-10 15:57:00) [5]

Если не против, то сам репорт бросил. Пусть разбираются.
http://qc.embarcadero.com/wc/qcmain.aspx?d=72087


Тимохов   (2009-03-10 13:25:00) [6]

Да... интересная ошибка.

Дело в том, что TEdit реагирует на изменение размера шрифта и вот здесь TCustomEdit.AdjustHeight меняет свою высоту в момент изменения размера шрифта, что в свою очередь приводит к вызову TControl.UpdateAnchorRules, где в строке
if Parent <> nil then
     Parent.UpdateControlOriginalParentSize(Self, FOriginalParentSize);

запоминается FOriginalParentSize, который на момент вызова уже учитывает + 100 у родительской панели.

И в дальнейшем при учете acnhors для Edit1 он считает, что у него FOriginalParentSize уже больше на 100 и не хочет себя сдвигать.

Зоопарк в общем.

Очевидный недочет.

Думаю, что стоит указать на него разработчику через QC.


sniknik   (2009-03-09 14:29:00) [7]

> Интересно, что если переставить операторы в FormCreate, то едит не теряет память.
или закомментарить Font.Size:=10;... добавление чего то другого, типа Edit1.Text:= 'hkj';/PixelsPerInch:= 120; вместо него не влияет...


Sha   (2009-03-09 12:54:00) [8]

PS
Просьба не воспринимать буквально :)

> едит забывает про свои якоря.
</I
> то едит не теряет память.

>


Наверх

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