2017-05-11 11 views
3

얼마 전에 나는 Align 또는 Anchors 설정 (예 : here)으로 컨트롤의 동작을 고민했습니다. 이번에는 버튼의 최상위 위치가 원래의 10에서 -50 정도로 이동 한 것을 알기 전까지 한 유닛으로 작업 했으므로 원인을 찾으려고 노력했습니다.베벨을 사용하는 패널에서 컨트롤의 위치

BevelKind = bkFlat으로 패널을 사용하고 Anchors = [akRight, akBottom]으로 컨트롤을 사용하면 모든 컨트롤의 위치가 설정에 따라 줄어 듭니다. 다음 예제에서와 같이 LeftAnchors = [akRight]Top과 함께 Anchors = [akBottom]으로 이동합니다. 항상 패널이 설정 한 경사의 너비 (이 경우 양방향으로 -4). 프로그램을 실행하거나 다음 장치를 다시 열면 위치는 (150, 10)에서 (146, 6)으로 이동하고 장치를 열고 저장 한 후에 무기한으로 계속됩니다.

그래서 단위를 열고 dfm 파일에 저장 한 후 모든 구성 요소의 위치 재 계산을 담당해야하는 이유를 알고 싶습니다.

enter image description here

enter image description here

enter image description here

PMain.pas

unit PMain; 

interface 

uses 
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, 
    Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls, Vcl.Grids; 

type 
    TUMain = class(TForm) 
    pnl1: TPanel; 
    btn1: TButton; 
    end; 

var 
    UMain: TUMain; 

implementation 

{$R *.dfm} 

end. 

012,351,641 PMain.dfm
object UMain: TUMain 
    Left = 0 
    Top = 0 
    Caption = 'UMain' 
    ClientHeight = 50 
    ClientWidth = 250 
    Color = clBtnFace 
    Font.Charset = DEFAULT_CHARSET 
    Font.Color = clWindowText 
    Font.Height = -11 
    Font.Name = 'Tahoma' 
    Font.Style = [] 
    OldCreateOrder = False 
    PixelsPerInch = 96 
    TextHeight = 13 
    object pnl1: TPanel 
    Left = 0 
    Top = 0 
    Width = 250 
    Height = 50 
    Align = alClient 
    BevelKind = bkFlat 
    Caption = 'pnl1' 
    TabOrder = 0 
    DesignSize = (
     246 
     46) 
    object btn1: TButton 
     Left = 150 
     Top = 10 
     Width = 75 
     Height = 25 
     Anchors = [akRight, akBottom] 
     Caption = 'btn1' 
     TabOrder = 0 
    end 
    end 
end 
+1

하나의 조언 : '정렬'을 사용하거나 '앵커'를 사용하십시오. 그러나 동시에 시도하지 마십시오. 'Align'은 무언가를 완전히 한쪽으로 치우 치고 싶거나 완전히 무언가를 다루고 싶다면 좋다. 앵커는 절대 가장자리에 있지 않더라도 상위 경계선을 따라 (하나 이상의 방향으로) 컨트롤의 테두리를 유지하거나 늘리는 것이 좋습니다. –

+0

@ Rudy 나는 그것이 OP가하고있는 것이라고 생각하지 않는다. DFM에서,'TPanel'은'alClient'에 정렬되어있는 반면, 그 패널의'TButton'에는 앵커'[akRight, akBottom]'이 있습니다. 실제로, 나는 항상 이것을 수행하고 (정렬 된 패널에 앵커 된 버튼), OP가 묘사하는 것처럼 어떤 문제도 경험하지 못했습니다. –

+0

@Jerry 위의 예제를'Bevels'와'BeeKind = bkFlat'로 시도해보아야합니다, 이것이 문제라고 생각합니다. – Triber

답변

2

이것은 델파이의 버그로 보입니다. Delphi 10 Seattle에서 위 코드를 사용하여 동일한 동작을 재현했습니다.

실제로 할 수있는 유일한 일은 디자인 타임에 이러한 특정 경사를 설정하지 않는 것입니다. 대신, 런타임에 ...

pnl1.BevelKind := bkFlat; 

기회가 있으며, 컨트롤을 파고하지 않고, 속성은 DFM에서 스트리밍되는 순서가 바로 오른쪽 (또는 잘못된) 순서 있다는 것을 설정 예를 들어, 패널이 패널 크기보다 작아지기 전에 단추가 배치되는 지점까지 가야합니다. 나는 VCL을 완전히 재구성하지 않고도 할 수있는 수정을 상상할 수 없다.

아무도이 문제를 아직보고하지 않았다면 QC 보고서를 Embarcadero에 제출해야합니다.

+0

시도해 주셔서 감사 드리며, 보고서를 제출하겠습니다. 내 경험상, 나는 단지 믿지 않는다. 그들은 가까운 장래에 그것을 고칠 것이다. 한 가지 해결책은 같은 효과를 내기 위해서'pnl1'을 4 개의'TBevel'을 중심으로 다른 TPanel 안에 넣는 것입니다. 이상적이지는 않지만 아무것도없는 것보다 낫습니다. – Triber