Форум по 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,088
Версия 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. Подскажите плиз!
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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