powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Масштабирование компонент на динамической форме
25 сообщений из 35, страница 1 из 2
Масштабирование компонент на динамической форме
    #39740927
shmelina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.
Delphi 10.2.3.
Если форма уже создана (autocreate) то компоненты размещаются на ней масштабированными.
Если форма динамически создана, то компоненты НЕ масштабированы.
Почему и что делать?

Исходники
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
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.

...
Рейтинг: 0 / 0
Масштабирование компонент на динамической форме
    #39740928
shmelina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скрин
...
Рейтинг: 0 / 0
Масштабирование компонент на динамической форме
    #39740939
shmelina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Исходники этого примера.
...
Рейтинг: 0 / 0
Масштабирование компонент на динамической форме
    #39740957
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторПочему и что делать?
ЧЯДНТ ???
...
Рейтинг: 0 / 0
Масштабирование компонент на динамической форме
    #39741007
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shmelina,

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

зы. в Лазаре это реализовано через специальный редактор и свойства
...
Рейтинг: 0 / 0
Масштабирование компонент на динамической форме
    #39741066
shmelina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBr, Вы скомпилируйте проект, измените масштабирование, и запустите экзешник.
...
Рейтинг: 0 / 0
Масштабирование компонент на динамической форме
    #39741116
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
при создании формы: Form.Scaled:=False;
а потом ScaleBy()
...
Рейтинг: 0 / 0
Масштабирование компонент на динамической форме
    #39741121
shmelina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat, это все можно начать пробовать, но можем все просто решается? Ведь на статичной форме контролы масштабируются, а на динамичной не хотят.
...
Рейтинг: 0 / 0
Масштабирование компонент на динамической форме
    #39741194
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shmelina,

контролы не в OnShow создавай, а в OnCreate, ты же их уже после масштабирования формы создаёшь
...
Рейтинг: 0 / 0
Масштабирование компонент на динамической форме
    #39741209
shmelina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Методом тыка выяснил для динамической формы следующее:
- игнорирует свойство Scaled.
- масштабирует только шрифт (высота TEdit изменятся от шрифта). Координаты и размеры контролов игнорируются.
- функции типа ScaleBy и ScaleForPPI меняют только шрифт... см. предыдущий пункт.
...
Рейтинг: 0 / 0
Масштабирование компонент на динамической форме
    #39741214
shmelina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Причем применение функций типа ScaleBy приводит к двойному масштабированию шрифта, т.к. динамическая форма уже увеличила шрифт.
...
Рейтинг: 0 / 0
Масштабирование компонент на динамической форме
    #39741217
shmelina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Написал код, который масштабирует координаты и размеры контролов. Шрифт не трогаю, он уже увеличен. Получилось почти как на первой форме, разница в пиксель терпима.

код
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
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.

...
Рейтинг: 0 / 0
Масштабирование компонент на динамической форме
    #39741236
shmelina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но вопрос остается. Почему на статической форме (auto-create) динамически созданные контролы масштабируются, а на динамической форме не хотят (только шрифт). Баг?
Для примера смотрите исходники и картинки в начале топика.
...
Рейтинг: 0 / 0
Масштабирование компонент на динамической форме
    #39741250
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Смотри сорцы VCL.
...
Рейтинг: 0 / 0
Масштабирование компонент на динамической форме
    #39741259
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shmelina,
это 10.3 ?

посмотри что вот в этом свойстве у контрола
Код: pascal
1.
2.
3.
 property ScalingFlags: TScalingFlags read FScalingFlags write FScalingFlags;
  TScalingFlags = set of (sfLeft, sfTop, sfWidth, sfHeight, sfFont,
    sfDesignSize);
...
Рейтинг: 0 / 0
Масштабирование компонент на динамической форме
    #39741268
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shmelinaНо вопрос остается. Почему на статической форме (auto-create) динамически созданные контролы масштабируются, а на динамической форме не хотят (только шрифт). Баг?

Возможно потому что autocreate формы создаются через Application.CreateForm().
...
Рейтинг: 0 / 0
Масштабирование компонент на динамической форме
    #39741872
shmelina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpВозможно потому что autocreate формы создаются через Application.CreateForm().Не помогло.
...
Рейтинг: 0 / 0
Масштабирование компонент на динамической форме
    #39741875
shmelina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan),

10.2.3

ScalingFlags = [sfLeft,sfTop,sfWidth,sfHeight]
...
Рейтинг: 0 / 0
Масштабирование компонент на динамической форме
    #39741903
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shmelina,

включи отладочные модули, протрейсь TControl.ChangeScale, TWinControl.ChangeScale(
...
Рейтинг: 0 / 0
Масштабирование компонент на динамической форме
    #39743505
shmelina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Запустил среду и отлаживаю в масштабе 125.
При создании компонент на первой форме происходит вызов ChangeScale(120, 96, True).
При создании компонент на второй форме вызов ChangeScale не происходит.
...
Рейтинг: 0 / 0
Масштабирование компонент на динамической форме
    #39743535
shmelina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Удалось выяснить, что при присвоении компоненту родителя, компонент масшабируется согласно родительскому FCurrentPPI. Для первой формы он 120, для второй 96. Пока не могу разобраться почему он разный.
...
Рейтинг: 0 / 0
Масштабирование компонент на динамической форме
    #39743747
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shmelina,

можешь в dfm посмотреть. скорее всего они сохранены с разным dpi: PixelsPerInch = 96
...
Рейтинг: 0 / 0
Масштабирование компонент на динамической форме
    #39743766
shmelina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon,

Вторая форма динамически создается. Первая 96 dpi.
...
Рейтинг: 0 / 0
Масштабирование компонент на динамической форме
    #39743957
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shmelina,

так она наверно с dpi=120 и создаётся. попробуй её создать из dfm'а, в котором точно 96 будет.
...
Рейтинг: 0 / 0
Масштабирование компонент на динамической форме
    #39743958
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shmelina,

так она наверно с dpi=120 и создаётся. попробуй её создать из dfm'а, в котором точно 96 будет.
...
Рейтинг: 0 / 0
25 сообщений из 35, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Масштабирование компонент на динамической форме
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]