Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.12.2016, 19:05   #1
АНАТОЛИЙ249
Пользователь
 
Регистрация: 05.02.2007
Сообщений: 91
По умолчанию Кто поможет Вывести панели как skype по средине

Есть 20 панелей как их вывести равномерно на форму
если высота и ширина формы 500х500, высота и ширина панелей 70x70,
что бы не от самого края формы считать, пробовал коряво получается,
не могу придумать формулу расчета. Панелей может быть больше или меньше. Может кто подскажет.

Спасибо.
АНАТОЛИЙ249 вне форума Ответить с цитированием
Старый 20.12.2016, 20:03   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Что-то не понятно что Вам надо. Какие панели? Они и все просто к шапке окна прилеплены.
Человек_Борща вне форума Ответить с цитированием
Старый 20.12.2016, 20:08   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

У окна есть свойства ClientWidth ClientHeight ClientRect. От них и пляши считая Left и Top панели
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 20.12.2016, 20:52   #4
Zis67
Пользователь
 
Аватар для Zis67
 
Регистрация: 06.04.2011
Сообщений: 80
По умолчанию

procedure TForm1.Button1Click(Sender: TObject);
var i,x,y:integer;
begin
y:=4;
x:=0;
for i:=0 to Componentcount-1 do
if Components[i] is tpanel then begin
(Components[i] as tpanel).Top:=x*70+4;
(Components[i] as tpanel).Left:=y;
x:=x+1;
if i mod 4=0 then begin
y:=y+74;
x:=0;
end;
end;
end;

кривовато пожалуй, но суть полагаю выражена.
Zis67 вне форума Ответить с цитированием
Старый 21.12.2016, 03:46   #5
АНАТОЛИЙ249
Пользователь
 
Регистрация: 05.02.2007
Сообщений: 91
По умолчанию

Спасибо за ответы и помощь буду разбиратся.
АНАТОЛИЙ249 вне форума Ответить с цитированием
Старый 21.12.2016, 12:51   #6
Heneken87
Форумчанин
 
Регистрация: 27.04.2012
Сообщений: 219
По умолчанию

МОЯ ПАНЕЛЬ.Left:=round(ФОРМА.Width/2-МОЯ ПАНЕЛЬ.Width/2);
МОЯ ПАНЕЛЬ.top:=round(ФОРМА.Height/2-МОЯ ПАНЕЛЬ.Height/2);
А сорямба, недочитал, это по центу выводит)
Пишу много и развернуто
Heneken87 вне форума Ответить с цитированием
Старый 21.12.2016, 13:51   #7
АНАТОЛИЙ249
Пользователь
 
Регистрация: 05.02.2007
Сообщений: 91
По умолчанию

Мне и надо начинать от центра ,заполнять форму панелями в не зависимости сколько будет панелей,если не влазит значит нужно будет увеличивать размеры формы.

МОЯ ПАНЕЛЬ.Left:=round(ФОРМА.Width/2-МОЯ ПАНЕЛЬ.Width/2);
МОЯ ПАНЕЛЬ.top:=round(ФОРМА.Height/2-МОЯ ПАНЕЛЬ.Height/2);
это наверно не подойдет , так как если панель одна и панели создаются динамически .

Если нужно вывести допустим 4 панели от центра формы (размеры панелей 70х70 и расстояние между панелями 5 .

форма 500х500 , в одну строку на форме влезет 6 панелей(6*70=420)+(6*5)=30,
420+30=450,500-450=50/2=25 ,25 отступ с лева формы и справа, я так думаю,может не правильно считаю.
затем заполнять вторую строку от центра(тут не понятно можно в низ выводить, или с верху этой строки , или можно сдвинуть эти 2 строки что бы они были обе от центра) (допустим у нас 10 панелей) 6 панелей в оду строку по центру
10-6=4, можно расположить 4 панели с верху тех панелей 6 которые уже вывели),
так же вывести вторую строку с верху 4 панели от центра.

Получается 6 панелей по центру, 4 панели с верху но от центра по длине .
Ну и при изменение формы они должны перестраиватся, если форма увеличила размеры.

Может какой компонент есть для вывода ?

Но всё равно спасибо за помощь и ответы.

Последний раз редактировалось АНАТОЛИЙ249; 21.12.2016 в 13:59.
АНАТОЛИЙ249 вне форума Ответить с цитированием
Старый 21.12.2016, 14:21   #8
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Код:
m:=4; //сколько панелек  хотим в строку
n:=5; //а сколько в колонку  
dx:=6; 
dy:=6; //расстояние в пикселях МЕЖДУ панельками (как в строке, так и в колонке)
x:=( formWidth - (panelWidth *m) - dx*(m-1) ) div 2; //СВОБОДНОЕ МЕСТО слева (такое же будет и справа)
y:=( formHight - (panelHight *n) - dy*(n-1) ) div 2; //свободное место сверху/снизу

for j:=0 to n*m-1 do begin
  r:=TPanel.Create(form1);// мы не будем расставлять имеющиеся, будем создавать их сами.
  r.top:=y + (j div m)*(panelhight +dy);
  r.height:=panelhight;
  r.left:=x + (j mod m)*(panelwidth +dx);
  r.width:=panelwidth;
  r.parent:=form1;
