Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.60/25: Рейтинг темы: голосов - 25, средняя оценка - 4.60
1 / 1 / 0
Регистрация: 06.05.2018
Сообщений: 162

Программно задать порядок для компонентов с Align = alTop

10.09.2020, 10:08. Показов 5578. Ответов 38
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
Есть несколько компонентов размещенных на форме, в дизайнеге задан Align = alTop.
Как теперь программно задать их положение относительно друг-друга, порядок расположения?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.09.2020, 10:08
Ответы с готовыми решениями:

Свойство Align: Порядок размещения компонентов с одинаковым выравниванием
Здравствуйте, господа. Периодически возникает эта проблема, второпях решаю ее ручками с отказом от Align, но в этот раз прижало. ...

Как задать порядок отрисовки компонентов
Доброго времени суток. Есть JPanel на которой расположена кнопка и другая дочерняя панель закрашенная красным цветом. Дочерняя панель...

Anchors, Align и размещение компонентов исходя из размера формы
Сабж. Есть кнопки на форме, в таком виде: Ну и соответственно при разных размерах кнопки должны изменять свой размер и...

38
1 / 1 / 0
Регистрация: 06.05.2018
Сообщений: 162
14.09.2020, 11:01  [ТС]
Студворк — интернет-сервис помощи студентам
И фрейм №150 почему-то оказался между 94 и 95

Добавлено через 1 минуту
С него же и начинаются глюки по слету Тор у компонентов
0
Модератор
4153 / 2362 / 814
Регистрация: 15.11.2015
Сообщений: 9,496
14.09.2020, 11:44
Не понимаю чего-то. Глючить начинает, когда значение Top превышает 32767. Но ведь, Integer у нас 32 битный.

Тестовый проект. В ScrollBox сидит 3 панели рядом. Делаем так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
procedure TForm1.FormCreate(Sender: TObject);
begin
  Panel1.Top :=     0;
  Panel2.Top := 40000;
  Panel3.Top := 40050;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  Label1.Caption := IntToStr(Panel2.Top) + ' ' + IntToStr(Panel3.Top);
end;
И жмём кнопку и получаем результат 32565 для 2 и 3 панели.

Добавлено через 2 минуты
RADStudio, в общем, надо как-то уменьшать высоту всей этой пирамиды. Там реально нужно одновременно показывать все 150 фреймов? Думаю, можно как-то симпатичнее это провернуть.
1
1 / 1 / 0
Регистрация: 06.05.2018
Сообщений: 162
14.09.2020, 11:55  [ТС]
AzAtom, там и больше может быть, я для примера 150 поставил. Характер глюка хотелось бы осознать, ну и по возможности победить.

Добавлено через 3 минуты
AzAtom, у вложенного фрейма с эдитом свой личный Тор и к ScrollBox-у отношения он не имеет, но глюк и ему передается и компоненты (не все) получают Тор = 0 (причем игнорируя Margin), вот это вообще на голову не налазит.
0
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
14.09.2020, 11:57
Цитата Сообщение от AzAtom Посмотреть сообщение
Panel1.Top :=     0;
Panel2.Top := 40000;
Panel3.Top := 40050;
вот зачем этот, без преувеличения сказать, непрофессионализм?
я же привёл пример, как нужно сделать, чтобы работало! Мой вариант испробован?

Добавлено через 1 минуту
Цитата Сообщение от AzAtom Посмотреть сообщение
Глючить начинает, когда значение Top превышает 32767.
потому и глючил, что херня )
1
1 / 1 / 0
Регистрация: 06.05.2018
Сообщений: 162
14.09.2020, 12:04  [ТС]
DenNik, Это он для теста показал, Ваш вариант глючит аналогично, если его применить к фреймам в моем примере.

Добавлено через 4 минуты
Ну и высота фреймов в проекте разная, последующий фрейм ничего не знает о размерах предыдущего
0
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
14.09.2020, 12:07
Да, глючит. Должно быть 510 фреймов. Обратите внимание на Тор. Значит это обусловлено внутренним устройством VCL.

500 одинковых компонентов на форме - это НЕ НОРМАЛЬНО. Как пользователь, я бы выбросил такую программу сразу же!
1
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,686
Записей в блоге: 21
14.09.2020, 12:10
Лучший ответ Сообщение было отмечено RADStudio как решение

Решение

не желаете возврат к адеквату?
32000 точек это +-32 экрана, или 32 страницы, заполненных текстом, картинками, кнопочками
перематывать их ради чего бы то ни было уже спорное решение...

а вообще короткое гугление показывает, что WinApi и SetWindowPos не дает делать что-либо >32767
это к вопросу глюков и Delphi
3
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
14.09.2020, 12:13
Цитата Сообщение от krapotkin Посмотреть сообщение
WinApi и SetWindowPos не дает делать что-либо >32767
Вот так БГ обломал светлые мечты ТС о "суперфункциональной" программе
2
1 / 1 / 0
Регистрация: 06.05.2018
Сообщений: 162
14.09.2020, 12:17  [ТС]
krapotkin, А что на счет вложенного фрейма, у него ведь Тор отностительно родителя и до 32767
ему долеко... ? Не может же он сначала получать общий Тор и потом пересчитываться относительно координат родителя?
0
Модератор
4153 / 2362 / 814
Регистрация: 15.11.2015
Сообщений: 9,496
14.09.2020, 12:18
Цитата Сообщение от DenNik Посмотреть сообщение
вот зачем этот, без преувеличения сказать, непрофессионализм?
я же привёл пример, как нужно сделать, чтобы работало! Мой вариант испробован?
Прежде чем обвинять в не профессионализме желательно сначала самостоятельно испробовать свой вариант. Да, испробован, при высоте фрейма 304 пикселя. Общая высота получается 77824 пикселя, и фреймы, после 209 (Top = 63536) помещаются наверх. Потому, что переменная для высоты типа word.

Добавлено через 7 секунд
Я пишу о том, что такая концепция прокрутки изначально неверна. Надо что-то другое придумать.

Добавлено через 1 минуту
Цитата Сообщение от DenNik Посмотреть сообщение
потому и глючил, что херня )
Ну да, а если глючит после 65000 это уже не херня?
1
1 / 1 / 0
Регистрация: 06.05.2018
Сообщений: 162
14.09.2020, 12:22  [ТС]
Цитата Сообщение от DenNik Посмотреть сообщение
Вот так БГ обломал светлые мечты ТС о "суперфункциональной" программе
Ну так я же говорил, что затык где-то на низком уровне. Такого глубокого понимания процесса у меня нет, где наткнешься на корягу заранее не известно)

Добавлено через 3 минуты
Цитата Сообщение от AzAtom Посмотреть сообщение
Я пишу о том, что такая концепция прокрутки изначально неверна. Надо что-то другое придумать
Это уже понятно. Нужно теперь думать как, это был самый логичный вариан в данных условиях.
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,686
Записей в блоге: 21
14.09.2020, 12:26
есть вариант динамической прокрутки бесконечного списка с удалением головы и добавлением в хвост
как новости в ВК например
но Scrollbox тут ни при чем будет
хотя Scrollbar можно использовать
1
1 / 1 / 0
Регистрация: 06.05.2018
Сообщений: 162
14.09.2020, 12:28  [ТС]
Цитата Сообщение от DenNik Посмотреть сообщение
500 одинковых компонентов на форме - это НЕ НОРМАЛЬНО. Как пользователь, я бы выбросил такую программу сразу же!
Вообще планировалось, что их будет 20.
Однако после этого пользователь вошел в кураж и настрочил более сотни объектов, после чего вырисовался этот глюк.

Добавлено через 51 секунду
krapotkin, хорошая идея, спасибо. Подумаю над реализацией.
0
Модератор
4153 / 2362 / 814
Регистрация: 15.11.2015
Сообщений: 9,496
14.09.2020, 12:34
Вариант №1.
Пофреймовая прокрутка. Справа от ScrollBox ставим ScrollBar и его Max равен "количество фреймов - 1".
Добавить и изменить в проекте:
Delphi
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
const FrameN = 150; // Можно и в переменные перенести
 
type
  TfmConstructor = class(TForm)
...
  public
    QF: array of TQuestion_Editor_Frame;
...
  end;
 
...
 
function TfmConstructor.CreateQuestion(AQuestion: string = ''; P: Integer = 0): TQuestion_Editor_Frame;
begin
  f := TQuestion_Editor_Frame.Create(ScrollBox);
  Inc(ID_Q);
  f.Name := 'Q_' + IntToStr(ID_Q);
  f.Parent := ScrollBox;
  f.AutoSize := true;
//  f.Visible := true;
  f.edQuestion.Text := AQuestion;
//  f.pQuestion.Top := 0;
//  f.Top := 1000000;
//  f.Top := P * (f.Height + 8);
//  f.Top := P * (350);
//  f.Align := alTop;
  Result := f;
end;
 
procedure TfmConstructor.CresteFrames;
var Q: TQuestion_Editor_Frame;
    i, j, Num: integer;
begin
  ScrollBox.Visible:= false;
  ScrollBox.AutoScroll:= false;
  ScrollBar1.Min := 0;
  ScrollBar1.Max := FrameN-1;
  SetLength(QF, FrameN);
  for i := 0 to FrameN-1 do begin
    QF[i] := CreateQuestion('Iteration ' + IntToStr(i), i);
    for j:= 0 to 3 do QF[i].CreateAnswer('');
    QF[i].Visible := i = 0; // Сначала видимый только первый фрейм
  end;
 
  ScrollBox.AutoScroll := true;
  ScrollBox.Visible := true;
end;
 
...
 
procedure TfmConstructor.ScrollBar1Change(Sender: TObject);
var
  i: Integer;
begin
  for i := 0 to FrameN-1 do
    QF[i].Visible := ScrollBar1.Position = i; // Делаем видимум тот фрейм, на который указывает ScrollBar
end;
Добавлено через 1 минуту
Да, ScrollBox тут будет не нужен.

Сейчас попробую сделать плавную прокрутку.
1
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
14.09.2020, 13:20
Цитата Сообщение от DenNik Посмотреть сообщение
непрофессионализм
Имел в виду, зачем присваивать Тор 40000, чтобы присвоить Тор 100? )

Добавлено через 4 минуты
Цитата Сообщение от AzAtom Посмотреть сообщение
Пофреймовая прокрутка
и в итоге приходим к тому, что фреймы вообще не нужны! достаточно в ОДИН набор компонентов загружать нужные данные (по событию прокрутки, например)
0
Модератор
4153 / 2362 / 814
Регистрация: 15.11.2015
Сообщений: 9,496
14.09.2020, 13:23
Цитата Сообщение от DenNik Посмотреть сообщение
достаточно в ОДИН набор компонентов загружать нужные данные
Да, и таких тем с тестами десятки. Но может, ТС решил сделать что-то новое?
0
1 / 1 / 0
Регистрация: 06.05.2018
Сообщений: 162
14.09.2020, 13:44  [ТС]
Цитата Сообщение от AzAtom Посмотреть сообщение
ТС решил сделать что-то новое?
В рамках изначально запланированных 20 фреймов все смотрится более чем шоколадно.
0
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
14.09.2020, 13:50
а, так это тест....

Цитата Сообщение от AzAtom Посмотреть сообщение
может, ТС решил сделать что-то новое?
Это похвально, без шуток. Но поскольку в ходе бурного обсуждения выяснились некоторые моменты, обусловленные системными ограничениями, возможно, ТС следует всё-таки пересмотреть архитектуру приложения. Например, сделать "пакетное" отображение вопросов. Ответил на 10 вопросов, нажал "Далее", следующие 10.
1
Модератор
4153 / 2362 / 814
Регистрация: 15.11.2015
Сообщений: 9,496
14.09.2020, 15:57
Плавная прокрутка обрастает костылями по причине невозможности получить настоящую высоту фрейма сразу после установки свойства Autosize := true.

Добавлено через 45 минут
Кое-что получилось. Пришлось использовать таймер для корректного пересчёта высоты фреймов, иначе, сразу при создании не получается посчитать, так как, родитель выключен на время создания фреймов и размер невидимых объектов не пересчитывается.
ScrollBox заменил на Panel:
Delphi
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
const FrameN = 550;
 
