2015-09-16 8 views
1

Я бы хотел, чтобы кнопки автоматического изменения размера сохраняли ту же ширину, когда некоторые кнопки невидимы. Я использовал код, подготовленный Andreas Rejbrand at this link, но проблема сложнее, когда я устанавливал некоторые кнопки невидимыми. В тех местах, где у нас есть невидимые кнопки, есть пробелы. Моя идея - проверить, сколько кнопок невидимо и следующий набор btnWidth в зависимости от количества видимых кнопок. Я действительно не знаю, как я могу проверить, невидимы ли кнопки в этом случае.Изменение размеров кнопок с одинаковой шириной, когда некоторые кнопки невидимы

Я хочу использовать TAdvGlowButton компонента для кнопок и TPanel компонента для панели и добавить OnResize процедуры панели, как показано ниже:

procedure TForm3.Panel4Resize(Sender: TObject); 
var 
    i: Integer; 
    btnWidth: Integer; 
begin 
    btnWidth := Panel4.Width div Panel4.ControlCount; 
    for i := 0 to Panel4.ControlCount - 1 do 
     begin 
     Panel4.Controls[i].Left := i * btnWidth; 
     Panel4.Controls[i].Width := btnWidth; 
     end; 
end; 

Не могли бы вы дать мне какие-либо идеи, как решить Эта проблема?

+1

Вместо этого необходимо заменить панель Panel4.ControlCount на количество видимых элементов управления, а затем установить ширину и левое из этих видимых элементов управления (не все). Вам нужно будет отслеживать число, которое видимо, или сначала пропустить, чтобы подсчитать их до того, как вы пройдете цикл, чтобы изменить их размер/изменить. –

ответ

1
procedure TForm3.Panel4Resize(Sender: TObject); 
const 
    cLeftMargin = 10; //Margin at the left side of the group of buttons 
    cSpacing = 10;  //Spacing/Margin between the buttons 
    cRightMargin = 10; //Margin at the right side of the group of buttons 
var 
    i, VisibleControls, lLeft: Integer; 
    btnWidth: Integer; 
begin 
    //count number of visible controls 
    VisibleControls := 0; 
    for i := 0 to Panel4.ControlCount - 1 do 
     if Panel4.Controls[i].Visible then 
     inc(VisibleControls); 

    btnWidth := (Panel4.Width-cLeftMargin-cRightMargin - cSpacing*(VisibleControls-1)) div VisibleControls; 

    //distribute the visible controls 
    lLeft := cLeftMargin; 
    for i := 0 to Panel4.ControlCount - 1 do 
     if Panel4.Controls[i].Visible then 
     begin 
     Panel4.Controls[i].Left := lLeft; 
     Panel4.Controls[i].Width := btnWidth; 
     lLeft := lLeft + btnWidth + cSpacing; 
     end; 
end; 
+0

спасибо за вашу умную идею, но я думаю о еще одном будущем - поля между кнопками. Я поместил этот код в 'procedure miResizeButtons (pnlToResize: TPanel)', чтобы использовать его для других панелей. Затем я модифицировал код с распределением видимых элементов управления и добавил: 'pnlToResize.Controls [i] .Left: = iVisibleButtons * (btnWidth + 1); pnlToResize.Controls [i] .Width: = btnWidth - 1; pnlToResize.Controls [i] .Top: = Panel4.Controls [0] .Top; pnlToResize.Controls [i] .Height: = Panel4.Controls [0] .Height; '. Единственная проблема в том, что иногда последняя кнопка выходит за рамки. У вас есть подсказка? – astack

+1

Я изменил ответ, включив левое и правое поля и расстояние между кнопками. Вы можете просто настроить значения const. – Hans

Смежные вопросы