2012-06-29 7 views
1

필자는 Delphi 시각적 컨트롤의 모서리를 둥글게 만드는 루틴을 만들었습니다.원래 클래스를 수정하지 않고 코드를 클래스에 삽입하는 방법은 무엇입니까?

지금 내가 뭘 원하는 TMemo, TEditTPanel 같은 모든 시각적 객체가 양식 작성에 그들 모두를위한 함수를 호출하지 않고 둥글게되어 제공되도록한다.

은 어떻게 (양식 장치) 내 코드에서 이러한 클래스 각각에 대한 작성 방법의 확장, 그래서 그들이 클래스와 다른 단위의 정상적인 동작의 이름을 유지해야합니까?

procedure RoundCornersOf(Control: TWinControl) ; 
var 
    R: TRect; 
    Rgn: HRGN; 
begin 
    with Control do 
    begin 
    R := ClientRect; 
    rgn := CreateRoundRectRgn(R.Left, R.Top, R.Right, R.Bottom, 20, 20) ; 
    Perform(EM_GETRECT, 0, lParam(@r)) ; 
    InflateRect(r, - 4, - 4) ; 
    Perform(EM_SETRECTNP, 0, lParam(@r)) ; 
    SetWindowRgn(Handle, rgn, True) ; 
    Invalidate; 
    end; 
end; 
+0

은 우리에게 당신이 라운드를 만드는 방법에 대한 자세한 내용을 알려주십시오. 일부 gdi 메시지 처리기 메서드를 연결해야합니다. –

+0

완료. 프로 시저 RoundCornerOf (제어) ... – PSyLoCKe

+0

내 질문에 무엇이 문제가 있습니까? 그것은 합법적이며 역할에 있습니다. – PSyLoCKe

답변

2

은 구조 또는 해킹, 런타임에 클래스를 수정 예를 Replacing a component class in delphiChanging component class at run-time on demand에 대한보고가 존재한다. 그러나 내가 이해하는대로, 발생하는 모든 컨트롤 유형에 대해 별도의 유형을 선언해야합니다.

대안은 ControlsControlCount 속성을 사용하여 폼의 생성 후 모든 컨트롤을 통해 횡단하는 것입니다

public 
    procedure AfterConstruction; override; 
    end; 

procedure ModifyControls(Window: TWinControl); 
var 
    I: Integer; 
begin 
    for I := 0 to Window.ControlCount - 1 do 
    if Window.Controls[I] is TWinControl then 
    begin 
     ModifyControls(TWinControl(Window.Controls[I])); 
     RoundCorners(TWinControl(Window.Controls[I])); 
    end; 
end; 

procedure TForm1.AfterConstruction; 
begin 
    inherited AfterConstruction; 
    ModifyControls(Self); 
end; 

그러나 당신이 생각하는 것 다음 추가를 어떻게 제어 레크리에이션, 조심. 예를 들어, 편집의 BorderStyle 속성을 변경하면 편집을 다시 작성하여 수정 내용을 취소 할 수 있습니다. 이 경우 수정을 다시 실행하여 모두 추적 할 수 있도록하십시오.

+0

당신의 관찰은 RoundCorner()를 사용하면 'I'에 의해 사용되는 각 컨트롤의 인덱스가 바뀔 수 있다는 것을 의미합니까? – PSyLoCKe

+0

응? 아니요, 색인 'I'은 변경되지 않습니다. 루프 제어 변수 일뿐입니다. – NGLN

+1

이 대답은 모든 컨트롤에이 방법을 적용하는 일을하지만, 그것은'클래스 helper'와 같은 클래스 자체를 수정하는 주요 질문에 대답하지 않습니다. 나는 길을 찾기를 계속 할 것이고, 내가 찾지 못하면 너의 길을 사용할 것이다. – PSyLoCKe