2014-07-01 9 views
5

W formularzu mam dwie duże kontrolki i między nimi TSplitter. Kontrola na górze jest wyrównana do góry, a kontrola na dole jest dopasowana do klienta. Tak więc, gdy zmieniam rozmiar formularza, kontrola na górze pozostaje taka sama, podczas gdy ta na dole jest zmienna. Następnie rozdzielacz między nimi kontroluje wysokość kontrolki na górze.Jak zachować kontrolę widoczną w formularzu podczas korzystania z rozdzielacza?

Jednak gdy rozmiar formularza zostanie zmieniony na mniejszą wysokość niż górny element sterujący, dolna kontrolka zostanie ukryta. Próbowałem za pomocą ograniczenia do dostrojenia, jak to reaguje, ale bez powodzenia ...

  • kiedy rozdzielacz jest zmieniany, nie powinien pozwolić użytkownikowi na przeciągnij go w dół dalej niż spodzie kontrolki min wysokość
  • gdy forma jest zmieniany mniejsza niż dolna kontrola pozwala, powinien on automatycznie dopasowuje wysokość górnej kontrolki, aby umożliwić dolna kontrola dopasować
  • kiedy ustawić dołu kontrolki MinHeight ograniczenia do, na przykład, 100, gdy zmieniając rozmiar splittera, sprawia, że ​​forma rzeczywiście rośnie, aby dopasować się do dolnej kontrolki, zamiast zatrzymywać użytkownika, by dalej skalować.
  • Po ustawieniu właściwości splittera na MinSize na, na przykład, 100, podczas zmiany rozmiaru splittera, otrzymuję bardzo nieprawidłowe wyniki (górna kontrolka znika) i nadal ukrywa dolną kontrolę.

Jak mogę upewnić się, że dolna kontrola jest zawsze widoczna, gdy rozdzielacz lub forma są rozmiaru bez zmieniania rozmiaru formularza?

kod DFM:

object Form1: TForm1 
    Left = 310 
    Top = 121 
    Caption = 'Form1' 
    ClientHeight = 374 
    ClientWidth = 434 
    Color = clBtnFace 
    Font.Charset = DEFAULT_CHARSET 
    Font.Color = clWindowText 
    Font.Height = -11 
    Font.Name = 'Tahoma' 
    Font.Style = [] 
    OldCreateOrder = False 
    PixelsPerInch = 96 
    TextHeight = 13 
    object Splitter1: TSplitter 
    Left = 0 
    Top = 129 
    Width = 434 
    Height = 7 
    Cursor = crVSplit 
    Align = alTop 
    Beveled = True 
    end 
    object Panel1: TPanel 
    Left = 0 
    Top = 0 
    Width = 434 
    Height = 129 
    Align = alTop 
    Caption = 'Panel1' 
    TabOrder = 0 
    ExplicitLeft = 48 
    ExplicitTop = 16 
    ExplicitWidth = 313 
    end 
    object Panel2: TPanel 
    Left = 0 
    Top = 136 
    Width = 434 
    Height = 238 
    Align = alClient 
    Caption = 'Panel2' 
    TabOrder = 1 
    ExplicitLeft = 16 
    ExplicitTop = 168 
    ExplicitWidth = 369 
    ExplicitHeight = 145 
    end 
end 

Odpowiedz

9

gdy rozdzielacz jest zmieniony, nie powinny umożliwiać użytkownikowi na przesunięcie w dół dalej niż Minimalna wysokość Dno kontrolki

Dodaj program obsługi dzielnika OnCanResize, aby zapobiec przeciągnięciu go w dół poza zdefiniowaną wysokość:

procedure TForm1.Splitter1CanResize(Sender: TObject; var NewSize: Integer; 
    var Accept: Boolean); 
begin 
    Accept := NewSize <= 
     ClientHeight - (100 + Splitter1.Height); 
end; 

(100 będąc predefiniowane wysokość, wymień je ze stałą/nieruchomość ...)


Gdy forma jest zmieniany mniejsza niż dolna kontrola pozwala, to powinno automatycznie zmienić wysokość górnej kontrolki, aby umożliwić dopasowanie dolnej kontrolki do

Po pierwsze, lepiej mieć przymus na formularzu, aby wszystkie elementy sterujące miały zawsze dodatnią wysokość.W przeciwnym razie najprawdopodobniej walczyć z wyścigu wyrównującą: Panel1 i splitter1 są wyrównane na górze:

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    Constraints.MinHeight := Height - ClientHeight + 100 + Splitter1.Height + 1; 
end; 

Po drugie, można sprawdzić, czy przyczyną zmiany rozmiaru panelu forma dolna być zmieniany mniejsze niż powinny być, i podjąć naprawcze działanie:

procedure TForm1.FormResize(Sender: TObject); 
begin 
    if Panel2.Height < 100 then 
    Panel1.Height := ClientHeight - (100 + Splitter1.Height); 
end; 


kiedy ustawić MinHeight ograniczenie spodzie kontrolki, na przykład, 100, podczas zmiany rozmiaru rozdzielacz, to MA kes forma rzeczywiście rośnie, aby dopasować się do dolnej kontroli, zamiast zatrzymywać użytkownika od dalszej zmiany rozmiaru.

Nie używaj ograniczeń dolnego panelu.


Kiedy ustawić właściwość minSize rozgałęźnika do, na przykład, 100, podczas zmiany rozmiaru splitter, mam bardzo nieprawidłowe wyniki (top kontrolne znikają) i nadal ukrywa dolną kontroli.

Nie należy używać rozdzielacza MinSize.

+0

Działa świetnie :-) Z dodatkiem podwojenia ograniczeń wysokości formularza, więc górny kontrolek również pokazuje. –

Powiązane problemy