Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Масштабирование компонент на динамической форме / 25 сообщений из 35, страница 1 из 2
30.11.2018, 14:48
    #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
30.11.2018, 14:48
    #39740928
shmelina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Масштабирование компонент на динамической форме
Скрин
...
Рейтинг: 0 / 0
30.11.2018, 14:52
    #39740939
shmelina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Масштабирование компонент на динамической форме
Исходники этого примера.
...
Рейтинг: 0 / 0
30.11.2018, 15:06
    #39740957
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Масштабирование компонент на динамической форме
авторПочему и что делать?
ЧЯДНТ ???
...
Рейтинг: 0 / 0
30.11.2018, 15:35
    #39741007
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Масштабирование компонент на динамической форме
shmelina,

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

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

контролы не в OnShow создавай, а в OnCreate, ты же их уже после масштабирования формы создаёшь
...
Рейтинг: 0 / 0
30.11.2018, 18:21
    #39741209
shmelina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Масштабирование компонент на динамической форме
Методом тыка выяснил для динамической формы следующее:
- игнорирует свойство Scaled.
- масштабирует только шрифт (высота TEdit изменятся от шрифта). Координаты и размеры контролов игнорируются.
- функции типа ScaleBy и ScaleForPPI меняют только шрифт... см. предыдущий пункт.
...
Рейтинг: 0 / 0
30.11.2018, 18:27
    #39741214
shmelina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Масштабирование компонент на динамической форме
Причем применение функций типа ScaleBy приводит к двойному масштабированию шрифта, т.к. динамическая форма уже увеличила шрифт.
...
Рейтинг: 0 / 0
30.11.2018, 18:31
    #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
30.11.2018, 18:53
    #39741236
shmelina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Масштабирование компонент на динамической форме
Но вопрос остается. Почему на статической форме (auto-create) динамически созданные контролы масштабируются, а на динамической форме не хотят (только шрифт). Баг?
Для примера смотрите исходники и картинки в начале топика.
...
Рейтинг: 0 / 0
30.11.2018, 19:12
    #39741250
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Масштабирование компонент на динамической форме
Смотри сорцы VCL.
...
Рейтинг: 0 / 0
30.11.2018, 19:25
    #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
30.11.2018, 19:35
    #39741268
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Масштабирование компонент на динамической форме
shmelinaНо вопрос остается. Почему на статической форме (auto-create) динамически созданные контролы масштабируются, а на динамической форме не хотят (только шрифт). Баг?

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

10.2.3

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

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

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

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

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

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


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