Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > оптимизация формы под разрешение экрана


Автор: PaWeLL 24.4.2010, 21:49
Есть форма с нанесенными на неё компонентами(лейблы, дбгрид, кнопки, несколько вкладок).
Проектирую на мониторе с разрешении 1280*1024 а презентовать буду на мониторе с меньшим разрешением.
Вопрос в том, как сделать так, чтобы компоненты и сама форма автоматически подстраивались под разрешение экрана.
Не хотелось бы чтоб полформы с компонентами пришлось вытаскивать полосой прокрутки.
 

Автор: DarkProg 24.4.2010, 22:38
В DRKB есть готовое решение.

P.S. Не ленитесь юзать поиск.

Автор: Xenag 25.4.2010, 00:02
Ну вообще-то в дельфи есть уже готовое решение
И довольно простое
ScaleBy
Вот хорошее видео, демонстрируещее, как это работает:
http://codegearguru.com/video/020/ScaleBy.html

Автор: PaWeLL 25.4.2010, 00:52
Цитата(DarkProg @ 24.4.2010,  22:38)
В DRKB есть готовое решение.

P.S. Не ленитесь юзать поиск.

Я так понял, Вы имели в виду это решение

Код

procedure AdjustResolution(oForm:TForm);   
var  
  iPercentage:integer;   
begin  
  if Screen.Width > 640 then  
  begin  
    iPercentage:=Round(((Screen.Width-640)/640)*100)+100;   
    oForm.ScaleBy(iPercentage,100);   
  end;   
end;


Попробовал вставить его в свою прогу. Получилось вот так (код, не относящийся к делу опущен):

Код

unit Unit3;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls, Buttons, XPMan, ExtCtrls, Grids, DBGrids,
  Mask, DB, DBTables, DBCtrls, Menus;

type


    procedure FormCreate(Sender: TObject);
    procedure AdjustResolution(oForm:TForm);
    
    

  private
    { Private declarations }
  public
    { Public declarations }
  end;



var
  Form3: TForm3;
  wid:string;

implementation


{$R *.dfm}


procedure TForm3.FormCreate(Sender: TObject);
begin
AdjustResolution(oForm:TForm);
end;

procedure AdjustResolution(oForm:TForm);
var
  iPercentage:integer;
begin  
  if Screen.Width > 1280 then
  begin  
    iPercentage:=Round(((Screen.Width-1280)/1280)*100)+100;   
    oForm.ScaleBy(iPercentage,100);   
  end;   
end;


end.


В итоге получаю следующие сообщения:
[Error] Unit3.pas(383): Undeclared identifier: 'oForm'
[Error] Unit3.pas(383): Statement expected, but expression of type 'Class reference' found
[Error] Unit3.pas(141): Unsatisfied forward or external declaration: 'TForm3.AdjustResolution'
[Fatal Error] Project1.dpr(8): Could not compile used unit 'Unit3.pas'

Прошу помочь разобраться.  smile 

Автор: kuzyara 25.4.2010, 12:08
компилятор тебе подсказал сказал заявил , что не знает "oForm".
объясни ему что ты имел ввиду, когда ты это писал копировал.

может быть ОФорм - это текущая форма у автора кода?

найди взаимопонимание с компилятором, почувствуй его... станьте единым целым... (с)Сенсей

Автор: Alexeis 25.4.2010, 12:23
Код

procedure TForm3.FormCreate(Sender: TObject);
begin
AdjustResolution(oForm:TForm);
end;

Код

procedure TForm3.FormCreate(Sender: TObject);
begin
AdjustResolution(Self);
end;


Автор: PaWeLL 25.4.2010, 14:42
Alexeis, не получается. :(

[Error] Unit3.pas(145): Unsatisfied forward or external declaration: 'TForm3.AdjustResolution'

Автор: Alexeis 25.4.2010, 18:33
PaWeLL, функция AdjustResolution(oForm:TForm); определена ниже чем вызывается. Поменять местами реализацию AdjustResolution и FormCreate

Автор: PaWeLL 11.5.2010, 22:07
Запустил все-таки. Правда ничего не происходит. При запуске проги в меньшем разрешении форма не масштабируется. :(

Автор: Keeper89 12.5.2010, 02:10
Я обычно использую для этого TGridPanel smile

Автор: bems 12.5.2010, 03:45
PaWeLL, у тебя еще и метод объявлен, но не реализован (реализация стоит отдельной процедурой, а не методом формы)

Автор: PaWeLL 27.5.2010, 12:53
Вопрос все еще в силе.
Нужно как-то отмасштабировать форму с компонентами, созданную в 1280*1024 по меньшее разрешение - 1024*768
Ничего не помогает. smile 

Автор: Piroksen 31.5.2010, 03:01
Код

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;



Попробуй этот код,  мне помогло. авторство не мое нашел когда то в гугле 

Автор: Akella 1.6.2010, 13:16
Цитата(PaWeLL @  24.4.2010,  21:49 Найти цитируемый пост)
Проектирую на мониторе с разрешении 1280*1024 а презентовать буду на мониторе с меньшим разрешением.

не хочешь изучать язык, читать смотреть, понимать, так просто напросто укажи размер формы при разработке 800х600 и всё.

Автор: БелАмор 10.6.2010, 08:19
Мой подход к решению этого вопроса:

1. Масштабируются только формы, имеющие элементы вроде гридов, мемо и т.д., которые, собственно, и меняют размер при растягивании формы. На форме обычно только один такой элемент, чаще всего - какой-нибудь грид. 
2. Форма разрабатывается исходя из минимально возможных размеров, при которых элементы ещё не налезают друг на друга, а грид имеет размер, ещё позволяющий работать.
3. В конструкторе форме устанавливаются ограничения на минимальные размеры по текущим размерам (т.е. заданным в дизайнере), т.е. форму можно увеличивать по своему усмотрению, но уменьшать меньше, чем она была в дизайнере - нельзя.
4. Для того, чтобы элементы правильно разъезжались, используются Anchors и выравнивание.
5. Настройки формы сохраняются и восстанавливаются для каждого разрешения экрана индивидуально. Т.е. при первом запуске программы на конкретном разрешении форма показывается с минимальными размерами, пользователь её растягивает под себя, и при последующих запусках с этим разрешением уже используются сохранённые настройки.

Посмотрите ещё ссылку: http://www.delphikingdom.com/asp/answer.asp?IDAnswer=56561
В частности, сообщение от 01-11-2007 14:29

Автор: JamesPab 18.11.2022, 05:34
Модератор: Сообщение скрыто.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)