Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Масштабирование компонент на динамической форме  [new]
shmelina
Member

Откуда:
Сообщений: 459
Здравствуйте.
Delphi 10.2.3.
Если форма уже создана (autocreate) то компоненты размещаются на ней масштабированными.
Если форма динамически создана, то компоненты НЕ масштабированы.
Почему и что делать?

+ Исходники
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure CreateComp(AOwner: TForm);
var
  ed: TEdit;
  lb: TLabel;
begin
  lb := TLabel.Create(AOwner);
  lb.Left := 8;
  lb.Top := 11;
  lb.Caption := 'Label1';
  lb.Parent := AOwner;
  lb := TLabel.Create(AOwner);
  lb.Left := 8;
  lb.Top := 33;
  lb.Caption := 'Label2';
  lb.Parent := AOwner;
  ed := TEdit.Create(AOwner);
  ed.Left := 45;
  ed.Top := 8;
  ed.Parent := AOwner;
  ed := TEdit.Create(AOwner);
  ed.Left := 45;
  ed.Top := 30;
  ed.Parent := AOwner;
end;

procedure TForm1.FormShow(Sender: TObject);
var
  fm: TForm;
begin
  Caption := 'Form1';
  CreateComp(Self);

  fm := TForm.Create(Self);
  fm.Caption := 'Form2';
  CreateComp(fm);
  fm.Show;
end;

end.
30 ноя 18, 14:48    [21750055]     Ответить | Цитировать Сообщить модератору
 Re: Масштабирование компонент на динамической форме  [new]
shmelina
Member

Откуда:
Сообщений: 459
Скрин

К сообщению приложен файл. Размер - 15Kb
30 ноя 18, 14:48    [21750056]     Ответить | Цитировать Сообщить модератору
 Re: Масштабирование компонент на динамической форме  [new]
shmelina
Member

Откуда:
Сообщений: 459
Исходники этого примера.

К сообщению приложен файл (Scale.zip - 1Kb) cкачать
30 ноя 18, 14:52    [21750068]     Ответить | Цитировать Сообщить модератору
 Re: Масштабирование компонент на динамической форме  [new]
DimaBr
Member

Откуда:
Сообщений: 10779
автор
Почему и что делать?

ЧЯДНТ ???

К сообщению приложен файл. Размер - 15Kb
30 ноя 18, 15:06    [21750110]     Ответить | Цитировать Сообщить модератору
 Re: Масштабирование компонент на динамической форме  [new]
Док
Member

Откуда: Казань
Сообщений: 5868
shmelina,

это не масштабирование, это привязки у тебя поехали. Хотя, по логике, не должны. Попробуй привязывать компоненты, расположенные справа и снизу, к компонентам сверху и слева.

зы. в Лазаре это реализовано через специальный редактор и свойства
30 ноя 18, 15:35    [21750184]     Ответить | Цитировать Сообщить модератору
 Re: Масштабирование компонент на динамической форме  [new]
shmelina
Member

Откуда:
Сообщений: 459
DimaBr, Вы скомпилируйте проект, измените масштабирование, и запустите экзешник.
30 ноя 18, 16:10    [21750285]     Ответить | Цитировать Сообщить модератору
 Re: Масштабирование компонент на динамической форме  [new]
rgreat
Member

Откуда:
Сообщений: 4575
при создании формы: Form.Scaled:=False;
а потом ScaleBy()
30 ноя 18, 16:40    [21750376]     Ответить | Цитировать Сообщить модератору
 Re: Масштабирование компонент на динамической форме  [new]
shmelina
Member

Откуда:
Сообщений: 459
rgreat, это все можно начать пробовать, но можем все просто решается? Ведь на статичной форме контролы масштабируются, а на динамичной не хотят.
30 ноя 18, 16:42    [21750386]     Ответить | Цитировать Сообщить модератору
 Re: Масштабирование компонент на динамической форме  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 3590
shmelina,

контролы не в OnShow создавай, а в OnCreate, ты же их уже после масштабирования формы создаёшь
30 ноя 18, 17:56    [21750552]     Ответить | Цитировать Сообщить модератору
 Re: Масштабирование компонент на динамической форме  [new]
shmelina
Member

Откуда:
Сообщений: 459
Методом тыка выяснил для динамической формы следующее:
- игнорирует свойство Scaled.
- масштабирует только шрифт (высота TEdit изменятся от шрифта). Координаты и размеры контролов игнорируются.
- функции типа ScaleBy и ScaleForPPI меняют только шрифт... см. предыдущий пункт.
30 ноя 18, 18:21    [21750594]     Ответить | Цитировать Сообщить модератору
 Re: Масштабирование компонент на динамической форме  [new]
shmelina
Member

Откуда:
Сообщений: 459
Причем применение функций типа ScaleBy приводит к двойному масштабированию шрифта, т.к. динамическая форма уже увеличила шрифт.

К сообщению приложен файл. Размер - 14Kb
30 ноя 18, 18:27    [21750605]     Ответить | Цитировать Сообщить модератору
 Re: Масштабирование компонент на динамической форме  [new]
shmelina
Member

Откуда:
Сообщений: 459
Написал код, который масштабирует координаты и размеры контролов. Шрифт не трогаю, он уже увеличен. Получилось почти как на первой форме, разница в пиксель терпима.

