Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 09.06.2013, 15:39
Krater Krater вне форума
Прохожий
 
Регистрация: 09.06.2013
Сообщения: 3
Версия Delphi: Delphi 2009
Репутация: 10
По умолчанию Масштабирование формы и компонентов + разрешение экрана

Всем привет!
Разработал программу у себя на компе(разрешение экрана 1366х768) в полноэкранном режиме(свойство формы WindowState=WSMaximized). В программе присутствуют панели, имейджи, лейбелы и т.д. Запустив готовый скомпилированный экзешник на нетбуке(разрешение экрана 1024x600) почти половина программы не поместилась(не отобразилась) на экране нетбука. Как написать универсальную программу, которая бы нормально(во весь экран) отображалсь при любом разрешении экрана. Прогуглив инет и испробовав готовые коды, должного рез-та не добился. К примеру использовал след.код:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, jpeg, ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Image1: TImage;
    Image2: TImage;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

const
  ScreenWidth: Integer = 1366;
  ScreenHeight: Integer = 768;
  
var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var x, y: LongInt;
begin
Form1.WindowState:=wsMaximized;
Image1.Align:=alClient;
Image1.Stretch:=True;
{Image1.Proportional:=True;}

Image2.Align:=alClient;
Image2.Stretch:=True;
{Image2.Proportional:=True;}
scaled := true;
  x := getSystemMetrics(SM_CXSCREEN);
  y := getSystemMetrics(SM_CYSCREEN);
  if (x <> ScreenHeight) or (y <> ScreenWidth) then
  begin
    Form1.height := Form1.height * x div ScreenWidth;
    Form1.width := Form1.width * y div ScreenHeight;
  end;

 if x <> ScreenWidth then
    scaleBy(x, ScreenWidth);  
end;

end.
Результат таков, что титульный Image(который расположен на форме отображается нормально при любом разрешении экрана), а компонент Panel и Image(который расположен на панели) по ширине отображается нормально, а высота отображается НЕ нормально, а именно меньше чем должна быть.
Код:
const
ScreenWidth: LongInt = 1366; 
ScreenHeight: LongInt = 768;
procedure TForm1.FormCreate(Sender: TObject);
var
iPercentage:integer;
begin
Form1.Scaled:=True;
Image1.Align:=alClient;
Image1.Stretch:=True;
Image2.Align:=alClient;
Image2.Stretch:=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.
Этот код тоже не помогает, результат таков же как и выше описанный...
Пожалуйста, помогите с кодом или посоветуйте в каком направлении копать дальше. Заранее спасибо!
Ответить с цитированием
  #2  
Старый 09.06.2013, 21:37
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Очевидно не надо собирать под своё разрешение, оно не всегда доступно, раньше был стандарт 640Х480, потом 800Х600, теперь видимо это 1024Х768, под него и нужно минимальные размеры формы устанавливать, а масштабирование примерно так в OnCreate формы выставлять
Код:
if Screen.Width > 1024  then ScaleBy(Round(((Screen.Width - 1024) / 1024) * 100) + 100, 100);
есть вариант при создании формы отслеживать разрешение и под него расположение и размер компонентов на ней подставлять, но это муторно и затратно по времени, возможно есть уже готовый компонент, типа СmpStorage или Storage Library, точно не знаю, надо поглядеть.

вот статьи по теме
Ответить с цитированием
  #3  
Старый 09.06.2013, 23:54
Krater Krater вне форума
Прохожий
 
Регистрация: 09.06.2013
Сообщения: 3
Версия Delphi: Delphi 2009
Репутация: 10
По умолчанию

Прописав Ваш код в OnCreate формы.Запустил готовый скомпилированный exeшник проги в разрешении экрана 1366х768. Результат: компонент Panel и Image расположенный на нём слишком большие. Запустил прогу в разрешении экрана 1152х864, результат: высота норм(не хватает 3-5 пикселей), а ширина панели и Image слишком длинная. Я в безисходном положении Неужели нет какого нибудь универсального метода в решении моей проблемы... Но за попытку спасибо!
Ответить с цитированием
  #4  
Старый 10.06.2013, 00:12
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от Krater
Прописав Ваш код в OnCreate формы.Запустил готовый скомпилированный exeшник проги в разрешении экрана 1366х768. Результат: компонент Panel и Image расположенный на нём слишком большие. Запустил прогу в разрешении экрана 1152х864, результат: высота норм(не хватает 3-5 пикселей), а ширина панели и Image слишком длинная. Я в безисходном положении Неужели нет какого нибудь универсального метода в решении моей проблемы... Но за попытку спасибо!

Универсального - нет.
Надо дизайн интерфейса делать таким, что бы без масштабирования он сам подстраивался под текущие размеры формы. Помогут в этом якоря (Anchor). Ну а с картинками тут, кроме как принудительно переразмеривать их, ничто не поможет. Можно сами картинки делать либо не чуствительные к масштабированию, либо делать фон, а картику либо прозрачной, либо такого же цвета по краям.

Но это все общие советы. Тут надо смотреть на конкретный дизайн в аспекте самого приложения. Тогда можно попробовать подсказать что-то более конкретное.
Ответить с цитированием
  #5  
Старый 10.06.2013, 11:24
Аватар для Mrak
Mrak Mrak вне форума
Местный
 
Регистрация: 26.01.2013
Адрес: МО
Сообщения: 438
Версия Delphi: XE2
Репутация: 17
По умолчанию

Цитата:
Сообщение от lmikle
Универсального - нет.
Надо дизайн интерфейса делать таким, что бы без масштабирования он сам подстраивался под текущие размеры формы. Помогут в этом якоря (Anchor). Ну а с картинками тут, кроме как принудительно переразмеривать их, ничто не поможет. Можно сами картинки делать либо не чуствительные к масштабированию, либо делать фон, а картику либо прозрачной, либо такого же цвета по краям.

Но это все общие советы. Тут надо смотреть на конкретный дизайн в аспекте самого приложения. Тогда можно попробовать подсказать что-то более конкретное.
еще добавлю про очень хорошее свойство align в связке с alignwithmargins и margins
я делал так: главная форма открывается в маленьком разрешении с автоскроллами. на форме 4 основных контейнера groupbox c установленными align. если надо больше форму - тыкаем на развернуть окно (border icons - visible = true для всех)
__________________
Я за здоровый экстрим!
Спасибо за "спасибо")
Ответить с цитированием
  #6  
Старый 11.06.2013, 00:29
Krater Krater вне форума
Прохожий
 
Регистрация: 09.06.2013
Сообщения: 3
Версия Delphi: Delphi 2009
Репутация: 10
По умолчанию

Поэксперементировав со свойствами AlignWithMargins и Margins под разрешением экрана 1024х600 я подогнал вручную свойства Marigins(Bottom, Left, Top, Right). Относительно панелей и Image'ов результат очень обрадовал. Но кто подскажет коэффицент подсчета Отступа слева, справа, сверху, снизу. Исходным разрешением является 1366х768. Подскажите плиз!
Ответить с цитированием
  #7  
Старый 11.06.2013, 00:44
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Видимое поле формы без рамки справа, слева и снизу и шапки с кнопками вверху, это ClientHeight и ClientWidth
Ответить с цитированием
  #8  
Старый 11.06.2013, 00:55
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Цитата:
Сообщение от Krater
... Исходным разрешением является 1366х768...
Продолжаем считать убогое разрешение своего монитора пупоп Земли?
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
Этот пользователь сказал Спасибо angvelem за это полезное сообщение:
Alegun (11.06.2013)
  #9  
Старый 11.06.2013, 01:25
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Цитата:
Сообщение от Krater
Поэксперементировав со свойствами AlignWithMargins и Margins под разрешением экрана 1024х600 я подогнал вручную свойства Marigins(Bottom, Left, Top, Right). Относительно панелей и Image'ов результат очень обрадовал. Но кто подскажет коэффицент подсчета Отступа слева, справа, сверху, снизу. Исходным разрешением является 1366х768. Подскажите плиз!
Можно попробовать подсчитать для каждого из компонентов формы коэфициенты для высоты, ширины относительно базового разрешения и записать их в файл настроек. При смене разрешения применять эти коэфициенты к компонентам, для получения новых размеров.

Хотя там ведь еще и положение заново нужно пересчитывать. Пожалуй не прокатит.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.

Последний раз редактировалось Страдалецъ, 11.06.2013 в 01:50.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 11:06.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025