2009-06-10 4 views
4

좋아 정의되지 않은 될 수있다, 나는 다음과 같은 기능을 가지고 :반환 값은

function TfPackagedItemEdit.GetRTFDescription: TStringList; 
begin 
    Result.Text := richDescription.Lines.Text; //stringlist 
end; 

컴파일러 생성이 행에 대해 경고 다음

[DCC 경고] 기능의 W1035 반환 값 'GetRTFDescription '정의되지 않았을 수도 있습니다

이 경고를 어떻게 해결할 수 있는지에 대한 아이디어가 있습니까? 내가 해봤

를 (단지 프로젝트 옵션에서 전원을 끈 제외) :

function TfPackagedItemEdit.GetRTFDescription: TStringList; 
begin 
    Result.Text := ''; 
    Result.Text := richDescription.Lines.Text; 
end; 

하지만 그 중 하나가 작동하지 않습니다.

+7

경고 친구가 당신에게 있습니다. 99 %는 그들이 당신에게 아주 나쁜 것을 알리고 있습니다. –

+0

LOL, 나는 이것과 관련있는 것 같은 문제를 연구하고 있었다. 나는 옳은지 알고 싶었다. (할당하기 전에 나가면 부울 함수가 false를 반환한다고 가정하는 것은 옳지 않다.) 내가 맞았 어. 중요 팁 : 컴파일러 경고를 끄지 마십시오. 이 특별한 프로젝트는 모두 꺼져있었습니다. 도 오! (not me, btw.) –

답변

21

Result 변수는 기본적으로 초기화되지 않습니다. 컴파일러에서 생성 한 TStringList 인스턴스를 자동으로 참조하지는 않습니다. Result에 값을 지정해야합니다.

Result := ...; 

당신이 필요로하는, 그래서 그 X 멤버에 대한 참조를 얻을 수 위해 Result의 값을 읽는 Result.X입니다 같은 표현이 준하는 Result A : 그것은 당신의 코드에서이 곳과 같은 라인을 가진 의미 가치는 이미 있습니다. Larry's answer은이를 수행하는 방법을 보여줍니다. TStringList 인스턴스를 생성하므로이 함수의 호출자는 해당 객체에서 Free을 호출해야합니다.

그러나 주석에서이 함수를 속성 접근 자로 사용한다고 언급했습니다. 호출자가 부동산을 읽을 때마다 객체를 해제해야하는 것은 불편하므로 전체 계획이 부적절 할 수 있습니다. 당신이 설명 텍스트를 노출하려는 것 같습니다 때문에, 당신은 대신을 고려하는 것이 좋습니다 : 본질적으로의 추상 기본 클래스입니다 내가 TStrings에 반환 형식을 변경했습니다 먼저

function TfPackagedItemEdit.GetRTFDescription: TStrings; 
begin 
    Result := richDescription.Lines; 
end; 

공지 사항, VCL 전반에 걸친 모든 종류의 문자열 목록. TStringList은 하나의 하위 항목이지만 TRichEdit.LinesTStringList을 사용하지 않습니다. 대신 기본 Rich Edit 컨트롤과 상호 작용하는 방법을 알고있는 특수한 TStrings 하위 항목을 사용합니다.

다음으로 새 개체를 만들지 않았 음을 확인하십시오. 대신 컨트롤의 Lines 속성에 대한 참조를 직접 반환했습니다. RTFDescription 속성 사용자는 더 이상 객체를 확보 할 필요가 없습니다.

+0

안전을 위해 또한 RichDescription이 할당되도록 보장하는 체크를 추가하여 GetRTFDescription이 호출되고 richDescription이 아직 생성되지 않은 경우를 방지합니다. 쉽게 처리 할 수있는 예외를 잡기 위해 GetRTFDescription을 호출 한 후 nil을 확인하는 것이 더 쉽습니다. – skamradt

+0

그것은 주장이하는 일종의 것입니다. 모든 내부 구성 요소는 누군가가 속성을 망치기 시작하기 전에 할당되었다고 가정합니다. 그렇지 않은 경우 사용자 오류가 아닌 프로그래머 오류가 발생하며 배송 전에 수정해야합니다. –

14

컴파일러가 정확합니다. 결과는 기본적으로 초기화되지 않습니다.

function TfPackagedItemEdit.GetRTFDescription: TStringList; 
begin 
    Result = TStringList.Create(); 
    Result.Text := richDescription.Lines.Text; 
end; 

업데이트를 시도해보십시오 를 나는 원래 포스터가 실제로 이런 일을하려고 생각 의견을 검토 한 후.

function TfPackagedItemEdit.GetRTFDescription: String; 
begin 
    Result := richDescription.Lines.Text; 
end; 
+6

그리고 이것은 호출자가 GetRTFDescription에 의해 할당 된 메모리를 해제해야한다는 것을 의미한다는 것을 잊지 마십시오. –

+0

나는 그것에 대한 설명을 원합니다. 어떻게 내가 기억을 풀겠습니까? 방금 속성 취득자로 이것을 호출했습니다 .... – croceldon

+3

또한 "Result.Assign (richDescription.Lines);"을 사용하십시오. speed의 경우 코드는 모든 행을 하나의 문자열로 연결하고 문자열을 줄로 다시 분할합니다. – mghie

2

간단한 String을 반환하는 것이 가장 좋은 해결책 일 것입니다. 적어도 사용하기 쉽습니다.

양자 택일로, 당신은 ... 당신은 많은 텍스트가 발생하는 경우 가장 빠른 해결책이다 TStringList에 대한 참조를 반환 할 수

function TfPackagedItemEdit.GetRTFDescription: TStringList; 
begin 
    Result := richDescription.Lines; 
end; 
관련 문제