+ код
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure CreateComp(AOwner: TForm; Scale: Boolean);
var
  N: Double;
  procedure CreateLb(ALeft, ATop: Integer; ACapt: string);
  var
    lb: TLabel;
  begin
    lb := TLabel.Create(AOwner);
    lb.Left := Round(ALeft * N);
    lb.Top := Round(ATop * N);
    lb.Caption := ACapt;
    lb.Parent := AOwner;
  end;
  procedure CreateEd(ALeft, ATop, AWidth: Integer; AText: string);
  var
    ed: TEdit;
  begin
    ed := TEdit.Create(AOwner);
    ed.Left := Round(ALeft * N);
    ed.Top := Round(ATop * N);
    ed.Width := Round(AWidth * N);
    ed.Text := AText;
    ed.Parent := AOwner;
  end;
begin
  if Scale then
    N := Screen.PixelsPerInch / 96
  else
    N := 1;
  CreateLb(8, 11, 'Label1');
  CreateLb(8, 33, 'Label2');
  CreateEd(45, 8, 100, 'Edit1');
  CreateEd(45, 30, 100, 'Edit2');
end;

procedure TForm1.FormShow(Sender: TObject);
var
  fm: TForm;
begin
  Caption := 'Form1';
  CreateComp(Self, False);

  fm := TForm.Create(Self);
//  fm.Scaled := False; не работает
  fm.Caption := 'Form2';
  CreateComp(fm, True);
//  fm.ScaleForPPI(Screen.PixelsPerInch);
  fm.Show;
end;

end.


К сообщению приложен файл. Размер - 16Kb
30 ноя 18, 18:31    [21750613]     Ответить | Цитировать Сообщить модератору
 Re: Масштабирование компонент на динамической форме  [new]
shmelina
Member

Откуда:
Сообщений: 459
Но вопрос остается. Почему на статической форме (auto-create) динамически созданные контролы масштабируются, а на динамической форме не хотят (только шрифт). Баг?
Для примера смотрите исходники и картинки в начале топика.
30 ноя 18, 18:53    [21750651]     Ответить | Цитировать Сообщить модератору
 Re: Масштабирование компонент на динамической форме  [new]
rgreat
Member

Откуда:
Сообщений: 4575
Смотри сорцы VCL.
30 ноя 18, 19:12    [21750678]     Ответить | Цитировать Сообщить модератору
 Re: Масштабирование компонент на динамической форме  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 3590
shmelina,
это 10.3 ?

посмотри что вот в этом свойстве у контрола
 property ScalingFlags: TScalingFlags read FScalingFlags write FScalingFlags;
  TScalingFlags = set of (sfLeft, sfTop, sfWidth, sfHeight, sfFont,
    sfDesignSize);
30 ноя 18, 19:25    [21750695]     Ответить | Цитировать Сообщить модератору
 Re: Масштабирование компонент на динамической форме  [new]
alekcvp
Member

Откуда:
Сообщений: 1194
shmelina
Но вопрос остается. Почему на статической форме (auto-create) динамически созданные контролы масштабируются, а на динамической форме не хотят (только шрифт). Баг?


Возможно потому что autocreate формы создаются через Application.CreateForm().
30 ноя 18, 19:35    [21750710]     Ответить | Цитировать Сообщить модератору
 Re: Масштабирование компонент на динамической форме  [new]
shmelina
Member

Откуда:
Сообщений: 459
alekcvp
Возможно потому что autocreate формы создаются через Application.CreateForm().
Не помогло.
3 дек 18, 11:22    [21751842]     Ответить | Цитировать Сообщить модератору
 Re: Масштабирование компонент на динамической форме  [new]
shmelina
Member

Откуда:
Сообщений: 459
kealon(Ruslan),

10.2.3

ScalingFlags = [sfLeft,sfTop,sfWidth,sfHeight]
3 дек 18, 11:30    [21751845]     Ответить | Цитировать Сообщить модератору
 Re: Масштабирование компонент на динамической форме  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 3590
shmelina,

включи отладочные модули, протрейсь TControl.ChangeScale, TWinControl.ChangeScale(
3 дек 18, 12:43    [21751925]     Ответить | Цитировать Сообщить модератору
 Re: Масштабирование компонент на динамической форме  [new]
shmelina
Member

Откуда:
Сообщений: 459
Запустил среду и отлаживаю в масштабе 125.
При создании компонент на первой форме происходит вызов ChangeScale(120, 96, True).
При создании компонент на второй форме вызов ChangeScale не происходит.
6 дек 18, 14:15    [21755814]     Ответить | Цитировать Сообщить модератору
 Re: Масштабирование компонент на динамической форме  [new]
shmelina
Member

Откуда:
Сообщений: 459
Удалось выяснить, что при присвоении компоненту родителя, компонент масшабируется согласно родительскому FCurrentPPI. Для первой формы он 120, для второй 96. Пока не могу разобраться почему он разный.
6 дек 18, 14:53    [21755873]     Ответить | Цитировать Сообщить модератору
 Re: Масштабирование компонент на динамической форме  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 2963
shmelina,

можешь в dfm посмотреть. скорее всего они сохранены с разным dpi: PixelsPerInch = 96
6 дек 18, 17:49    [21756184]     Ответить | Цитировать Сообщить модератору
 Re: Масштабирование компонент на динамической форме  [new]
shmelina
Member

Откуда:
Сообщений: 459
makhaon,

Вторая форма динамически создается. Первая 96 dpi.
6 дек 18, 18:16    [21756215]     Ответить | Цитировать Сообщить модератору
 Re: Масштабирование компонент на динамической форме  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 2963
shmelina,

так она наверно с dpi=120 и создаётся. попробуй её создать из dfm'а, в котором точно 96 будет.
7 дек 18, 04:07    [21756552]     Ответить | Цитировать Сообщить модератору
 Re: Масштабирование компонент на динамической форме  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 2963
shmelina,

так она наверно с dpi=120 и создаётся. попробуй её создать из dfm'а, в котором точно 96 будет.
7 дек 18, 04:07    [21756553]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Delphi Ответить