Zmienna wielkość formy tworzonej dynamicznie

0

Cześć !

Lazarus 2.0.6
FPC 3.0.4

Tworzę sobie dynamicznie formę TForm.
Tworzę (również dynamicznie) etykietę TLabel, która w zależności od potrzeb może być wielowierszowa.
W/W etykietę "kładę" na formę.

Chciałbym aby rozmiar formy (Width / Height) był dopasowany do rozmiaru etykiety.
Przykładowo aby Width := Label.Left + label.Width;
Podobnie przy rozmiarze Heght.
Oczywiście trzeba brać po uwagę GetSystemMetrics(SM_CYCAPTION) itp.

Robię ShowModal;

Takie proste przeliczenie nie działa. Gdzie robię błąd ?

0

Jakbyś dał kod, który masz to by było zdecydowanie łatwiej Ci pomóc :P

0

Taki "śmieszny" przykład

procedure TForm_001.SpeedButton1Click(Sender: TObject);
var
F : TForm;
L : TLabel;

begin
  F := TForm.Create(nil);
  F.BorderStyle := bsDialog;
  F.Width := 400;
  F.Height := 100;
  F.Position := poScreenCenter;
  L := TLabel.Create(nil);
  L.Font.Name := 'courier new';
  L.Font.Size := 8;
  L.Font.Style := [fsBold];
  L.Left := 10;
  L.Top := 10;
  L.AutoSize := True;

  L.Caption := '1 xxxxxxxxxxxxxxxxxxxxxxxxx' +
    #10#13 + '2 xxxxxxxxxxxxxxxxxx' +
    #10#13 + '3 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' +
    #10#13 + '4 xx' +
    #10#13 + '5 xxxxxxxxx' +
    #10#13 + '6 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' +
    #10#13 + '7 xxx';

  F.InsertControl(L);

  F.Height := L.Top + L.Height + GetSystemMetrics(SM_CYCAPTION) +
    GetSystemMetrics(SM_CYFRAME) + GetSystemMetrics(SM_CYEDGE) +
    GetSystemMetrics(SM_CYMENU) + 10;

  F.ShowModal;
end;
1

W delphi forma ma właściwość AutoSize - przesuwasz label na pozycję 0; 0, ustawiasz AutoSize na True i tyle

0
abrakadaber napisał(a):

W delphi forma ma właściwość AutoSize - przesuwasz label na pozycję 0; 0, ustawiasz AutoSize na True i tyle

Ponieważ będzie to coś w rodzaju własnego okna do obsługi komunikatów zależy mi aby L.Left := 10 oraz L.Top := 10 (i nie tylko).
Krótko mówiąc chodzi tutaj o estetyczne rozłożenie elementów (także przycisków). Ustawienie formy Autosize :=True nic mi nie daje

0

To sobie ustaw padding na formie taki jak chcesz. Kurcze wypadało by znać właściwości chociaż podstawowych komponentów... Do tego masz FlowPanel, GridPanel, Panel itd, itp

screenshot-20200915144920.png

object Form2: TForm2
  Left = 0
  Top = 0
  AutoSize = True
  BorderStyle = bsDialog
  Caption = 'Form2'
  ClientHeight = 95
  ClientWidth = 208
  Color = clFuchsia
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  Padding.Left = 10
  Padding.Top = 10
  Padding.Right = 10
  Padding.Bottom = 10
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object lbl1: TLabel
    Left = 10
    Top = 10
    Width = 188
    Height = 75
    Alignment = taCenter
    Caption = 'Jaki'#347' tekst na labelu'#13#10'a tu druga linia'#13#10'i jeszcze jedna'
    Color = clRed
    Font.Charset = DEFAULT_CHARSET
    Font.Color = clWindowText
    Font.Height = -21
    Font.Name = 'Tahoma'
    Font.Style = []
    ParentColor = False
    ParentFont = False
    Transparent = False
  end
end
2
jurkowojc napisał(a):

Ponieważ będzie to coś w rodzaju własnego okna do obsługi komunikatów zależy mi aby L.Left := 10 oraz L.Top := 10 (i nie tylko).
Krótko mówiąc chodzi tutaj o estetyczne rozłożenie elementów (także przycisków).

Pewnie dużo czasu zmarnowałeś tymi kombinacjami z dynamicznym tworzeniem okna i kontrolek. Tymczasem Twój problem jest trywialny – skorzystaj z designera do stworzenia tego okna. Nie dość, że będziesz widział jak dokładnie okno wygląda, to w dodatku będziesz mógł poustawiać sobie kotwice (za pomocą edytora kotwic), tak aby zawartość sama się układała, a formularz dostosowywał swój rozmiar do niej.


Na potrzeby narzędzia CTCT stworzyłem sobie własne okno komunikatów (bo kto mi zabroni), a gdy było gotowe, napisałem sobie kilka metod wywoływania takiego okna, przekazując trochę danych (typ ikonki, tytuł, treść i zestaw przycisków). W designerze wygląda tak:

messagebox.png

Niebieskie linie ilustrują kotwice ustawione w edytorze (domyślnie są czerwone, ale se zmieniłem w źródłach designera). Formularz ma określone minimalną i maksymalną szerokość (tak aby treść komunikatu się zawijała), a jego wysokość jest określana automatycznie – ustawione jest AutoSize na True.

Zawartość ma zdefiniowane marginesy, więc zawsze zachowuje dokładnie takie odstępy, jak widać w designerze. Ikonka natomiast ładowana jest z biblioteki systemowej, aby na każdym systemie była taka jak w systemowym okienku komunikatu. Przyciski są zgrupowane w panelach i jeden z nich jest pokazywany po wywołaniu okna.

To w sumie tyle, przykładowe komunikaty niżej:

question.png

warning.png

error.png

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