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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 10.01.2012, 19:38
villipuk villipuk вне форума
Прохожий
 
Регистрация: 10.01.2012
Сообщения: 6
Репутация: 10
Вопрос Непослушные компоненты

Доброго дня!
Надеюсь на помощь....
Есть такой код:
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    GroupBox1: TGroupBox;
    Button5: TButton;
    Panel2: TPanel;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    procedure FormResize(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  w,h:integer;
implementation

{$R *.dfm}

procedure TForm1.FormResize(Sender: TObject);
var prw,prh:real;i:integer;
begin
prw:=form1.Width/w;
prh:=form1.height/h;
for i:=0 to form1.ComponentCount-1 do
if (components[i] is tbutton) and (components[i] is tlabel) and (components[i] is TGroupBox) and (components[i] is tpanel) then
begin
(components[i] as tbutton).Left:=round((components[i] as tbutton).Left*prw);
(components[i] as tbutton).top:=round((components[i] as tbutton).top*prh);
(components[i] as tbutton).width:=round((components[i] as tbutton).width*prw);
(components[i] as tbutton).height:=round((components[i] as tbutton).height*prh);
(components[i] as tlabel).Left:=round((components[i] as tlabel).Left*prw);
(components[i] as tlabel).top:=round((components[i] as tlabel).top*prh);
(components[i] as tlabel).width:=round((components[i] as tlabel).width*prw);
(components[i] as tlabel).height:=round((components[i] as tlabel).height*prh);
(components[i] as tpanel).Left:=round((components[i] as tlabel).Left*prw);
(components[i] as tpanel).top:=round((components[i] as tlabel).top*prh);
(components[i] as tpanel).width:=round((components[i] as tlabel).width*prw);
(components[i] as tpanel).height:=round((components[i] as tlabel).height*prh);
(components[i] as TGroupBox).Left:=round((components[i] as TGroupBox).Left*prw);
(components[i] as TGroupBox).top:=round((components[i] as TGroupBox).top*prh);
(components[i] as TGroupBox).width:=round((components[i] as TGroupBox).width*prw);
(components[i] as TGroupBox).height:=round((components[i] as TGroupBox).height*prh);
end;
w:=form1.Width;
h:=form1.Height;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
w:=form1.Width;
h:=form1.Height;
end;

end.

Тут код для растягивания компонентов формы при изменении размеров программы...
Данный код не работает, но если его писать только для tbutton, то все работает хорошо.

Код:
if (components[i] is tbutton) then
begin
(components[i] as tbutton).Left:=round((components[i] as tbutton).Left*prw);
(components[i] as tbutton).top:=round((components[i] as tbutton).top*prh);
(components[i] as tbutton).width:=round((components[i] as tbutton).width*prw);
(components[i] as tbutton).height:=round((components[i] as tbutton).height*prh);

Помогите разобраться с проблемой.
Необходимо чтобы все компоненты формы изменяли размер при изменении размера формы.

Просто не могу найти ошибку.
Ответить с цитированием
  #2  
Старый 10.01.2012, 19:48
m1sclick m1sclick вне форума
Начинающий
 
Регистрация: 04.07.2011
Адрес: Украина
Сообщения: 186
Версия Delphi: 2010
Репутация: 2094
По умолчанию

Оо
А для этого нужно еще и код писать? Я удивлен, всегда думал что в палитре компонентов нажатием пары кнопок это все делается)
Ответить с цитированием
  #3  
Старый 10.01.2012, 19:50
villipuk villipuk вне форума
Прохожий
 
Регистрация: 10.01.2012
Сообщения: 6
Репутация: 10
По умолчанию

Цитата:
Сообщение от m1sclick
Оо
А для этого нужно еще и код писать? Я удивлен, всегда думал что в палитре компонентов нажатием пары кнопок это все делается)

Ну допустим что так... тогда почему компаненты друг на друга при этом наезжают, а в моем коде нет?
Вероятно код нужен... не просто же так помощи прошу.
Ответить с цитированием
  #4  
Старый 10.01.2012, 19:50
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Разумеется.
Код:
if (components[i] is tbutton) and (components[i] is tlabel) and (components[i] is TGroupBox) and (components[i] is tpanel) then
Компонент же не может быть одновременно и кнопкой, и лейблом, и групп боксом, и панелью? Он должен быть чем-то одним. По этому надо серию проверок.
Код:
if (components[i] is tbutton) then
 begin
  // тут для кнопок
 end
else if (components[i] is tlabel) then
 begin
  // тут для Label
 end
else...
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
Этот пользователь сказал Спасибо Bargest за это полезное сообщение:
villipuk (10.01.2012)
  #5  
Старый 10.01.2012, 19:59
villipuk villipuk вне форума
Прохожий
 
Регистрация: 10.01.2012
Сообщения: 6
Репутация: 10
По умолчанию

Цитата:
Сообщение от Bargest
Разумеется.
Код:
if (components[i] is tbutton) and (components[i] is tlabel) and (components[i] is TGroupBox) and (components[i] is tpanel) then
Компонент же не может быть одновременно и кнопкой, и лейблом, и групп боксом, и панелью? Он должен быть чем-то одним. По этому надо серию проверок.
Код:
if (components[i] is tbutton) then
 begin
  // тут для кнопок
 end
else if (components[i] is tlabel) then
 begin
  // тут для Label
 end
else...

Но тогда программа не запускается, выдает ошибку "Invalid class typecast".
Это с чем может быть связано?
Ответить с цитированием
  #6  
Старый 10.01.2012, 20:12
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Напишите свой полный код.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
Этот пользователь сказал Спасибо Bargest за это полезное сообщение:
villipuk (10.01.2012)
  #7  
Старый 11.01.2012, 10:58
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

А почему не используете якоря (Anchors) элементов? И ничего программировать не надо.
Ответить с цитированием
  #8  
Старый 11.01.2012, 11:21
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

Свойства Left,Top,Width и Height есть уже у TControl, поэтому
Код:
var
  C:TControl;
..
if (Components[i] is TControl) then
begin
  C:=TControl(Components[i]);
  C.Left:=round(C.Left*prw);
  C.Top:=round(C.Top*prh);
  C.Width:=round(C.Width*prw);
  C.Height:=round(C.Height*prh);
Ответить с цитированием
  #9  
Старый 11.01.2012, 11:28
villipuk villipuk вне форума
Прохожий
 
Регистрация: 10.01.2012
Сообщения: 6
Репутация: 10
По умолчанию

Цитата:
Сообщение от AlexSku
А почему не используете якоря (Anchors) элементов? И ничего программировать не надо.

Потому что, при растягивании формы компоненты друг на друга наезжают...
Ответить с цитированием
  #10  
Старый 11.01.2012, 15:06
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

Цитата:
Сообщение от villipuk
компоненты друг на друга наезжают...
что-то мне подсказывает, что если накидать на форму панелей с allign-ом, на них накидать ещё панелей тоже с align-ом, а на них уже всё остальное - с anchors, то всё будет работать как надо
и скрин надо было лучше кинуть, а не этот код
Ответить с цитированием
  #11  
Старый 11.01.2012, 18:46
villipuk villipuk вне форума
Прохожий
 
Регистрация: 10.01.2012
Сообщения: 6
Репутация: 10
По умолчанию

Цитата:
Сообщение от Pyro
что-то мне подсказывает, что если накидать на форму панелей с allign-ом, на них накидать ещё панелей тоже с align-ом, а на них уже всё остальное - с anchors, то всё будет работать как надо
и скрин надо было лучше кинуть, а не этот код

Скрины приложил....
Там один стандарт, второй при уменьшении... третий при возвращении в исходный размер.

И можно узнать про align'ы побольше от тебя?
Ну может пример какой простой...?
Изображения
Тип файла: jpg 1.JPG (29.2 Кбайт, 12 просмотров)
Тип файла: jpg 2.JPG (16.1 Кбайт, 10 просмотров)
Тип файла: jpg 3.JPG (23.8 Кбайт, 10 просмотров)
Ответить с цитированием
  #12  
Старый 11.01.2012, 21:33
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Судя по картинкам, ни о каком выравнивании (Align) речи не идёт, банальное изменение размеров контролов, что не есть хорошо для пользователя. На маленьком размере окна в контрол мышкой не попадёшь, при большом будут мозолить глаза. Лучше использовать Aligns/Anchors. Чтобы при чрезмерном уменьшении окна контролы не наезжали друг на друга, можно ограничить минимальный размер окна.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #13  
Старый 11.01.2012, 21:36
villipuk villipuk вне форума
Прохожий
 
Регистрация: 10.01.2012
Сообщения: 6
Репутация: 10
По умолчанию

Цитата:
Сообщение от angvelem
можно ограничить минимальный размер окна
Хм спасибо... не подумал...
И ведь максимальный размер можно ограничить чтобы не было деформации объектов на форме...

Спасибо, бро!)
Ответить с цитированием
  #14  
Старый 12.01.2012, 10:46
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

Поставь вообще неизменяемый размер (Border - Single)
Ответить с цитированием
  #15  
Старый 12.01.2012, 13:09
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
  BorderStyle:=bsSingle;
  BorderIcons:=[biSystemMenu, biMinimize];
можно без biMinimize, если это диалог.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter