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!
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.
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;
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.
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);
Dzięki serdeczne Panowie! Właśnie takiego obliczania komponent po komponencie sie obawiałem na ale trudno. Dzięki za kody!