Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.11.26;
Скачать: [xml.tar.bz2];

Вниз

Проблеммы с двумя TSpliter   Найти похожие ветки 

 
atruhin ©   (2006-10-05 17:08) [0]

Как использовать на форме 2 TSpliter расположенных в одном направлении?
Если расположить просто, то происходят глюки при перемещении первого за второй.
Пробовал разделить компонент|панель, а на панели еще компоненты 2|3. Работает лучше, но сплитер находящийся на панели исчезает с экрана, если ограничить верхний компонент (Constraints), то происходят станные глюки с размером формы.


 
palva ©   (2006-10-05 17:45) [1]

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


 
atruhin ©   (2006-10-05 18:25) [2]

Это я в хелпе могу прочитать, а ты попробуй, сделай по рецепту, потом  надвинь правый сплитер на левый, и раздвинь. Центральная панель скроется навсегда.


 
palva ©   (2006-10-05 23:10) [3]

Открыть групповое свойство Constraints центральной панели и выставить ненулевой MinWidth


 
atruhin ©   (2006-10-06 07:54) [4]

Все спасибо помогло: у левой и центральной панели выставить Constraints.MinWidth, у правой оставить = 0. Только в таком варианте работает, во всех остальных глюки.


 
atruhin ©   (2006-10-06 21:28) [5]

Все таки возникло продолжение.
С вертикальными панелями и сплитерами все работает, с горизонтальными нормальной работы добиться не удалось, установка Constraints.MinHeight, не помогает.


 
Korneley ©   (2006-10-07 12:35) [6]

На форму:
 панель1 - влево, сплиттер - влево, панель2 - клиент.
На панель2:
 панель3 - влево, сплиттер - влево, панель4 - клиент.
 
Ну и с Constraints можно поварьировать, хотя и без этоо работает.
Наверно :)


 
Korneley ©   (2006-10-07 12:45) [7]

Еще мнение (ИМХО естественно):
 Не надо создавать на контейнере больше двух элементов. Один - вправо, влево, вверх, вниз, второй - клиент. А вот на этом клиенте опять два элемента... и т.д.


 
atruhin ©   (2006-10-07 14:56) [8]

> Еще мнение (ИМХО естественно):

Это понятно и внимательно прочитай вопрос, там именно такой вариант описан. Просто прежде чем советовать попробуй.
Во вторых:
> С вертикальными панелями и сплитерами все работает, с горизонтальными
> нормальной работы добиться не удалось


 
Virgo_Style ©   (2006-10-07 15:51) [9]

atruhin ©   (07.10.06 14:56) [8]

Как делал? У меня MinHeight действует как надо.


 
atruhin ©   (2006-10-07 16:06) [10]

Кинул панель Aligh=alBottom, cплитер Aligh=alBottom,
панель Aligh=alBottom, cплитер Aligh=alBottom,
панель Aligh=alClient.
Далее для первой и второй панели (у которых Aligh=alBottom) устанавливаю MinHeight=40.
Запукаем верхний сплитер надвигем на нижний, получаем глюк.
PS. Если все сделать аналогично на с вертикальными элементами, все работает нормально, как видимо глюк Delphi 7.


 
Korneley ©   (2006-10-12 20:06) [11]

Заранее приношу извинения за многословность, но если задание не состоит в том чтобы устранить глюк  исключительно установками свойств компонент в дизайн-тайме, то можно конролировать сплиттеры на  событии OnCanResize, чтобы они не "ездили" больше положенного.

Например вариант:

Panel1 - alBottom
Splitter1 - alBottom
Panel2 - alClient
На Panel2:
 Panel3 - alBottom
 Splitter2 - alBottom
 Panel4 - alClient

!!!Все панели кроме Panel2 имеют ненулевой MinHeight!!!

//Для Splitter1
procedure TForm1.Splitter1CanResize(Sender: TObject; var NewSize: Integer;
 var Accept: Boolean);
begin
// считаем высоты всех компонент, которые сдвигает сплиттер
 Accept := ((Panel4.Constraints.MinHeight + 1 +
// без +1 форма все-таки чуть-чуть "едет" (?)
             Splitter2.Height +
             Panel3.Height +
             Splitter1.Height +
             NewSize) // предпологаемая высота Panel1
             <
             Form1.ClientHeight) // область расположения
end;
// Аналогично для Splitter2
procedure TForm1.Splitter2CanResize(Sender: TObject; var NewSize: Integer;
 var Accept: Boolean);
begin
 Accept := ((Panel4.Constraints.MinHeight + 1 +
             Splitter2.Height +
             NewSize)
             <
             Panel2.ClientHeight)
end;

 Для пущего "плезиру" можно сделать равными Panel1.Constraints.MinHeight и Splitter1.MinSize, а  также Panel3.Constraints.MinHeight и Splitter2.MinSize. Это  на работу вроде не влияет, но зато  сплиттер останавливается там, где он будет после отпускания мыши. Думаю, что и без Panel2 работать будет, хотя не пробовал.

Глюк по-моему происходит из-за того, что сплиттер меняет размер одной только нижней (т.к. alBottom)  панели, не обращая внимание на MinHeight верхней и на высоту всех, кто между ними. После отпускания  мыши, высота верхней все равно становится MinHeight, у других остается прежней, у нижней - новой.  Бац! И форма "плывет". Уверенно глючит  даже с одним сплиттером и двумя панелями. Ну а больше  панелей - ...
Зы: я по-наивности думал, что вертикальный элемент, это _раздвигающий_ вертикально ;)


 
Korneley ©   (2006-10-12 20:13) [12]

Да, если у Panel2.BorderWidth > 0 то его тоже учитывать надо, короче считаем все, что двигаем


 
Korneley ©   (2006-10-13 07:41) [13]

> // без +1 форма все-таки чуть-чуть "едет" (?)
>            

Для Splitter1

 Accept := ((Panel4.Constraints.MinHeight +
             Splitter2.Height +
             Panel3.Height +
             Splitter1.Height +
             Panel2.BorderWidth * 2 +
             integer(Panel2.BevelInner <> bvNone) * 2 * Panel2.BevelWidth +
             integer(Panel2.BevelOuter <> bvNone) * 2 * Panel2.BevelWidth +
             (Panel2.Height - Panel2.ClientHeight) +
             NewSize)
             <
             Form1.ClientHeight);

для Splitter2

 Accept := ((Panel4.Constraints.MinHeight +
             Splitter2.Height +
             Panel2.BorderWidth * 2 +
             integer(Panel2.BevelInner <> bvNone) * 2 * Panel2.BevelWidth +
             integer(Panel2.BevelOuter <> bvNone) * 2 * Panel2.BevelWidth +
             NewSize)
             <
             Panel2.ClientHeight);

Вроде все учел


 
atruhin ©   (2006-10-13 08:21) [14]

Большое спасибо!!!
Кстати не разбирался, почему с вертикальными сплитерами все работает, а с горизонтальными глюки? Ошибки VCL?


 
Korneley ©   (2006-10-13 14:38) [15]

Дык, там тоже глючит. Только иначе. Вот тот же вариант, только с alLeft при установке у 4-й панели MinWidth приводит к именениям размера формы, но вправо. Без установки - сплиттеры уезжают за клиентскую часть, при сдвижке всего вправо - сплиттеры слипаются и разлепить их весьма проблематично. Правда сами сплиттеры отображаются исправно. Азия-с...



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2006.11.26;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.045 c
15-1163080474
Greenchel
2006-11-09 16:54
2006.11.26
Сохранить текст из Edit


2-1162985547
Благодарный слушатель
2006-11-08 14:32
2006.11.26
Сложная математика


2-1162977426
cpower
2006-11-08 12:17
2006.11.26
format


1-1160577294
Krants
2006-10-11 18:34
2006.11.26
Узнать длину форматированого текста


1-1161005590
id
2006-10-16 17:33
2006.11.26
Передача массива в процедуру в кач-ве var параметра.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский