2012-06-20 2 views
17

Memo.Lines에서 추상 클래스 TStrings을 사용하는 이유는 무엇입니까? 왜 TStringList를 대신 사용하지 않습니까?왜 memo.Lines는 TStringList 대신 TString을 사용합니까?

그리고 TStringList로 변환해야합니까?

+2

는'TMemo.Lines는 TStringList를 = FALSE '입니다. 사실이 뒤에있는 실제 개체는 Windows API에 대한 래퍼입니다. 저장소는 TMemo를 구현하는 Windows EDIT 컨트롤에 의해 구성됩니다. "작업하기 전에 TStringList로 변환해야합니까?" 왜 그걸하고 싶니? –

+5

TStrings는 개발자에게 더 큰 유연성을 허용하는 덜 "계약"입니다. TStrings 추상 클래스를 구현하는 모든 클래스와 상호 작용할 수 있습니다. – Simon

답변

21

TMemo.Lines, TListBox.Items, TComboBox.Items 등; 모두는 TStrings으로 선언됩니다. 주의 재산에 대해 이야기하십시오! 내부 생성 유형은 각각 TMemoStrings, TListBoxStringsTComboBoxStrings입니다.이 유형은 모두 TStrings의 자손이며 저장 방법이 모두 다릅니다.

왜? 상호 호환성 및 상호 운용성을 위해. 그래서 모든 TStrings -descendant 같은 특성을 가지고 있으며, 그래서 당신은 할 수 있습니다 :

Memo1.Lines := ListBox1.Items; 

어떻게 사용할 수 있나요? 음, 과 같은 TStrings 속성은 정상적으로 작동합니다. 내부적으로이 모든 상호 작용을 구현하는 TMemoStrings이기 때문에 속성에서 문자열 및 객체를 추가, 삭제, 변경, 갱신 및 지울 수 있습니다. Declaration <> 구현.

하지만 특별한 처리가 필요한 경우 (예 : TStringList이 제공하는 정렬과 마찬가지로, 도움이 필요합니다. 당신은 캐스트도이 일이 아니기 때문에하는 TStringListTMemo.Lines 변환, 대신이 특별한 처리를 위해 중간 객체를 생성 할 필요가 없습니다

var 
    Temp: TStringList; 
begin 
    Temp := TStringList.Create; 
    try 
    Temp.Assign(Memo1.Lines); 
    Temp.Sort; 
    Memo1.Lines.Assign(Temp); 
    finally 
    Temp.Free; 
    end; 
end; 
+1

알겠습니다. 감사합니다. 그래서 나는 추측한다. Memo.Lines.Delete (0)는 내부적으로 TString을 사용하지 않기 때문에 작동합니까? – Illiou

+0

예. 양식에 메모 구성 요소를 놓아도 _abstract 컴파일러 오류 _가 발생하지 않으면 인스턴스화중인 추상 객체가 없다고 가정합시다. ;) – NGLN

+1

장소를 분류하는 더 매끄러운 방법이 있습니다. –

관련 문제