AutoSize w GroupBox

0

Witam!
Szukam jakiegoś sposobu na przeskalowanie GroupBox'a w taki sposób aby uzyskać efekt AutoSize (GroupBox zmieni swoje parametry szerokości i wysokości tak aby miał jak najmniejsze wymiary ale zmieściły sie w nim wszystkie komponenty). Czy zna ktoś jakiś sposób aby coś takiego zrobić? Będe bardzo wdzięczny za wszelki wskazówki!

0
procedure TForm1.Button2Click(Sender: TObject);
var
  i,max:integer;
begin
  for i:=0 to Form1.ComponentCount-1 do
  if Form1.Components[i].GetParentComponent.Name = 'GroupBox1' then
  begin
    GroupBox1.Width :=(TButton(Form1.Components[i]).Width+TButton(Form1.Components[i]).Left);
  end;
end;

napisałem coś takiego - wyszukuje wszystkie buttony na GroupBox'ie i zmienia szerokość groupBoxa, ale nie wiem jak by to uogólnić żeby brało pod uwage wszystkie komponenty jest co prawda Form1.Components[i]).ClassType ale niestety nie można zamienić TButton na to.
Swoją drogą jeśli czyta to ktoś mądrzejszy chciałbym zrobić coś takiego że zapisuje właściwości wszystkich komponentów których rodzicem jest np. Form1 i zamianie Enabled na false na czas odpowiedzi na pakiet po otrzymaniu pakietu przywracał bym Enabled na taką wartość jak miało z przed wysłania pakietu.

0

Dla wszystkich wizualnych komponentów można chyba zrobić tak jak poniżej:

var
  I : integer;
begin
  for I := 0 to Self.ComponentCount - 1 do
  begin
    if Self.Components[I].GetParentComponent.Name = 'GroupBox1' then
      begin
        GroupBox1.Width := (TWinControl(Self.Components[i]).Width + TWinControl(Self.Components[i]).Left);
      end;
   end;
end;

szopenfx: a ze zmianą Enabled to tak jak powyżej można - najpierw dajesz False, a później znowu True itd.

var
  I : integer;
begin
  for I := 0 to Self.ComponentCount - 1 do
  begin
    TWinControl(Self.Components[i]).Enabled := False;
  end;
end;
0

Dzięki olesio o coś takiego mi chodziło wracając jeszcze na chwile do tematu - małe niedopatrzenie w pętli najlepiej zapisywać maksymalną szerokość i wysokość i dopiero na koniec przypisać ją do GroupBox'a bo tak jak jest teraz zmieni rozmiar z ostatniego komponentu.

0
szopenfx napisał(a)
procedure TForm1.Button2Click(Sender: TObject);
var
  i,max:integer;
begin
  for i:=0 to Form1.ComponentCount-1 do
  if Form1.Components[i].GetParentComponent.Name = 'GroupBox1' then
  begin
    GroupBox1.Width :=(TButton(Form1.Components[i]).Width+TButton(Form1.Components[i]).Left);
  end;
end;

Strasznie barbarzyńska metoda.

Skorzystaj z własności Controls groupbox'a, jest to zbiór wszystkich jego kontrolek potomnych.

for i:=0 to GroupBox1.ControlsCount-1 do
  if GroupBox1.Controls[i] is TButton then with GroupBox1.Controls[i] as TButton do
    new_width := Max(new_width, Left + Width);
0

Dzięki serdeczne Panowie! Właśnie takiego obliczania komponent po komponencie sie obawiałem na ale trudno. Dzięki za kody!

1 użytkowników online, w tym zalogowanych: 0, gości: 1