簡體   English   中英

在運行時繪制TPanel和TSplitter會導致組件順序錯誤

[英]Draw TPanel and TSplitter at runtime results in wrong component order

如果我在運行時將多個TPanel和TSplitter組件創建到TScrollBox中,則組件的順序是錯誤的。 如果我調用drawInput()3次,則滾動框將包含3個面板,然后是3個拆分器,而不是1個面板,再是1個拆分器(重復)。

我該如何下達正確的訂單?

這是截圖

function drawInput(owner: TWinControl): TWinControl;
var
  panel: TPanel;
  edit: TEdit;
  splitter: TSplitter;
begin
  panel := TPanel.Create(owner);
  panel.Parent := owner;
  panel.Align := alTop;
  panel.AlignWithMargins := True;
  panel.BorderWidth := 0;
  panel.Color := clRed;
  panel.BorderStyle := bsNone;
  panel.ParentBackground := False;
  panel.Ctl3D := False;

  edit := TEdit.Create(panel);
  edit.Parent := panel;
  edit.Align := alTop;
  edit.AlignWithMargins := True;
  edit.Text := 'foo';
  edit.Margins.Left := 5;
  edit.Margins.top := 5;
  edit.Margins.Bottom := 5;
  edit.Margins.Right := 5;

  splitter := TSplitter.Create(owner);
  splitter.Parent := owner;
  splitter.Align := alTop;
  splitter.Beveled := True;
  splitter.Height := 3;
end;

編輯:

這是我所謂的函​​數:

procedure TForm2.Button1Click(Sender: TObject);
var
  form: TForm;
  sb: TScrollBox;
begin
  form := TForm.Create(Application);
  sb := TScrollBox.Create(form);
  sb.Parent := form;
  sb.Align := alClient;
  sb.Color := clBlack;
  drawInput(sb);
  drawInput(sb);
  drawInput(sb);
  drawInput(sb);

  form.Width := 300;
  form.Height := 700;
  form.ShowModal;
end;

Delphi的對齊邏輯有時可能很難。 但是以下工作。 注意換行splitter.Top := -1;

function drawInput(owner: TWinControl): TWinControl;
    var
      panel: TPanel;
      edit: TEdit;
      splitter: TSplitter;
    begin
      splitter := TSplitter.Create(owner);
      splitter.Parent := owner;
      splitter.Align := alTop;
      splitter.Beveled := True;
      splitter.Height := 3;
      splitter.Top := -1;

      panel := TPanel.Create(owner);
      panel.Parent := owner;
      panel.Align := alTop;
      panel.AlignWithMargins := True;
      panel.BorderWidth := 0;
      panel.Color := clRed;
      panel.BorderStyle := bsNone;
      panel.ParentBackground := False;
      panel.Ctl3D := False;

      edit := TEdit.Create(panel);
      edit.Parent := panel;
      edit.Align := alTop;
      edit.AlignWithMargins := True;
      edit.Text := 'foo';
      edit.Margins.Left := 5;
      edit.Margins.top := 5;
      edit.Margins.Bottom := 5;
      edit.Margins.Right := 5;
    end;

在此處輸入圖片說明

放置面板+分離器,然后設置對齊方式您可以將面板與客戶端對齊,將面板放置在所有其他組件下方

function drawInput(owner: TWinControl): TWinControl;
var
  panel: TPanel;
  edit: TEdit;
  splitter: TSplitter;
begin
  panel := TPanel.Create(owner);
  panel.Parent := owner;
  ///
  panel.Align := alclient;
  ///
  panel.Align := alTop;
  panel.AlignWithMargins := True;
  panel.BorderWidth := 0;
  panel.Color := clRed;
  panel.BorderStyle := bsNone;
  panel.ParentBackground := False;
  panel.Ctl3D := False;    


  splitter := TSplitter.Create(owner);
  splitter.Parent := owner;
  //
  splitter.top := panel.top+panel.height;
  //
  splitter.Align := alTop;
  splitter.Beveled := True;
  splitter.Height := 3;
end;

這是在XE5上適合我的代碼。 我仍然必須解決我的問題,但至少我已經解決了你的問題:)

procedure drawInput(owner: TWinControl; var t: integer);
var
  panel: TPanel;
  edit: TEdit;
  splitter: TSplitter;
begin
  panel := TPanel.Create(owner);
  panel.Parent := owner;
  panel.Align := alTop;
  panel.AlignWithMargins := True;
  panel.BorderWidth := 0;
  panel.Color := clRed;
  panel.BorderStyle := bsNone;
  panel.ParentBackground := False;
  panel.Ctl3D := False;
  panel.Top := t;
  t := panel.Top + panel.Height + 1;

  edit := TEdit.Create(panel);
  edit.Parent := panel;
  edit.Align := alTop;
  edit.AlignWithMargins := True;
  edit.Text := 'foo';
  edit.Margins.Left := 5;
  edit.Margins.top := 5;
  edit.Margins.Bottom := 5;
  edit.Margins.Right := 5;

  splitter := TSplitter.Create(owner);
  splitter.Parent := owner;
  splitter.Align := alTop;
  splitter.Beveled := True;
  splitter.Height := 3;
  splitter.Top := t;

  t := splitter.Top + splitter.Height + 1;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  form: TForm;
  sb: TScrollBox;
  t: integer;
begin
  form := TForm.Create(Application);
  sb := TScrollBox.Create(form);
  sb.Parent := form;
  sb.Align := alClient;
  sb.Color := clBlack;
  t := 0;
  drawInput(sb, t);
  drawInput(sb, t);
  drawInput(sb, t);
  drawInput(sb, t);

  form.Width := 300;
  form.Height := 700;
  form.ShowModal;
end;

在我的一個應用程序中,我有一個函數,該函數創建一個TImage並在其后跟隨一個TSplitter,該TSplitter的父級包含控件為TScrollbox(sbScroller)。 最終用戶在選擇圖像時將調用該函數(與TButton OnClick事件關聯),或者在程序啟動時加載先前加載的一組圖像,每個圖像均由TSplitter分割。

它可以單獨運行(創建一個TImage + TSplitter配對),也可以連續循環運行以創建多個配對。 使它起作用的關鍵因素似乎在於TSplitter.Top屬性的位置,如先前的答案所述:

procedure AddImage(AFilename: string);
var
  Image: TImage;
begin
  Image := TImage.Create(sbScroller);
  with Image do
  begin
    Image.Parent := sbScroller;
    Left := 0;
    Top := 0;
    Width := 150;
    Height := 150;
    Constraints.MinHeight := 128;
    Align := alTop;
    Anchors := [akLeft, akTop, akRight];
    Proportional := True;
    Stretch := True;
    Visible := True;
  end;
  if sbScroller.ControlCount > 0 then
    with TSplitter.Create(sbScroller) do
    begin
      Parent := sbScroller;
      Top := Image.Top;
      Align := alTop;
      Color := clGray;
    end;
end;  

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM