2009-07-13 3 views
15

여름철 비즈니스 워킹이 시작되어 D2009 로의 이전을 시작했습니다. 나는 그들이 ascii를 유지해야하거나 유니 코드 일 수 있고 포팅을 시작한다면 프로그램의 모든 하위 시스템을 대략적으로 결정했다.D2009 TStringlist ansistring

모든 구성 요소가 D2009 버전 (일부는 VSTView와 비슷하지만 약간 호환되지 않음)에 있었지만 지금은 문제가 발생했습니다. 일부 부분에서는 ansistring을 유지해야하며 TStringList를 주로 사용합니다. 기본지도.

이미 쉽게 교체 할 수있는 항목이 있습니까? 이전 델파이 또는 FPC 소스를 기반으로 삭제 된 ansistring tstringlist를 포함해야합니까?

나는이 문제에 대해 처음으로 생각하고 있습니다.

유효성 검사 궤도를 지나는 동안 코드가 BDS2006에서 편집 가능한 상태로 유지되도록 변경 사항은 상대적으로 현지화되어야합니다. 여기서 몇 가지 ifdefs는 문제가 없습니다. 물론 string-> ansistring 및 char -> ansichar 등은 내 소스에서 수정으로 간주되지 않습니다. 어쨌든 그렇게해야하기 때문에 완전히 후방 호환입니다.

편집 : 나는 독자/작가 수업에서 몇 가지 물건을 해결할 수있었습니다. 이것은 원래 생각했던 것보다 Mason의 솔루션을 쉽게 만듭니다. 나는 Gabr의 제안을 대체로 생각할 것이다.

Generics는 D2009를 구입 한 이유입니다. 그들이 만든 FPC가 호환되지 않겠지 만

+1

문자열의 바이트 수와 문자열의 길이를 포함하여 많은 계산을 수행하고 있습니까? 이것은 다운 그레이드를하는 유일한 진정한 요구 사항입니다. – smok1

+0

하나는 버전이 지정된 이전 버전과 호환되는 바이너리 버전입니다. 다른 하나 (아직 시작하지도 않은)는 사용자 정의 된 Sax 및 DOM 구현입니다. 그러나 주된 이유는 고객에게 메모장으로 유니 코드 텍스트 파일 등을 여는 방법을 설명하고 싶지 않고 평범하고 오래된 평범한 것을 그대로 두는 것입니다. –

+1

다시 나는 사용자의 행동에 당황 스럽다. 5 명의 사용자가이 질문에 사려 깊은 답변을 제공했으며, 지금까지 71 명의 시청자 중 14 명 이상이 투표를했지만 아직 그 중 하나가 질문에 찬성표를 던지지 않았습니다. 어떤 질문도 완벽하지 않지만 Q와 As - so +1을 읽는 것이 도움이된다는 것을 알았습니다. 이모, ** 델파이 ** 지원 주제에 대한 유익한 토론을 포함합니다. – Argalatyr

답변

9

"맵"으로 "해시 테이블"을 의미하는 경우 일반 TDictionary로 바꿀 수 있습니다. 다음과 같이 선언하십시오.

uses 
    Generics.Collections; 

type 
    TStringMap<T: class> = TDictionary<ansiString, T>; 

그런 다음 StringLists를 올바른 오브젝트 유형의 TStringMaps로 바꾸십시오. 더 나은 유형 안전성이 무료로 제공됩니다. 또한 사전에 객체를 소유하고 완료 할 때 사전을 비우려면 TObjectDictionary로 변경하고 생성자를 호출 할 때 [doOwnsValues]를 (을)를 전달하십시오. 적절한 매개 변수

(. 당신이 TDictionary을 사용하려고하는 경우 BTW, 당신은 원래 릴리스는 거의 사용할 수 없게 만든 TDictionary에서 몇 가지 심각한 버그가 있었다 D2009 업데이트 3. 다운로드 확인)

편집 : 그것은 여전히에있는 경우 D2006에서 컴파일하면 약간 수정해야합니다. 다음과 같이 시도하십시오.

