2017-05-19 34 views
2

我正在使用一組現有的TControl來設計一個新的VCL組件。 控件放置在TPanels上,有些控件位於左側位置,一個位於右側位置,最後一個位於客戶區。每個面板都有自定義的組件,因爲它是父級組件。如何在TCustomControl組件上正確創建TSplitter?

我需要在面板之間放置拆分器,以便用戶能夠調整內部組件的大小。

問題是,我簡直無法弄清楚在運行時創建時應用於定位分離器的邏輯。

我訪問了很多論壇,每個論壇都指向不同的解決方案,但都沒有工作。

試過:

1 - 創建分離器時,使用屬性「LEF」 t和部件的「寬度」在那裏應預留定位,作爲其「左」屬性。

2 - 使用left屬性來指定它應該在的位置。

和其他我不記得的東西。

我錯過了什麼?

在下面的代碼中,拆分器被創建在它應該在的位置。 就在相應的面板後,他們的左側屬性對應於我嘗試過的最後一件事(它的位置)。

constructor TDBIDBGridFilterBar.Create(AOwner: TComponent); 
begin 
    inherited; 
    Self.Width := 490; 
    Self.Height := 23; 
    Self.Constraints.MinWidth := 285; 

    if fComboColunasWidth = 0 then 
    fComboColunasWidth := 118; 

    fBackGroundPanel := TPanel.Create(Self); 
    fBackGroundPanel.Parent := Self; 
    fBackGroundPanel.ShowCaption := false; 
    fBackGroundPanel.BevelOuter := bvNone; 
    fBackGroundPanel.Align := alClient; 

    fButtonsPanel := TPanel.Create(Self); 
    fButtonsPanel.Parent := fBackGroundPanel; 
    fButtonsPanel.ShowCaption := false; 
    fButtonsPanel.BevelOuter := bvNone; 
    fButtonsPanel.Width := 73; 
    fButtonsPanel.Align := alLeft; 

    fBtnMarcaTodos := TButton.Create(Self); 
    fBtnMarcaTodos.Parent := fButtonsPanel; 
    fBtnMarcaTodos.Width := 23; 
    fBtnMarcaTodos.Height := 23; 
    fBtnMarcaTodos.Left := 0; 
    fBtnMarcaTodos.Hint := 'Marcar todos'; 
    fBtnMarcaTodos.ShowHint := true; 

    fBtnDesmarcaTodos := TButton.Create(Self); 
    fBtnDesmarcaTodos.Parent := fButtonsPanel; 
    fBtnDesmarcaTodos.Width := 23; 
    fBtnDesmarcaTodos.Height := 23; 
    fBtnDesmarcaTodos.Left := 23; 
    fBtnDesmarcaTodos.Hint := 'Desarcar todos'; 
    fBtnDesmarcaTodos.ShowHint := true; 

    fBtnInveteSelecao := TButton.Create(Self); 
    fBtnInveteSelecao.Parent := fButtonsPanel; 
    fBtnInveteSelecao.Width := 23; 
    fBtnInveteSelecao.Height := 23; 
    fBtnInveteSelecao.Left := 46; 
    fBtnInveteSelecao.Hint := 'Inverter seleção'; 
    fBtnInveteSelecao.ShowHint := true; 

    fLabelPanel := TPanel.Create(Self); 
    fLabelPanel.Parent := fBackGroundPanel; 
    fLabelPanel.Width := 33; 
    fLabelPanel.Align := alLeft; 
    fLabelPanel.ShowCaption := false; 
    fLabelPanel.BevelOuter := bvNone; 

    fLabel := TLabel.Create(Self); 
    fLabel.Parent := fLabelPanel; 
    fLabel.Top := 4; 
    fLabel.Left := 4; 
    fLabel.Caption := 'Filtro:'; 
    fLabel.Width := 28; 

    fComboColunasPan := TPanel.Create(Self); 
    fComboColunasPan.Parent := fBackGroundPanel; 
    fComboColunasPan.ShowCaption := false; 
    fComboColunasPan.BevelOuter := bvNone; 
    fComboColunasPan.width := fComboColunasWidth; 
    fComboColunasPan.Align := alLeft; 

    fComboColunas := TDBIComboBox.Create(Self); 
    fComboColunas.Parent := fComboColunasPan; 
    fComboColunas.Text := ''; 
    fComboColunas.OnEnter := PopulaComboColunas; 
    fComboColunas.OnChange := ComboChange; 
    fComboColunas.Style := csOwnerDrawFixed; 
    fComboColunas.Align := alClient; 
    fComboColunas.Hint := 'Colunas'; 
    fComboColunas.ShowHint := true; 

    fSplitterColunas := TSplitter.Create(Self); 
    fSplitterColunas.Parent := fBackGroundPanel; 
    fSplitterColunas.Align := alLeft; 
    fSplitterColunas.Left := 1; 

    fComboOperadorPan := TPanel.Create(Self); 
    fComboOperadorPan.Parent := fBackGroundPanel; 
    fComboOperadorPan.ShowCaption := false; 
    fComboOperadorPan.BevelOuter := bvNone; 
    fComboOperadorPan.width := fComboColunasWidth; 
    fComboOperadorPan.Align := alLeft; 

    fComboOperador := TDBIComboBox.Create(Self); 
    fComboOperador.Parent := fComboOperadorPan; 
// fComboOperador.Items.Add(cItensComboFiltro); 
    fComboOperador.Style := csOwnerDrawFixed; 
    fComboOperador.Align := alClient; 
    fComboOperador.Hint := 'Comparação'; 
    fComboOperador.ShowHint := true; 
    fComboOperador.Text := ' = '; 

    fSplitterOperador := TSplitter.Create(Self); 
    fSplitterOperador.Parent := fBackGroundPanel; 
    fSplitterOperador.Align := alLeft; 
    fSplitterOperador.Left := 2; 

    fBtnAdcFiltroPan := TPanel.Create(Self); 
    fBtnAdcFiltroPan.Parent := fBackGroundPanel; 
    fBtnAdcFiltroPan.ShowCaption := false; 
    fBtnAdcFiltroPan.BevelOuter := bvNone; 
    fBtnAdcFiltroPan.width := 23; 
    fBtnAdcFiltroPan.Align := alRight; 

    fBtnAdcFiltro := TButton.Create(Self); 
    fBtnAdcFiltro.Parent := fBtnAdcFiltroPan; 
    fBtnAdcFiltro.Height := 23; 
    fBtnAdcFiltro.Width := 23; 
    fBtnAdcFiltro.Caption := '+'; 
    fBtnAdcFiltro.Hint := 'Adicionar filtro...'; 
    fBtnAdcFiltro.ShowHint := true; 
    fBtnAdcFiltro.OnClick := btnNewFilterClick; 

    fClientPanel := TPanel.Create(Self); 
    fClientPanel.Parent := fBackGroundPanel; 
    fClientPanel.ShowCaption := false; 
    fClientPanel.BevelOuter := bvNone; 
    fClientPanel.Align := AlClient; 

    fMaskEdit := TDBIMaskEdit.Create(Self); 
    fMaskEdit.Parent := fClientPanel; 
    fMaskEdit.Font.Size := 9; 
    fMaskEdit.Align := alTop; 
end; 
+0

應該是'LeftSplitter.Left:= ControlOnLeft.Width + 1;'大概(不測試你的代碼)。簡單地將其設置爲確切的寬度將不會成功。然而,你在這樣的設計中受到傷害的世界。自定義控件不應該有這種方式的子控件。在你的情況下,編寫一個嵌入式'TFrame'甚至'TForm'會更合適。對於全部*都處於自定義控制中是毫無意義的。 –

+0

感謝您的快速回復。我會嘗試一下,但邏輯上不應該是LeftSplitter.Left:=(ControlOnLeft.left + ControlOnLeft.Width + 1)這樣,我應該得到正確的位置+1。 –

+0

It沒有工作,該死的分配器一直在客戶端對齊的面板左側。 –

回答

4

當您添加的面板中從左到右的順序背景面板,它足以設置Left將設置Alignment屬性之前添加的面板的屬性設置爲足夠大的值,因此它超過已放置在背景面板上的組件的Left屬性。您設置的值甚至可以大於背景面板的寬度。

當添加板或其它部件到左順序(Alignment = alRight;)右側可以保留Left屬性爲0

以上是放置背景面板上的任何組件真,也分配器。當使用分離器時,您可能還希望將相鄰組件Constraints.MinWidth屬性設置爲例如10以防止元件寬度意外減小到零,因此變得不可見。一旦發生這種情況,無法通過分離器再次看到它。

例如,這樣的代碼:

procedure TForm1.Panel1Click(Sender: TObject); 
var 
    i: integer; 
begin 
    i := 1; 
    repeat 
    with TPanel.Create(self) do 
    begin 
     Parent := Panel1; 
     Left := 510; 
     Align := alLeft; 
     Width := 40; 
     Constraints.MinWidth := 10; 
     Caption := 'L'+IntToStr(i); 
    end; 
    if (i = 3) or (i = 5) then 
    with TSplitter.Create(self) do 
    begin 
     Parent := Panel1; 
     Left := 510; 
     Width := 10; 
     Align := alLeft; 
    end; 
    inc(i); 
    until i > 5; 
    with TPanel.Create(self) do 
    begin 
    Parent := Panel1; 
    Width := 40; 
    Align := alRight; 
    Caption := 'R1'; 
    end; 
    with TPanel.Create(self) do 
    begin 
    Parent := Panel1; 
    Width := 40; 
    Align := alRight; 
    Caption := 'R2'; 
    end; 
    with TPanel.Create(self) do 
    begin 
    Parent := Panel1; 
    Left := 510; 
    Align := alClient; 
    Caption := 'C'; 
    end; 
end; 

產生這樣的設計:

enter image description here

L1 .. L5是alLeft對準,C被alClient對準並且R1 .. R2是alRight對齊。

0

我設法弄清楚了。 由於之前創建的所有組件都是左對齊的,因此它們的左側屬性設置爲0,無論它們位於何處。

所以,爲了解決這個問題,我不得不正確填寫前面板的左側屬性。

fThisPanel.left:= fPreviousPanel.Left + fPreviousPanel.width + 1,依此類推......

+0

沒有必要計算在彼此之後要左對齊的面板的左側屬性。既然你是按照從左到右的順序創建它們,只需在設置對齊之前將左邊的屬性設置爲一個足夠大的數字(比如480,如果父對象是'fBackGroundPanel')。 –

相關問題