2012-01-16 6 views
5

이전 프로젝트의 소스를 얻었지만 작은 것들을 변경해야하지만 델파이 2010만으로 인해 커다란 문제가 발생했습니다.문자열 문제 Delphi 3에서 Delphi 2010로 마이그레이션

bbil = record 
    path : string; 
    pos: byte; 
    nr: Word; 
end; 

나중에 정의 파일에서 읽는 데 사용됩니다 :

b_bil: file of bbil; 
pbbil: ^bbil; 
l_bil : tlist; 

while not(eof(b_bil)) do 
    begin 
    new(pbbil); 
    read(b_bil, pbbil^); 
    l_bil.add(pbbil); 
    end 

가장 큰 문제는, 컴파일러가 타입 "문자열"에 동의하지 않는 정의 된 기록이있다

그가 "완결"을 원하기 때문에 기록. 그래서 "string"을 "string [255]"또는 "shortstring"으로 변경하려고했습니다. 이 응용 프로그램은 파일을 읽을 때 잘못된 내용으로 읽고 있습니다.

내 질문은 파일이 이미 예를 들어, 많은 노력 델파이 2010

에서 "새로운"유형에 기록 된로 이전 "문자열"형식을 변환하는 방법입니다 "{$ H-}". 레코드에서 하나의 char 만 추가하면 파일이 거의 정확하지만 각 데이터 세트가 더 잘릴 수 있기 때문에 파일이 올바른 것입니다. lengthbyte + 255chars의 길이는 정의보다 짧지 만 짧은 문자열은 맞지 않습니다.

+0

에서 잘 읽을 것 그리고

path : ShortString[255]; 

: 나는 문자열처럼 고정 된 크기의 수 있도록 당신이 당신의 기록을 수정 제안 컴파일러 errror : "bbil의 finalization이 필요합니다"에서도 정의 결과를 기록합니다. 이런 방식으로 AnsiString을 단락 시키면 "pfad : AnsiString [255];" 또한 작동하지 않습니다 : "; 예상되지만 [found]. 내가 필요한 것은 ShortAnsiString인가? – rseffner

+2

IMO는 델파이 3에서도 코드를 컴파일해서는 안됩니다. 'Path : AnsiChar의 배열 [0..N]을 시도하십시오. ', N은 어떤 상수, 아마도 255입니다. – kludg

+2

David이 말한대로 문자열을 ShortString으로 선언하십시오. 레코드를 정렬하려면 압축 된 레코드 지시문을 사용하십시오. 이 코드가 D3에서 작동하려면 {$ H-} 지시문을 사용해야합니다. –

답변

5

Eek! 코드가 오래되었거나 긴 문자열을 사용하지 않는 것 같습니다. 이전 델파이에서와 같은 동작을 원한다면 stringShortString으로 대체해야합니다.

이미 시도해 보았지만 실패했다고 신고했습니다. 다른 모든 문자열 유형이 본질적으로 포인터이기 때문에 실제로 의미가있는 유일한 설명이므로 read이 수행 할 수있는 유일한 방법은 ShortString입니다. 시도하고있는 마이그레이션은 엄청나게 많으며 많은 수의 혼란스러운 문제가있을 것입니다.

@LU RD는 packed 배열을 사용하지 않으므로 레코드 레이아웃이 Delphi 버전간에 다를 수 있다는 의견에 좋은 점을 제시합니다. 현재 보유하고있는 두 가지 Delphi 버전을 사용하여 레코드 레이아웃을 조사 할 수 있습니다. 버전 사이의 레코드 크기가 일치하고 필드의 오프셋도 일치해야합니다.

아래 설명에 따르면 pos와 nr 사이에 패딩 바이트를 추가하면 문제가 해결됩니다.

bbil = record 
    path : string; 
    pos: byte; 
    _pad: byte; 
    nr: Word; 
end; 

또한 나는 것들에 대해 갈 것이라고 생각하는 방법이 될 것입니다 {$ALIGN ON}$ALIGN 컴파일러 옵션을 설정하여 동일한 효과를 얻을 수있다.

장기적으로는 짧은 문자열, ANSI 인코딩, 내부 레코드와 데이터 파일 간의 직접 매핑 등에서 벗어나야합니다. 짧은 시간에이 코드를 작성하고 사용하는 것과 동일한 버전의 Delphi를 사용하는 것이 더 나을 것입니다. 나는이 문제가 단지 빙산의 일각 일 것으로 기대한다.

+0