type 
    TStringMap = 
{$IFDEF UNICODE} 
    class TDictionary<ansiString, TObject> 
    (Add some basic wrapper functions here.) 
    end; 
{$ELSE} 
    TStringList; 
{$ENDIF} 

래퍼는 처음에지도로 사용하는 경우 너무 많이 사용하지 않아야합니다. 이전 버전과의 호환성을 위해 여분의 형식 안전성을 잃지 만 O (1) 시간에 조회를 수행하는 실제 해시 테이블을 얻습니다.

+0

코드는 D2006과 함께 컴파일해야합니다 ...하지만 어쩌면 작은 래퍼가 할 것입니다, afaik 나는 한 달 오래된 전자 소프트웨어 제공 버전이기 때문에 가장 최근의 업데이트를했습니다. (내가 손으로 설치 한 도움말 업데이트 3 제외) –

+0

한편 더 많이 연주했지만 TDictionary는 복제본을 지원하지 않습니다. –

3

이러한 서브 시스템은 계속 존재해야합니까? 아니면 외부 세계와 통신하는 방식 (RS232, 텍스트 파일 등)이 필요합니까? C#에서와 마찬가지로 Delphi 2009의 문자열을 문자열로 처리하고 다른 사람이 필요할 때만 변환에 대해 걱정합니다.

이렇게하면 코드에서 의도하지 않은 암시 적 변환을 피하고 Windows API 메서드를 호출 할 때 성능이 향상되는 것을 방지 할 수 있습니다.

+0

textfiles, RS232가 바로 자리에 있습니다. 그러나 persistance는 단순히 stringlist.savetostream 정도가 아니며 심각한 버전의 역방향 compability 요구로 수작업으로 처리됩니다. 나는 대략 당신이 최상위에서 조언하는 것과 거의 같지만, 나는 내부적으로/insistring을 출력하는 서브 시스템을 유지하고 내부적으로 그것들을 심하게 사용하여 문제를 피하는 것을 선호한다. 나중에, 마이 그 레이션 후에 나는 선택된 것을 ansistring로 업데이트합니다. –

+1

이전 Delphi 버전과의 호환성을 언급하려면 질문을 편집해야합니다. –

+0

... 분명히 유니 코드 링하는 것. 파일 유형의 약 절반은 바이너리 btw입니다. –

2

Delphi 2007 (또는 이전)의 TStrings 및 TStringList 클래스를 수정하고 이름을 TAnsiStrings 및 TAnsiStringList로 바꿀 수 있습니다. 당신은 그것이 매우 쉬운 수정이라는 것을 알아야하며, 그것은 당신에게 필요한 수업을 줄 것입니다.

+0

AnsiStrings.pas 또는 소스 디렉토리를 검색 할 때이 중 하나가 표시되지 않습니다. –

+0

ansistrings에 tansistringlist가 포함되어 있지 않은 것으로 보입니다. 전체 src/dir은 grep하지 않습니다. 그것은 내가 바라는 바입니다 –

+0

죄송합니다, 죄송합니다, 죄송합니다. 내가 틀렸어. Delphi 2009에는 포함되지 않았지만 쉽게 수정할 수 있습니다. 내 대답을 업데이트 할게. – lkessler

12

JCL은 JclAnsiStrings 유닛에 TAnsiStrings 및 TAnsiStringList를 구현합니다.

8

TStringList.LoadFromFile/SaveToFile 또한 TStringList를 사용하여 원하는 모든 유형의 문자열을 저장할 수있는 TEncoding 유형의 선택적 매개 변수를 사용합니다.

procedure LoadFromFile(const FileName: string; Encoding: TEncoding); overload; virtual; 
procedure SaveToFile(const FileName: string; Encoding: TEncoding); overload; virtual; 

또한 기본적으로 TStringList는 기존 코드가 그대로 작동하도록 코드 페이지로 ANSI를 사용합니다.

+0

(이 줄의 일정 부분 지연) 위에서 설명한 것처럼 tstringlist를 기본 MAP으로 사용하므로 모든 행에 객체 []가 연결되어 있기 때문에 이러한 메서드를 통해 스트리밍하지 않았습니다. –