2017-02-12 15 views
0

Я разрабатываю компонент текстового редактора со всплывающим окном. Ширина всплывающего окна должна быть установлена ​​во время разработки в редакторе свойств моего компонента.Как использовать значение, соответствующее DPI, в свойстве компонента?

Как применить заданную ширину к разрешению экрана?

Если я ввожу значение для Width, Delphi сохраняет значение внутри файла .dfm. Также сохраняются значение PixelsPerInch. Если я поместить Width = 96 в то время как я использую настройку Windows, DPI 100%, внутри .dfm будет сохранено:

PixelsPerInch = 96 
Width = 96 

Если я изменить свой Windows, DPI настройки теперь до 150% и снова открыть это проект в Delphi, редактор свойств показывает мне ширину 148.

Я хотел бы, чтобы это тоже для моей ценности:

published 
    property PopupWidth: Integer read FPopupWidth write FPopupWidth; 

... но Delphi не применяет обработку для моей стоимости PixelsPerInch.

Почему нет? И как я могу это реализовать?

enter image description here

+0

- * «Почему нет?» * - Так как компилятор не может читать ваши мысли. - * ".. как .." * - Я думаю, вы должны увидеть код в TCustomForm.ReadState. Это также может быть актуальным: http://docwiki.embarcadero.com/RADStudio/Seattle/en/Considerations_When_Dynamically_Resizing_Forms_and_Controls –

+0

Он также не масштабирует другие целочисленные значения, которые не являются подсчетами пикселей. Должны ли это масштабировать? –

+0

@ Давид Хеффернан: Да, он должен масштабироваться - вот чего я хочу. Как я могу сказать Delphi о масштабировании собственности? – Tahtu

ответ

2

Этот механизм масштабирования обрабатывается явным кодом в VCL. Структура предоставляет виртуальный метод ChangeScaleTControl, чтобы позволить вашим элементам управления участвовать.

Вы бы переопределить ChangeScale для вашего контроля и реализовать это следующим образом:

procedure TMyControl.ChangeScale(M, D: Integer); 
begin 
    if sfWidth in ScalingFlags then 
    PopupWidth := MulDiv(PopupWidth, M, D); 
    inherited; 
end;