Текущий архив: 2005.08.14;
Скачать: CL | DM;
Вниз
Изменение размеров контролов при Resize формы Найти похожие ветки
← →
Kolan © (2005-07-21 13:44) [0]Здравствуйте,
Часто возникает необходимость изменять размеры одних контролов и нетрогать другие. Вот бы найти или сделать компонент который бы делал это автоматически.
Пример:
На форме график и под ним GroupBox где находятся контролы для управления графиком. При Resize график увеличивается по высоте и ширене, а GroupBox только по ширене. Это все я делаю сам. Те допустим высота графика = форма - что-то... , аGroupBox.Top = топ графика + его высота + какойто промежуток
. Понятно что если контролов много то это гемерой.
Я бы сам компонент сделал но как?
Вот как я думаю он должен работать. При помешении на форму он должен искать всё компоненты на форме и давать мне возможность задать для каждого как он должен менятся[НеМенятся, ПоВысоте, ПоШирене]
Как вы решаете подобную проблемму?
← →
Алхимик © (2005-07-21 13:46) [1]Anchors
← →
Lexer © (2005-07-21 13:56) [2]
> Kolan © (21.07.05 13:44)
> Как вы решаете подобную проблемму?
Panel/Align
← →
Digitman © (2005-07-21 14:16) [3]
> Это все я делаю сам
изобретаешь очередной велосипед ?
или твой "график" не есть потомок TControl ?
← →
Kolan © (2005-07-21 14:41) [4]
> Digitman © (21.07.05 14:16) [3] график" не есть потомок TControl ?
Есть, это TChart, а я не знаю как подругому. Можно подробнее как это делают. А то как представлю что опять эти пикселы ловить становится дурно...
PS Дело не в графике я о любых контролах...
← →
Gydvin © (2005-07-21 14:58) [5]Вот попробуй может подойдет;
///Валентин Озеров
Масштабирование окна II
Вывод формы с различными разрешениями экрана.
При проектировании форм часто бывает полезным предусмотреть ситуацию, когда форма и находящиеся на ней элементы управления должны иметь одинаковый размер вне зависимости от текущего разрешения экрана. Вот небольшой пример как можно это сделать:
--------------------------------------------------------------------------------
implementation
const
ScreenWidth: LongInt = 800; {Я разрабатывал мою форму в режиме 800x600.}
ScreenHeight: LongInt = 600;
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
scaled := true;
if (screen.width <> ScreenWidth) then
begin
height := longint(height) * longint(screen.height) div ScreenHeight;
width := longint(width) * longint(screen.width) div ScreenWidth;
scaleBy(screen.width, ScreenWidth);
end;
end;
Затем, вероятно, вы захотите иметь нечто, проверяющее размер шрифтов, OK. Прежде, чем вы измените размер шрифта, вам необходимо убедиться, что объект имеет свойство font. Это может быть сделано следующим образом:
--------------------------------------------------------------------------------
uses typinfo;
var
i: integer;
begin
for i := componentCount - 1 downtto 0 do
with components[i] do
begin
if GetPropInfo(ClassInfo, "font") <> nil then
font.size := (NewFormWidth DIV OldFormWidth) * font.size;
end;
end;
Примечание: При разработке приложения для различных режимов разрешения вам необходимо учитывать следующие рекомендации:
Заранее, в самом начале этапа разработки, решите для себя - собираетесь ли вы разрешать масштабировать форму или нет. Преимущество запрета масштабирования в том, что вам ничего не нужно менять во время выполнения приложения. Недостаток запрета масштабирования - во время выполнения приложения никаких изменений не происходит (ваша форма может быть слишком малой или слишком большой для работы в некоторых режимах при отсутствии масштабирования).
Если вы НЕ собираетесь масштабировать форму, установите свойство Scaled в False.
В противном случае, установите свойство формы Scaled в True.
Установите AutoScroll в False. AutoScroll = True означает "не изменять размер окна формы во время выполнения приложения", что приводит к "плохому виду" формы, если ее содержимое меняет размер.
Установите шрифты формы в масштабируемые TrueType-шрифты типа Arial. MS San Serif также подойдет в качестве альтернативы, только помните, это не TrueType, а bitmapped-шрифт. Только Arial может правильно изменять свою высоту с дискретностью 1 пиксел. Примечание: Если используемый шрифт не установлен на машине пользователя, Windows выбирает альтернативный шрифт из данной линейки (семьи) шрифтов. Размеры нового шрифта могут отличаться от размеров оригинального шрифта, что также может вызвать проблемы.
Установите свойство формы Position во что-нибудь другое, чем poDesigned. poDesigned всегда показывает форму в первозданном виде, и, если форма разрабатывалась в разрешении 1280x1024, то вы можете себе представить, что будет при разрешении 640x480?
Не "слепляйте" на форме элементы управления, оставляйте между ними, по крайней мере, 4 пикселя, в противном случае, при изменении месторасположения границы на 1 пиксель (это происходит при масштабировании), элементы управления наедут друг на друга.
Для однострочных компонентов Label, у которых свойство Aligned равно alLeft или alRight, установите AutoSize в True. В противном случае, установите AutoSize в False.
Убедитесь в том, что компоненты Label имеют достаточный запас по ширине (требуется, примерно, 25%) от длины текущего текста. (При переводе вашего приложения на другие языки вам необходимо примерно 30%-ный запас от текущей ширины текста). Если AutoSize - False, убедитесь, что ширины компонента Label достаточно для размещения реального текста. Если AutoSize - True, убедитесь, что на компоненту Label достаточно места (например, на форме) для размещения всего текста плюс небольшой запас для его роста при смене шрифтов.
В случае многострочного текста и компонентов Label с переносом слов, убедитесь, что в нижней части у вас имеется, по крайней мере, еще одна строчка. Она необходима вам для того, чтобы не допустить переполнения строки, если размер шрифта увеличивается при масштабировании. Не думайте, что, если вы используете большие шрифты и переполнения не возникает, то эта проблема снята - кто-нибудь может использовать шрифты с еще большим размером, чем у вас!
Будьте осторожными при открытии проекта в IDE с другим разрешением. Свойство формы PixelsPerInch будет изменено как только вы откроете форму, и сохранено в DFM-файле при сохранении проекта. Лучше всего запускать приложение отдельно от IDE, а редактировать его при одном разрешении. Редактируя формы при различных разрешениях и размерах шрифтов, вы инициируете проблему "дрейфа" компонентов по форме и изменения их размера.
Говоря о дрейфе компонент, не следует многократно масштабировать форму, как во время разработки, так и во время выполнения приложения. Каждое изменение размеров сопровождается ошибками округления, которые достаточно быстро накапливаются с тех пор, как координаты стали строго целочисленными. Поскольку при калькулировании новых размеров дробная часть отбрасывается, вновь пересчитанные размеры оказываются меньше, а координаты элементов управления северо-западнее. Если вы решили разрешить пользователю изменять масштабы форм, начинайте масштабирование с последней загруженной/созданной формы, этим вы уменьшите накапливаемые при масштабировании ошибки.
Старайтесь не изменять значение свойства формы PixelsPerInch.
В общих словах, нет необходимости разрабатывать формы для всех возможных режимов, перед окончательным релизом вашего приложения вы должны оценить поведение формы в пограничных режимах - 640x480 с маленькими и большими шрифтами, и при высоком разрешении и, также, с маленькими и большими шрифтами. Это должно быть частью ваших регулярных проверок на предмет системной совместимости, для ведения так называемой тестирующей контрольной таблицы.
Обратите пристальное внимание на "однострочные компоненты TMemo" - типа TDBLookupCombo. Системные многострочные редакторы всегда выводят только целые строки текста - если ширина элемента управления слишком мала для своего шрифта, то TMemo вообще ничего не показывает (TEdit показывает обрезанный текст). Размер таких компонентов лучше сделать на несколько пикселей больше, чем на несколько пикселей меньше, тем самым можно определеть наличие в компоненте оставшейся части текста.
Обратите внимание на то, что масштабирование во время проектирования и во время выполнения программы отличается коэффициентом и зависит от высоты шрифта, а не от экранного разрешения в пикселях. Помните также, что "начало" компонент будет изменяться в зависимости от масштаба формы, и для их "броуновского" движения также необходимо небольшое пространство.
← →
Gydvin © (2005-07-21 15:00) [6]Тьфу не так понял вопрос
Sorry
← →
Юрий Зотов © (2005-07-21 15:04) [7]> Kolan © (21.07.05 13:44)
> Как вы решаете подобную проблемму?
Чаще всего - не написав ни единой строчки кода, а только используя панели, сплиттеры, свойства Align, Anchors и Constraints.
← →
msguns © (2005-07-21 15:08) [8]Визуальные элементы, не имеющие св-ва Align, кладутся на панельки, панельки "раскладываются" как черепица на крыше, на "наружные" нанели, а те, в свою очередь, на панели-платформы, покрывающие клиентскую (рабочую) часть формы. Все "одноуровневые" панели с помощью свойств Align и сплиттеров (Delphi->Additional->TSplitter) подгоняются под "красивость". Теперь все меняется синхронно и красиво как при изменении размеров самой формы, так и при перемещении сплиттеров-разделителей.
← →
msguns © (2005-07-21 15:11) [9]>msguns © (21.07.05 15:08) [8]
Постил, не видя Юрий Зотов © (21.07.05 15:04) [7]
;)
← →
Kolan © (2005-07-21 15:11) [10]Не Scale это нето. Он действительно маштабирует а я хочу только размеры менять. Кто не понял вот как я делаю:
procedure TMainForm.SetComponentsPosition;
И пошло и пошло....
begin
// По Ширине.
PageControl.Width := MainForm.Width - 26;
bsSkinToolBar1.Width := MainForm.Width;
//GrafBox.Left := MeasureBox.Left + MeasureBox.Width + 8;
GrafBox.Width := PageControl.Width - 2 * MeasureBox.Left - MeasureBox.Width-11;
Как это не делать, как правильно... а так точно крыша седит...
← →
Kolan © (2005-07-21 15:18) [11]
> Юрий Зотов © (21.07.05 15:04) [7]Anchors
Господи как всё просто... :)))))))))))
Благодарю.
← →
Алхимик © (2005-07-21 15:20) [12]
> [11] Kolan © (21.07.05 15:18)
А в [1] не тоже самое?
:)
← →
Kolan © (2005-07-21 15:22) [13]Сразу не дошло.
Дай бох вам всем здоровья. :)))))))). Я уже довно должен был сделать Resize в новом проекте, но боялся даже братся тк [10].
← →
Юрий Зотов © (2005-07-21 15:23) [14]> Kolan © (21.07.05 15:18) [11]
А между тем слово Anchors было произнесено уже в самом первом ответе, а слова Panel и Align - во втором.
ИМХО, стоит быть повнимательнее.
← →
Kolan © (2005-07-22 10:30) [15]
> Юрий Зотов © (21.07.05 15:23) [14]
Ну потка дошло..
Про
> msguns © (21.07.05 15:08) [8]
вообше дошло только к вечеру... :).
Еще вопрос. Сделал всё чюдесно изменяется, только прилично мигиет особенно картинки наToolBar"е
.
Как избавится от мигания? (Кстати когда сам писал изменение размерров мигание было значительно меньше)
← →
Alx2 © (2005-07-22 10:50) [16]Kolan © (22.07.05 10:30) [15]
>Как избавится от мигания? (Кстати когда сам писал изменение
>размерров мигание было значительно меньше)
DoubleBuffered в true установить?
← →
Kolan © (2005-07-25 12:11) [17]
> Alx2 © (22.07.05 10:50) [16]
DoubleBuffered - главной форме? Сделал:
1. фон под кнопками на тул баре стал чёрным в XP.
2. Как мигало так и мигает.
PS Да ладно х с ним впринципе приемлемо. Всё равно в основномwsMaximized
Всех благодарю за помощь. :)
← →
Думкин © (2005-07-25 12:33) [18]> [17] Kolan © (25.07.05 12:11)
На чем лежит - тому и дабл.
← →
jack128 © (2005-07-25 12:43) [19]Kolan © (22.07.05 10:30) [15]
Еще вопрос. Сделал всё чюдесно изменяется, только прилично мигиет особенно картинки на ToolBar"е.
Как избавится от мигания? (Кстати когда сам писал изменение размерров мигание было значительно меньше)
Splitter.ResizeStyle := rsPattern // не в коем случае не rsUpdate
+ в XP где то была галка, аналогичная эту свойству сплитера
Страницы: 1 вся ветка
Текущий архив: 2005.08.14;
Скачать: CL | DM;
Память: 0.53 MB
Время: 0.043 c