2013-12-25 2 views
7

Использование мастера Delphi XE2 для создания компонента, я выбрал TPanel для наследования и изменения значений по умолчанию некоторых свойств для моего приложения.Как изменить значение по умолчанию для свойства Margins?

Моя проблема заключается в изменении значения по умолчанию из поля:

TControl = class(TComponent) 
    ... 
    property Margins: TMargins read FMargins write SetMargins; 

Маржа является класс TMargin объявлен с 4-мя свойствами, что мне нужно переопределить значения по умолчанию:

TMargins = class(TPersistent) 
    published 
    property Left: TMarginSize index 0 read FLeft write SetMargin default 3; 
    property Top: TMarginSize index 1 read FTop write SetMargin default 3; 
    property Right: TMarginSize index 2 read FRight write SetMargin default 3; 
    property Bottom: TMarginSize index 3 read FBottom write SetMargin default 3; 

Я/будет задавая по коду поля при создании конструктора компонента, однако я не знаю, как переопределить эти значения по умолчанию выше, чтобы отобразить в редакторе свойств.

+0

У меня есть ощущение, что по умолчанию не может быть повторно определена. –

+1

@DavidHeffernan Да, это разрешено, я делаю это для многих простых случаев, таких как «свойство AlignWithMargins по умолчанию true»; предыдущее значение по умолчанию было ложным. Он работает, и он является частью документации, просто укажите свойство и новое значение по умолчанию. Однако я понятия не имею, как это делается в случае выше. –

ответ

7

Вы можете объявить TMargins потомка свое по умолчанию для использования в панели

type 
    TMyMargins = class(TMargins) 
    protected 
    class procedure InitDefaults(Margins: TMargins); override; 
    published 
    property Left default 10; 
    property Top default 10; 
    property Right default 10; 
    property Bottom default 10; 
    end; 

class procedure TMyMargins.InitDefaults(Margins: TMargins); 
begin 
    with Margins do begin 
    Left := 10; 
    Right := 10; 
    Top := 10; 
    Bottom := 10; 
    end; 
end; 


затем при создании панели, отклонить существующую и использовать твой

TMyPanel = class(TPanel) 
    private 
    procedure DoMarginChange(Sender: TObject); 
    public 
    constructor Create(AOwner: TComponent); override; 
    end; 

constructor TMyPanel.Create(AOwner: TComponent); 
begin 
    inherited Create(AOwner); 
    Margins.Free; 
    Margins := TMyMargins.Create(Self); 
    Margins.OnChange := DoMarginChange; 
end; 

procedure TMyPanel.DoMarginChange(Sender: TObject); 
begin 
    // same as in TControl which is private 
    RequestAlign; 
end; 

задворки будут храниться в dfm только тогда, когда они отличаются от значения по умолчанию.



Хотя я не знаю, почему вышеуказанные работы ... Проблема с выше код, Margins свойство имеют сеттер, который только назначает на обочину (левый, правый ..). Код никогда не записывается в поле поддержки, но он все еще работает. Линия

Margins := TMyMargins.Create(Self);

эффективно же, как

TMyMargins.Create(Self);

, который также работает.

Под «работами» Я имею в виду, это работает. Поля, f.i., получают должным образом уничтожение, а не из-за владения и т. Д. (Поля iş a TPersistent, а не компонент), но сразу же, когда восходящий TControl звонит FMargins.Free.

Во всяком случае, так как я не понимаю, как это работает, как безопаснее, хот Hacky подход, я хотел бы использовать это:

constructor TMyPanel.Create(AOwner: TComponent); 
var 
    Addr: NativeUInt; 
begin 
    inherited Create(AOwner); 

    Addr := NativeUInt(@Margins); 
    Margins.Free; 
    PUINT_PTR(Addr)^ := NativeUInt(TMyMargins.Create(Self)); 
    Margins.OnChange := DoMarginChange; 
end; 
Смежные вопросы