end;
если все таки будем работать с имеющимися, то components[...] вам помощь.
P.S. а лучше controls[]
он же поможет если мы захотим удалить УЖЕ существующие ПЕРЕД созданием новых.
Код:
for j:=form1.controlcount -1 downto 0 do begin // при удалении НАДО начинать с конца и двигаться к началу 
  if form1.contols[j] is Tpanel then form1.controls[j].Free;
Цитата:
Ну и при изменение формы они должны перестраиватся, если форма увеличила размеры.
"запихнуть" расчеты в OnResize формы.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 21.12.2016 в 14:35.
evg_m вне форума Ответить с цитированием
Старый 21.12.2016, 15:53   #9
АНАТОЛИЙ249
Пользователь
 
Регистрация: 05.02.2007
Сообщений: 91
По умолчанию

m:=4; //сколько панелек хотим в строку
n:=5; //а сколько в колонку
dx:=6;

Вся проблема что я не знаю сколько будет выводится панелей,да я здесь вижу что будет выводится 20 панелей как описал выше;




m:=4; //сколько панелек хотим в строку
n:=5; //а сколько в колонку
dx:=6;
dy:=6; //расстояние в пикселях МЕЖДУ панельками (как в строке, так и в колонке)
x:=( formWidth - (panelWidth *m) - dx*(m-1) ) div 2; //СВОБОДНОЕ МЕСТО слева (такое же будет и справа)
y:=( formHight - (panelHight *n) - dy*(n-1) ) div 2; //свободное место сверху/снизу

for j:=0 to n*m-1 do begin
r:=TPanel.Create(form1);// мы не будем расставлять имеющиеся, будем создавать их сами.
r.top:=y + (j div m)*(panelhight +dy);
r.height:=panelhight;
r.left:=x + (j mod m)*(panelwidth +dx);
r.width:=panelwidth;
r.parent:=form1;
end;




проверил да работает но выводит не с центра формы а с верху, а мне нужно от центра


Допусти нужно вывести 2 панели(70х70) по центру формы,вывели , затем нужно к ним добавить еще 3 панели(70х70) ,и того у нас 5 панелей ,

1- рассчитываем сколько у нас войдет в строку панелей (500 / (70+5)=6) ,войдет 6 панелей ,
т.е. 5 панелей у нас входит на форму в одну строку.

5*75=375-общая длинна панелей вместе с расстоянием между панелями,
500-375=125
125/2=62 расстояние от левого края откуда нужно выводить панели

var
k:integer;
begin
k:=62;

for i:=0 to 4 do
begin
panel[i].left:=k;
panel[i].top:=(form1.Height div 2)-(panel[i].Height div 2);
inc(k,75);
end;

end;

в одну строку у меня получается вывести панели если они входят на форму все,а если нужно вывести дальше 2-строку панелей тоже от центра, то не получается.









Спасибо огромное за помощь и ответы !!!
Сделаю отпишусь.

Последний раз редактировалось АНАТОЛИЙ249; 21.12.2016 в 18:02.
АНАТОЛИЙ249 вне форума Ответить с цитированием
Старый 22.12.2016, 08:07   #10
Heneken87
Форумчанин
 
Регистрация: 27.04.2012
Сообщений: 219
По умолчанию

Ну как то так вроде:
Код:
var p,p2:Tpanel;
i,j,max_panel:integer;
begin
for i:=1 to max_panel do
begin
if findcomponent('Panel_'+inttostr(i)) <>nil then //Если компонент найден по имени
begin
p:= findcomponent('Panel_'+inttostr(i)) as Tpanel;
p.Left:=round(ФОРМА.Width/2-p.Width/2);//центрируем найденную панельку
p.top:=round(ФОРМА.Height/2-p.Height/2);
if i>1 then Если панель не первая, нужно сдвинуть все предыдущие панели ,например влево
begin
for j:=i-1 downto 1 do //Вертим в обратном направлении
begin
  if findcomponent('Panel_'+inttostr(j)) <>nil then //Если компонент найден
   begin
   p2:=findcomponent(('Panel_'+inttostr(j)) as Tpanel;
   p2.left:= p2.left-p2.width;// Сдвигаем влево (Если ширина панелей одинакова сьезжать ничего не должно)
   end;

end;
end;

end;
end;
end;
p/s Код с руки писал, мог что-то не учесть. Естественно имена панелей должны быть следующими Panel_1,Panel_2......Panel_10. Это решается при создании панелей, также Max_panel будет присвоена при созданиях. Конечно лучше такой динамике присвоить панелям какие нибудь уникально-собвственные имена, чтобы функция не тащила все панели на форме)
Думаю суть будет понятна, дальше сможешь сам разобрать как двигать вверх-вниз
Пишу много и развернуто

Последний раз редактировалось Heneken87; 22.12.2016 в 08:25.
Heneken87 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Кто поможет? Skripach Помощь студентам 13 11.10.2014 16:18
Кто поможет димон4ик_ Помощь студентам 0 17.10.2011 14:34
кто поможет Marta18 Microsoft Office Excel 1 14.06.2011 02:40
Кто поможет??? sashahttp Общие вопросы Delphi 1 24.06.2008 09:15
Кто поможет оптимизировать прогу, а то я уже оптимизировал как мог :) Droid Помощь студентам 7 12.05.2008 20:56