2012-07-30 6 views
3

: 그것은 그런 대부분의 경우 가장 역동적 인 기술이기 때문에 How to use “Sender” parameter with “As” operator for more then one class at a timeTypInfo RTTI 메서드를 사용하여 하위 속성 항목에 값을 설정하는 방법? 내 질문에

나는 레미 Lebeau의 대답을 선택합니다. 그것은 RTTI TypInfo 클래스를 사용합니다.

그러나이 클래스를 사용하면서 다른 문제가 발생했습니다. 어떻게 하위 속성 값을 설정합니까?

function TRemote.UpdateQuery(DataSet: TDataSet; SQL: String): Boolean; 
var 
    PropInfo: PPropInfo; 
begin 
{ atualiza o código SQL padrão de um dataSet de consulta tipo View } 
    PropInfo := GetPropInfo(DataSet, 'SQL', []); 
    if not Assigned(PropInfo) then 
    begin 
    Result := False; 
    Exit; 
    end; 
    try 
    DataSet.Close; 
    SetPropValue(DataSet, PropInfo, SQL); 
    DataSet.Open; 
    Result := True; 
    except 
    Result := False; 
    end; 
end; 

예 : 은 내가 TIBQuery을 가지고 있고 나는 SQL 속성의 텍스트를 업데이트 할. 하지만 SQL 속성은 TStrings 클래스이므로 SQL.Text를 사용해야합니다. 위의 코드에서 TString을 가져 왔기 때문에 "Invalid Property Type"오류가 발생하고 나중에 일반 문자열을 설정하려고합니다.

GetPropInfo를 사용하여 SQL.Text에 도달하는 방법은 무엇입니까? SQL 속성이있는 TIBQuery와 TZQuery의 공통 조상이 있습니까? 따라서 함수 매개 변수의 TDataSet 대신 변경할 수 있습니까?

+0

'SQLstrings : = TStringList.Create' 로컬 문자열 목록을 만든 다음'SQLstrings.Text : = SQL'을 실행하고'SQLstrings'을'SetPropValue'에 전달할 수 없습니까? –

+2

'SQL' 인스턴스는'TStrings (GetObjectProp (DataSet, 'SQL'))'로 간단하게 얻을 수 있습니다. 'GetPropInfo'를 사용해야합니까? 읽을 수없는 * 코드 조각입니다. – TLama

+0

'PPropInfo'가 아닌'String'으로 속성을 요청하면 속성을 찾을 수없는 경우 예외가 발생합니다. –

답변

9

TStrings.Text 속성은 Delphi 2006의 RTTI를 통해 액세스 할 수 없습니다. 그렇다고하더라도 어쨌든 RTTI를 사용하지 않아도 액세스 할 수 있습니다.

: 당신이 SQL 속성은 TStrings 개체입니다 알고 있기 때문에, 당신은 단순히 재산의 실제 개체 포인터 retreive 수 있습니다 당신은 당신이 예를 들어, 객체로 할 필요가 무엇이든 할 수하는 TStrings 포인터로 타입 캐스트
function TRemote.UpdateQuery(DataSet: TDataSet; SQL: String): Boolean; 
var 
    PropInfo: PPropInfo; 
    SQLObj: TStrings; 
begin 
    Result := False; 
    try 
    PropInfo := GetPropInfo(DataSet, 'SQL', [tkClass]); 
    if not Assigned(PropInfo) then Exit; 
    SQLObj := TStrings(GetObjectProp(DataSet, PropInfo, TStrings)); 
    if not Assigned(SQLObj) then Exit; 
    DataSet.Close; 
    SQLObj.Text := SQL; 
    DataSet.Open; 
    Result := True; 
    except 
    end; 
end; 
+2

+1; @EASI, 당신이 특별히 물어 봤지만 직접 GetObjectProp을 사용할 수 있습니다. 이전에는'GetPropInfo'를 사용하는 이점이 없습니다 (다른'GetObjectProp' 과부하의 내부에서 호출됩니다). – TLama

+2

GetObjectProp()을 호출하기 전에 GetPropInfo()를 호출하면 속성을 찾을 수없는 경우 예외가 발생하지 않도록 할 수 있습니다. 'GetObjectProp()'의 다른 오버로드 된 버전은 당신에게 그 옵션을주지 않는다. 예외를 발생시킬 것이다. 이 경우'try/except'로 인해 괜찮은 것 같지만 일반적으로 예외를 피할 수 있다면 오버 헤드를 피할 수 있습니다. –

+0

이것은 아주 좋습니다. 나는'GetObjectProp'을 보는 것을 완전히 잊었다. 이것은 매우 교육적인 것입니다! – PSyLoCKe