type
  TfmConstructor = class(TForm)
    Panel2: TPanel;
    Panel4: TPanel;
    Button1: TButton;
    ScrollBar1: TScrollBar;
    Panel1: TPanel;
    Timer1: TTimer;
 
    procedure Button1Click(Sender: TObject);
    procedure ScrollBar1Change(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Panel1Resize(Sender: TObject);
  private
    { Private declarations }
  public
    QF: array of TQuestion_Editor_Frame;
    MaxH: Integer;
    function CreateQuestion(AQuestion: string = ''): TQuestion_Editor_Frame;
    procedure CresteFrames;
    procedure SetScrollBarRange;
  end;
 
var
  fmConstructor: TfmConstructor;
  f: TQuestion_Editor_Frame;
  ID_Q: integer = 0;
 
implementation
 
{$R *.dfm}
 
uses Answer_uFrame;
 
{ TfmConstructor }
 
function TfmConstructor.CreateQuestion(AQuestion: string = ''): TQuestion_Editor_Frame;
begin
  f := TQuestion_Editor_Frame.Create(Panel1);
  Inc(ID_Q);
  f.Name := 'Q_' + IntToStr(ID_Q);
  f.Parent := Panel1;
//  f.AutoSize := true;
//  f.Visible := true;
  f.edQuestion.Text := AQuestion;
//  f.pQuestion.Top := 0;
//  f.Top := 1000000;
//  f.Top := P * (f.Height + 8);
//  f.Top := P * (350);
//  f.Align := alTop;
  Result := f;
end;
 
procedure TfmConstructor.CresteFrames;
var
  i, j, Num: integer;
begin
  Panel1.Visible := false;
  SetLength(QF, FrameN);
  MaxH := 0;
  for i := 0 to FrameN-1 do begin
    QF[i] := CreateQuestion('Iteration ' + IntToStr(i));
    QF[i].Left := -QF[i].Width; // Спрятать фрейм за экраном. Visible = false нельзя, так как, тогда высота фрейма будет неправильно пересчитана
    QF[i].AutoSize := true; // Сначала AutoSize,
    for j:= 0 to 3 do QF[i].CreateAnswer(''); // затем добавить другие компоненты
  end;
 
//  SetScrollBarRange;
  Panel1.Visible := true;
  Timer1.Enabled := true; // Общая высота сразу не доступна. Нужно пересчитать позже
end;
 
 
 
 
procedure TfmConstructor.Button1Click(Sender: TObject);
begin
  CresteFrames;
end;
 
procedure TfmConstructor.ScrollBar1Change(Sender: TObject);
var
  i, h, wh, p: Integer;
begin
  // Так как, фреймы могут быть разной высоты, то приходится просматривать все фреймы
  h := 0; // Верхняя координата просматриваемого фрейма
  wh := Panel1.Height; // Высота окна просмотра
  p := ScrollBar1.Position; // Текущая позиция просмотра
  for i := 0 to High(QF) do begin
    QF[i].Visible := (p+wh >= h) and (p <= h + QF[i].Height); // Если фрейм входит в окно, то показать его
    if QF[i].Visible then // Если фрейм видимый, то установить его верхнюю координату
      QF[i].Top := h - p;
    h := h + QF[i].Height;
  end;
end;
 
procedure TfmConstructor.Timer1Timer(Sender: TObject);
var
  i: Integer;
begin
  Timer1.Enabled := false;
 
  // Пересчёт общей высоты всех фреймов
  if Length(QF) <= 0 then
    Exit;
  MaxH := 0;
  for i := 0 to High(QF) do begin
    if MaxH < 2000 then // Выстроить фреймы до высоты 2000 пикселей
      QF[i].Top := MaxH;
    MaxH := MaxH + QF[i].Height;
    QF[i].Visible := (MaxH < 2000); // Пусть будет видно фреймов на высоту 2000 пикселей
    QF[i].Left := 0;
  end;
 
  // Установка максимального значения ScrollBar
  SetScrollBarRange;
end;
 
procedure TfmConstructor.Panel1Resize(Sender: TObject);
begin
  // Изменилась высота окна просмотра
  // Установка максимального значения ScrollBar
  SetScrollBarRange;
end;
 
procedure TfmConstructor.SetScrollBarRange;
begin
  ScrollBar1.Min := 0;
  if MaxH - Panel1.Height > ScrollBar1.Min then
    ScrollBar1.Max := MaxH - Panel1.Height;
end;
Добавлено через 58 минут
Это был вариант №2. Принцип - показывать и прокручивать только те фреймы, которые видны на экране.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.09.2020, 15:57

Свойство align компонента TPanel (50 на 50) - равномерное распределение компонентов на форме
имеется форма, на ней 2 компонента TPanel(верх,низ), как разместить их так, чтобы они занимали одинаковое кол-во пространства на форме....

Как задать шрифт по умолчанию для всех компонентов
В общем загрузив шрифт мне нужно задать его по умолчанию. И как узнать какой шрифт по умолчанию используется для вновь созданных...

Задать программно leftMargin для RelativeLayout
Имеется заготовка view: &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt; &lt;LinearLayout...

Программно задать цвет фона для View
Возникла проблема с установкой фона для View. Получаю цвет через класс Color Код: RelativeLayout rl; @Override protected void...

Программно задать сим карту для звонков
Как можно программно задать сим карту для звонков? Например у меня стоит &quot;Всегда спрашивать&quot;, а когда программа включается она должна...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
39
Ответ Создать тему
Новые блоги и статьи
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru