2010-06-21 3 views
1

델파이 (2006)가 양자가되면 : 나는 당신이 그것을 관찰하는 방법에 따라 TToolBar와 TPanel 인 것처럼 보이는 "무언가"를 가지고 있습니다. 무슨 일이 일어나고 있는지 알고 싶습니다. 여기TPanel을 TToolBar에 추가하면 TPanel 또는 TToolButton이 생깁니 까?

그것을 만들고 어떤 일이 발생하는 방법은 다음 DFM

  • 에서

    1. TToolBar를라는 줄을 추가;

    2. 그 TToolBar에 TPanel을 넣습니다. 코드에서 런타임에
  • : 패널 버튼의 목록에 나타납니다

    • 는 bar.Buttons는 []의 인덱스 내가
    • bar.Buttons [I]에서에서 가정 해 봅시다 뷰의 컴파일러 포인트하는 TToolButton이다
    • bar.Buttons [I] .ClassName과 = 'TPanel과'
    • (bar.Buttons [I] TToolButton이다)에 해당 =하지만 즉 "로 호출을 최적화 컴파일러의 '밖으로;
    • 사실 IsBarButton (bar.Buttons [i])은 IsBarButton 함수 (아래 정의 됨)에 대해 false입니다.
      • 그것이 속성 '자막'을 갖는다 :
      • bar.Buttons [I] .NAME 내가 디버깅 값 bar.Buttons [I]을의 점검 DFM
      • 에 TPanel과 준 이름이며 실제 TToolButton에는
      • 이 이상하게 없으며 TToolButton.Indeterminate (= true)와 같이 모든 속성이 있습니다.

    IsToolButton :

    그래서
    function IsToolButton(X : TObject) : boolean; 
    begin 
        Result := X is TToolButton; 
    end; 
    

    bar.Buttons [I] 모두이며 TToolButton ... 무슨 일이야 아닌가요?

    (아래쪽 이야기는 내 TPanel을 정품 TToolButton과 구별하고 싶습니다.이 방법은 다소 hackish 한 방법으로 할 수 있습니다.이 질문에 대한 나의 궁극적 인 목표는 무엇이 실제로 일어나고 있는지를 이해하는 것입니다. 여기를 클릭하십시오.)

    질문 : 무슨 일이 일어나고 있습니까? 하위 질문 : TToolBar에 TPanel을 추가하는 것이 합법적입니까?

    답변

    2

    OS가 도구 모음에 추가 할 수있는 유일한 도구 버튼이 있습니다. 다른 것을 추가하려면 기술적으로 버튼을 만든 다음 다른 버튼을 위에 올려 놓아야합니다. 추가 된 단추는 문자 그대로 자리 표시 자입니다. 거기에 공간을 차지하기 위해 추가 한 다음 물건이 제대로 배치됩니다.

    추가하는 비 툴 버튼 컨트롤이 투명 할 때 가끔씩 볼 수 있습니다. 그런 다음 도구 모음의 구분 기호를 볼 수 있으므로 제어 중간에 수직선이있는 것처럼 보입니다.

    도구 모음이 아닌 컨트롤을 도구 모음에 추가 할 때 Buttons 속성은 실제로 컨트롤 유형과 관련됩니다. ComCtrls.pas을 통해 알 수 있듯이 TToolBar 자체는 항상 단추를 TControl으로 캐스팅 한 다음 실제로 TToolButton에서 오는지 여부를 확인합니다. 도구 모음에 비 버튼을 추가하는 것은 완전히 합법적입니다. 이것이 바로 Form Designer가 처음부터 허용하는 이유입니다.

    양식 디자이너를 사용하여 도구 모음을 만드는 것이 좋습니다. 그렇게하면 IDE가 양식의 식별자를 유지하므로 패널에 대한 직접적인 참조가 항상있을 것입니다. 툴바에서 사냥을 할 필요가 없습니다. 수동으로 도구 모음을 만들더라도 패널을 참조 할 추가 필드를 만드는 것이 좋습니다. 도구 막대 내에서 패널을 움직여도 여전히 전체 개체가 동일하므로 참조가 매달 리지 않아도됩니다.

    0

    당신이 어딘가에 버튼의 부부와 도구 모음에 패널 및 메모를 넣을 때, 폼의에서 onCreate에서이 코드를 실행

    procedure TForm1.FormCreate(Sender: TObject); 
        function _IsToolButton(const aObject: TObject): Boolean; 
        begin 
        Result := aObject is TToolButton; 
        end; 
    
        function _IsPanel(const aObject: TObject): Boolean; 
        begin 
        Result := aObject is TPanel; 
        end; 
    var 
        i: Integer; 
    begin 
        for i := 0 to bar.ButtonCount - 1 do begin 
        Memo.Lines.Add(Format('bar.Buttons[%d].Name: %s', [i, bar.Buttons[i].Name])); 
        Memo.Lines.Add(Format('bar.Buttons[%d].ClassName: %s', [i, bar.Buttons[i].ClassName])); 
        Memo.Lines.Add(Format('bar.Buttons[%d] is TToolButton: %s', [i, BoolToStr(_IsToolButton(bar.Buttons[i]), True)])); 
        Memo.Lines.Add(Format('bar.Buttons[%d] is TPanel: %s', [i, BoolToStr(_IsPanel(bar.Buttons[i]), True)])); 
    // Memo.Lines.Add(Format('bar.Buttons[%d] has Caption property: %s', [i, 'dunno yet'])); 
        Memo.Lines.Add(''); 
        end; 
    end; 
    

    당신이 패널이라고 볼을 하지 TooButton과 가장 명확하게 TPanel.

    패널의 ToolButton 속성을 표시하는 디버거는 각 bar.Buttons [i]를 TToolButton으로 캐스팅하는 디버거 일뿐입니다.디버그 속성의 "데이터"탭에서 마우스 오른쪽 버튼을 클릭하면 유형을 입력 할 수 있습니다. TPanel에 캐스팅하면 정확한 정보를 얻을 수 있습니다.

    +0

    감사합니다. 예를 들어 '캡션'속성이 TPanel에 대해 표시되었지만 다음 실제 TToolButton에는 표시되지 않는 등의 이상한 일들이있었습니다. 여기서 'OnStartDrag'속성 (중복 된)으로 대체되었습니다. Vegar가 썼을 때,이 TPanel은 저에게 약간의 문제를 가져올 것입니다 ... IDE가 맹목적으로 (겉으로보기) IDE를 TToolButton에 행복하게 던져 놓은 사실은 이미 저에게 약간의 떨림을줍니다. – user192472

    +0

    다른 사람들과 마찬가지로 (그리고 나는 무시했다) ... –

    0

    '합법적입니까?' - 글쎄, 당신은 도구 모음을 만든 사람이 사용하지 못하도록 도구 모음을 사용하고 있습니다. 그것은 당신의 얼굴에 날려 버릴까요? 누가 알아. 나는 당신이 도구 모음에 대한 소스 코드를 살펴보고 그것이 안전한지 아닌지를 확인할 수 있다고 생각하지만 가능한 타사 도구 또는 구성 요소는 도구 모음에서 단추를 찾으려고합니까?

    내 문제를 해결할 다른 방법을 찾을 수 있는지 알 것입니다. 영리한 해킹은 어쨌든 영리하지 않은 경향이 있으며, 코드의 wtf-rate을 확실하게 밝힐 것입니다.

    툴바를 사용해야합니까? 대신 버튼과 패널이있는 flowpanel은 어떻습니까? 또는 툴바와 패널이있는 패널입니까?

    +0

    나는이 코드를 계승했으며이 TPanel의 외관은 정말로 나를 도와 주었다. 내 TPanel은 도구 모음의 단추 사이에 구분 기호 역할을합니다 (부모 클라이언트 너비에 맞게 단추를 왼쪽에, 단추를 오른쪽에 맞 춥니 다). 나는 패널로 구분 된 2 개의 툴바가 트릭을 할 수 있다고 생각한다. 또는 아마도 flowpanel (그런 일에 대해 들어 본 적이 없으며, 보일 것입니다). 감사. – user192472

    +0

    형식 시스템을 파괴하는 영리한 핵은 어쨌든 IMO가 아닙니다. 이상한 점은 IDE가 TToolBar에 TPanel을 추가 할 수 있다는 것입니다. 당신은 그들이 출처에서 그런 것들을 막을 것이라고 생각할 것입니다. – user192472

    +0

    FlowPanel은 Delphi 2007에서 gridPanel과 함께 제공되었습니다. 저는 FlowPanel이 좋으며 GridPanel의 아이디어는 훌륭하게 보입니다. 그러나 GridPanel은 큰 시간을 허비하며 작업하기가 불가능합니다. – Vegar

    관련 문제