2010-07-20 37 views
0

我想寫一些RichEdit組件(Delphi 7)的羅馬尼亞文字,甚至我設置字體屬性 - 字符集爲「EASTEUROPE_CHARSET」它不起作用。delphi 7 richedit和羅馬尼亞語

我想要完成的是在RichEdit中粘貼一些文本(羅馬尼亞語),加載到StringList中,將屬性順序設置爲true並將其分配給另一個RichEdit組件(按字母順序對列表進行排序)。

我知道這不應該在Delphi2009和最多的一個問題,但在這一點上,我可以用Delphi只工作7

字的例子:opoziţie,computerizată。

任何想法?

最好的問候,

+0

這個論壇的帖子可能會幫助:好像你在你的未來的問題,但:http://www.sicomponents.com/forum/viewtopic.php?t=299&sid=71eb99aaafec45eae4dcb8e135898c78 – Tobiasopdenbrouw 2010-07-20 10:36:30

+0

是的,但我已經做了一切從那裏...和問題是有關的一些組件,當我使用Borland套件的標準TRichEdit組件.., 最好的問候, – RBA 2010-07-20 11:22:14

+0

你能解釋如何它不工作?我剛剛在Windows XP上測試了我的Delphi 7副本,並且它正在工作(對我而言)。您是否遇到過所有羅馬尼亞語變音符號問題,或者您只是在使用Ş和problems時遇到問題?什麼版本的Windows(不幸的是它很重要)。我假設您的計算機上的非Unicode應用程序的默認代碼頁不是羅馬尼亞語,是嗎? (你可以看到,在控制面板,區域和語言設置,高級選項卡) – 2010-07-20 12:08:42

回答

3

我用Jedi的JvWideEditor解決了它。代碼是波紋管

procedure TForm2.SortUnicode; 
var asrt:TWStringList; 
    i:Integer; 
begin 
JvWideEditor1.Lines.Clear; 
JvWideEditor2.Lines.Clear; 
asrt:=TWStringList.Create; 
if OpenDialog1.Execute then 
    begin 
    wPath:=OpenDialog1.FileName; 
    JvWideEditor1.Lines.LoadFromFile(wPath,[foUnicodeLB]); 
    try 
    asrt.AddStrings(JvWideEditor1.Lines); 
    for i:=asrt.Count-1 downto 0 do 
    begin 
     if Trim(asrt.Strings[i])='' then 
     asrt.Delete(i); 
    end; 
    asrt.Duplicates:=dupAccept; 
    asrt.CaseSensitive:=true; 
    asrt.Sorted:=True; 

    JvWideEditor2.Lines.AddStrings(asrt); 
    JvWideEditor2.Lines.SaveToFile(GetCurrentDir+'\res.txt',[foUnicodeLB]); 
    finally 
    FreeAndNil(asrt); 
    end; 
    end; 
end; 
+0

如果您遇到D7,請查看TNT組件設置。你真的應該轉向D2010並使用完整的Unicode字符串。 – 2010-07-21 16:55:44

2

檢查Windows中的語言設置。如果您正在運行英文窗口,請嘗試將「將非unicode程序作爲......」設置爲羅馬尼亞語。或者,在本機羅馬尼亞語Windows上運行。要在混合環境中運行(需要同時顯示不同的字符集),您可能需要Unicode。

+0

所以,我沒有其他解決方案,而不是寫在d2009或2010年的應用程序,所以我可以使用Unicode ... 任何其他解決方案,歡迎... 祝好, – RBA 2010-07-21 06:32:55

+0

羅馬尼亞版本的Windows在羅馬尼亞是一種罕見的,我們所有的羅馬尼亞程序員都需要使我們的程序在羅馬尼亞語的Windows和英語版副本上都能正常工作。問題是,我們沒有羅馬尼亞語的Windows 95。當XP獲得羅馬尼亞版本時,只有Pro版本,而不是Home版本,而Enghlish Pro則比羅馬尼亞版本便宜。然後是大型OEM生產商,他們沒有爲羅馬尼亞市場製造PC版本,所以我們大部分時間都會預裝英文版Windows。不好笑! – 2010-07-21 06:36:36

3

嘗試此代碼,它將RichEdit1中的文本作爲UNICODE文本讀取,手動將S和T + Comma轉換爲S和T + Cedilla,然後使用WideCharToMultiByte將文本轉換爲代碼頁1250.代碼點轉換需要因爲代碼頁1250只編碼Ş和c的基於cedilla的版本,而Vista和Windows 7下的新羅馬尼亞鍵盤生成(正確)Ş和com的基於逗號的版本!

procedure TForm1.Button1Click(Sender: TObject); 
var GetTextStruct:GETTEXTEX; 
    GetLenStruct:GETTEXTLENGTHEX; 
    RequiredBytes:Integer; 
    NumberOfWideChars:Integer; 
    WideBuff:PWideChar; 
    AnsiBuff:PChar; 
    i:Integer; 
begin 
    ; 

    // Get length of text 
    GetLenStruct.flags := GTL_NUMBYTES or GTL_USECRLF or GTL_PRECISE; 
    GetLenStruct.codepage := 1200; // request unicode 
    RequiredBytes := SendMessage(RichEdit1.Handle, EM_GETTEXTLENGTHEX, Integer(@GetLenStruct), 0); 

    // Prepare structure to get all text 
    FillMemory(@GetTextStruct, SizeOf(GetTextStruct), 0); 
    GetTextStruct.cb := SizeOf(GetTextStruct); 
    GetTextStruct.flags := GT_USECRLF; 
    GetTextStruct.codepage := 1200; // request unicode 

    WideBuff := GetMemory(RequiredBytes); 
    try 
    // Do the actual request 
    SendMessage(RichEdit1.Handle, EM_GETTEXTEX, Integer(@GetTextStruct), Integer(WideBuff)); 
    // Replace the "new" diactrics with the old (make Romanian text compatible with code page 1250) 
    NumberOfWideChars := RequiredBytes div 2; 
    for i:=0 to NumberOfWideChars-1 do 
    case Ord(WideBuff[i]) of 
     $0218: WideBuff[i] := WideChar($015E); 
     $0219: WideBuff[i] := WideChar($015F); 
     $021A: WideBuff[i] := WideChar($0162); 
     $021B: WideBuff[i] := WideChar($0163); 
    end; 
    // Convert to code-page 1250 
    RequiredBytes := WideCharToMultiByte(1250, 0, WideBuff, -1, nil, 0, nil, nil); 
    AnsiBuff := GetMemory(RequiredBytes); 
    try 
     WideCharToMultiByte(1250, 0, WideBuff, -1, AnsiBuff, RequiredBytes, nil, nil); 
     Memo1.Lines.Text := AnsiBuff; // AnsiBuff now contains the CRLF-terminated version of the 
            // text in RichEdi1, corectly translated to code page 1250 
    finally FreeMemory(AnsiBuff); 
    end; 
    finally FreeMemory(WideBuff); 
    end; 

end; 

然後使用類似的東西把AnsiString變成UNICODE並推入RichEdit。 當然,唯一真正的解決方案是切換到Delphi 2009或Delphi 2010並全部使用Unicode。

+0

謝謝Cosmin! +1 – RBA 2010-07-21 08:01:15

相關問題