2012-05-08 8 views
4

로깅 및보고 이유로 인해 예외에 속한 클래스 이름 및 메시지가있는 개체를 만듭니다. 나는 이것을 수행하여 Exception 객체의 수명을 관리 할 필요가 없다. 내가하고 싶은 것은 RTTI 식별의 장점을 되찾아 델파이 6에서 "is"연산자를 사용하여 객체가 주어진 클래스에서 파생되었는지를 알 수 있도록 해줍니다.문자열 형식의 클래스 이름을 사용하여 Delphi 6 클래스 객체가 파생 클래스인지 확인하십시오.

문자열에 포함 된 클래스가 다른 클래스에서 파생되었는지 여부를 알기 위해 클래스 이름을 문자열 형식으로 저장 하시겠습니까?

개체의 클래스가 strClassName에 저장되어 있고 해당 클래스가 "derivedClass"라고 가정합니다. 또한 derivedClass는 baseClass에서 파생됩니다. strClassName에있는 문자열 형식의 클래스가 baseClass에서 파생되었는지 여부를 알 수있는 함수를 작성할 수 있습니까? 예 :

// Hypothetical function that returns TRUE if the class in strClassName is 
// derived from the class passed in theBaseClass 
function isDerivedClass(strClassName: string; theBaseClass: TAnyClass): boolean; 

해당 방법의 본문은 어떻게 생깁니 까? 당신은 예외가 이름이 'strClassName'에 의해 클래스를 찾을 수없는 경우, GetClass 대신 FindClass의 사용 제기하지 않으려면

+1

두 가지를 난 몰라 첫 번째 단락을 이해하십시오. 첫째, 왜 로깅을하기 위해 예외를 사용하고 있습니까? 예외를 기록하려는 욕망을 얻었지만 예외가 기록을 쉽게 만드는 것이라고 생각하지는 않습니다. 둘째, RTTI를 처음부터 어떻게 잃어 버렸습니까? 복구 할 필요가 있습니까? –

+0

@RobKennedy - 예외를 사용하여 로깅을 수행하지 않고 예외를 기록합니다. 구성 요소의 오목한 부분에서 예외가 발생하면 감사 및보고를 위해 시스템의 다른 부분으로 전달되는 예외의 관련 정보를 전달하는 다른 개체를 만듭니다. 다른 객체의 수명을 걱정하고 싶지 않으므로 원래 예외를 가지고 다니는 대신 새 객체의 문자열 형식으로 해당 정보 (Exception 클래스 이름, 메시지 등)를 저장합니다. 그것은 RTTI가 "손실"되었을 때입니다. –

+1

당신은 예외의'ClassName' 함수를 사용하고 있습니까? 'ClassType'을 대신 사용하여'TClass' 값을 직접 얻고'FindClass' 경로를 건너 뜁니다. –

답변

10
function isDerivedClass(strClassName: string; theBaseClass: TClass): boolean; 
begin 
    Result := FindClass(strClassName).InheritsFrom(theBaseClass); 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    RegisterClass(TLabel); // must be registered to be found by FindClass/GetClass 

    if isDerivedClass('TLabel', TWinControl) then 
    .. 


:

function isDerivedClass(strClassName: string; theBaseClass: TClass): boolean; 
var 
    aClass: TClass; 
begin 
    Result := False; 
    aClass := GetClass(strClassName); 
    if Assigned(aClass) then 
    Result := aClass.InheritsFrom(theBaseClass); 
end;