Delphi 7을 사용하여 MSWord 2003에서 로컬 문자를 읽고 쓰는 방법은 무엇입니까?
-
28-10-2019 - |
문제
이름과 숫자가 포함된 양식에 ListView가 있고 해당 데이터가 문서 테이블에 채워진 MSWord 문서 인쇄를 제공해야 합니다.모든 것이 영어 문자와 잘 작동하지만 동유럽이나 러시아 문자를 보내려고 할 때 문서에서 "?" 또는 "쓰레기".또한 문서에서 응용 프로그램으로 해당 문자를 읽을 수 없습니다.
내 질문은 다음과 같습니다
- 다음과 같은 문자를 보내는 방법
"ЉЊĐŠŽČ"
Word 문서로? - MSWord에서 이러한 문자를 다시 응용 프로그램으로 읽는 방법은 무엇입니까?
간단히 말해서 코드는 다음과 같습니다.
word := CreateOleObject('Word.Application');
word.Visible := true;
doc := word.documents.Open(ExtractFilePath(Application.ExeName) + '\tpl.doc');
table := word.ActiveDocument.Tables.Item(1);
table.Cell(1,2).Range.Text := 'MY TEXT';
word.ActiveDocument.Close;
word.Quit;
word := UnAssigned;
doc := UnAssigned;
table := UnAssigned;
글꼴을 변경할 수 있어요 name
, size
그리고 color
속성을 사용하면 그렇게 할 수 없습니다 charset
재산.
아무도?
설치된 소프트웨어:
- 윈도우 XP 프로페셔널
- 마이크로소프트 워드 2003
- 델파이 7 엔터프라이즈 에디션
해결책
문제는 후기 바인딩을 사용하여 OLE 자동화를 통해 Word를 호출한다는 사실에서 발생합니다.
그래서 Range.Text
Delphi 7에서는 WideString(유니코드) 콘텐츠를 기대하는 메서드가 아니라 일반 ASCII 텍스트를 기대하는 메서드로 알려져 있습니다.
첫 번째 해결책은 Delphi 2009 이상을 사용하는 것입니다.새로운 string
유형은 그러한 유니코드 할당을 투명하게 만들었습니다.
Delphi 7에서는 유형을 WideString으로 강제 변환하는 것은 어떻습니까?
table.Cell(1,2).Range.Text := WideString('MY TEXT');
또는 다음과 같이 임시 변수를 사용합니다.
var tmp: WideString;
tmp := 'ЉЊĐŠŽČ'
table.Cell(1,2).Range.Text := tmp;
또 다른 가능성은 후기 바인딩을 사용하지 않고 Office의 OLE 인터페이스를 직접 선언하여 "마이크로 소프트 워드 ???개체 라이브러리"를 IDE의 "프로젝트" 메뉴에서 선택하세요.
가져온 인터페이스에는 와이드스트링 유형이 있습니다. 예:
Range = interface(IDispatch)
['{0002095E-0000-0000-C000-000000000046}']
function Get_Text: WideString; safecall;
procedure Set_Text(const prop: WideString); safecall;
(...)
property Text: WideString read Get_Text write Set_Text;
따라서 더 이상 Ansi 문자 집합에 문제가 발생하지 않습니다.