kkuzil.own@gmail.com

Posted
Filed under Development/Delphi

기존의 패치들을 보면 VMT를 얻어서 테이블을 수정하거나 하는 등의 복잡한 방법이지만, 이 새로운 트릭에서는 이러한 구현없이 수정없이 그냥 간단한 구현 유닛을 uses 절 맨 마지막에 추가하는 것만으로 쉽게 해결을 할 수 있습니다.

실질적인 패치 코딩에서도 아주 간단하게 구현을 할 수 있습니다. 따로 패치를 위한 추가적인 코드도 필요없게 됩니다.

unit HVProgressBarVistaFix;

interface

uses Messages, ComCtrls;

type
TProgressBar = class(ComCtrls.TProgressBar) // 이곳의 선언이 이 코드의 핵심. 새로 선언된 아래의 핸들러가 적용됩니다.
private
procedure WMEraseBkgnd(var Message: TWmEraseBkgnd);
message WM_ERASEBKGND;
end;

implementation

procedure TProgressBar.WMEraseBkgnd(var Message: TWmEraseBkgnd);
begin
DefaultHandler(Message);
end;

end.

사용 방법은

uses
Windows, Messages, SysUtils, Variants, Classes,
Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls, HVProgressBarVistaFix;


일반적으로 우리들은 이 문제를 해결하기 위해 TProgressBar를 계승해서 이러쿵저러쿵 해야 한다고 생각할 것입니다. 하지만 유닛 이름을 머리에 붙인 클래스 이름(위의 경우에는 ComCtrls.TProgressBar)을 사용하면 기존의 해당 클래스(위의 경우 TProgressBar)를 치환하는 효과가 일어납니다.


참고하시길.

내용 출처 : http://hallvards.blogspot.com/2007/04/hack16-published-field-rtti-replacement.html

2009/03/03 18:13 2009/03/03 18:13