David, 저는 'ShortString' advice가 정확하다고 생각합니다. 레코드의 크기 만 일치시켜야합니다. 정렬 지시문은이를 해결할 수 있습니다. 또는 압축 된 레코드 선언을 해결할 수 있습니다. –

+0

ShortString을 레코드 세트의 "String"대체로 사용하면 가장 먼저 수행 한 작업 중 하나였습니다. 그러나 예상대로 작동하지 않습니다. 모든 데이터 레코드는 휴지통이었습니다 .- (필자는 "packed record directive"에 대해 읽었습니다. 알지 못하기 때문에 – rseffner

+1

형식을'record' 대신'packed record'로 선언하면됩니다. 컴파일러에 의한 정렬을 제거합니다. 레코드의 크기를 보려면'SizeOf (bbil)'을 사용해보십시오. –

2

그냥 기억

"문자열"<> "문자열 [255]"<> <가>를 AnsiString

돌아 가기 오래된 DOS/터보 파스칼 일

, "문자열"참으로 제한했다 "ShortString은" 255 자. 대부분의 경우 첫 번째 바이트에는 문자열 길이가 포함되고 바이트에는 0과 255 사이의 값만 포함될 수 있기 때문입니다.

현재 델파이 최신 버전에서는 더 이상 문제가 없습니다.

"ShortString"은 이전 DOS/파스칼 문자열 유형의 유형입니다.

"LongString"은 현재 대부분의 제작 작업에 사용되는 Borland Delphi 2006을 포함하여 오랫동안 기본 문자열 유형이었습니다. Delphi 3 .. Delphi 2009에서 LongStrings은 8 비트 문자를 포함하고 있으며 사용 가능한 메모리에 의해서만 제한되었습니다. Delphi 2009에서 "LongStrings"는 "AnsiStrings"와 동의어였습니다.

최신 델파이 (Delphi 2009 이상, 새로운 Delphi XE2 포함)는 모두 멀티 바이트 유니 코드 "WideString"문자열로 기본 설정됩니다. AnsiStrings와 마찬가지로 WideStrings도 최대 길이가 효과적으로 "무제한"입니다.

이 문서에서는 더 자세히 설명 :

http://delphi.about.com/od/beginners/l/aa071800a.htm

추신 : 진 기록을 위해 "를 sizeof (bbil)"와 "Packed"를 사용하는 것이 좋습니다.

+1

Delphi 용어에서 긴 문자열은 AnsiString과 UnicodeString을 모두 가리키며, 후자는 D2009에 도입 된 새로운 문자열 유형입니다. 그리고 WideString은 다시 다르고 COM BSTR을 감싸는 래퍼입니다. –

+2

@rseffner - 용어가 혼란 스러울 수 있습니다. 대부분 Microsoft의 잘못입니다. 문자열을 이해하기 위해 내가 인용 한 링크 (특히 "about.com"기사)를 살펴보십시오. 바이너리 레코드의 정렬 및 정렬 문제를 해결하려면 "sizeof()"를 시험해보십시오. – paulsm4

+1

용어는 완벽하게 명확하며 MS와는 관련이 없습니다. 문제의 언어는 Embarcadero에서 제작했습니다. 나의 이전 코멘트는 당신의 대답에있는 다양한 오류를 수정하도록 당신을 조종하려고했다. 그것이 의미하는대로 그것은 오히려 부정확합니다. –

0

어쩌면 나는 뭔가를 간과하고 있을지 모르지만, 내가 본대로 델파이 3 코드도 손상되었습니다. 귀하의 기록 데이터를 만들고, - (길이 하나 바이트의 데이터를, 나머지 1과 256 사이에 아무것도), POS (1 바이트), NR (2 바이트)

bbil = record 
    path : string; 
    pos: byte; 
    nr: Word; 
end; 

경로 : 귀하의 기록의 크기를 결정하는 것을 시도하십시오 크기는 1 + 1 + 2 = 4 바이트에서 256 + 1 + 2 = 259 바이트까지 다양합니다. 이 상황에서 어떤 경우에도 파일에서 가비지를 가져 오게됩니다. 프로그램에서 실제로 데이터를 읽지 전에 읽을 바이트 수를 알 수 없기 때문입니다. , 당신은 쓸 수와의 AnsiString을 사용 모두 델파이 3, 2010

+0

그럼 다시 델파이 3은 짧은 스트링 타입을 가지고 있지 않습니다. 델파이 3에서는 스트링으로 정의해야합니다. –