1. 程式人生 > >DELPHI控制元件FastReport中文Memo顯示問題的完美解決方案

DELPHI控制元件FastReport中文Memo顯示問題的完美解決方案

問題描述,正如rainee所說:程式設計時Memo中的中文顯示正常,預覽也正常。程式執行時Memo中的中文只能顯示前幾個漢字,有時甚至不能顯示。再次開啟程式原始碼,會發現Memo中的中文沒儲存下來或儲存不完全。如果用Memo顯示欄位或變數的值,其中的中文顯示正常。
除了文章提到的方法外,FastReport4.7.91的TfrxReport有StoreInDFM屬性,將其設為false, 在執行時動態載入報表檔案,語句如下frxrprtPrintCheck.LoadFromFile('a.fr3');然後預覽列印都沒有問題。

擔心原文作者文章地址有變動,特轉載如下:

FastReport3.15以上版本(包括最新的3.23.9)都存在一個問題:程式設計時Memo中的中文顯示正常,預覽也正常。程式執行時Memo中的中文只能顯示前幾個漢字,有時甚至不能顯示。再次開啟程式原始碼,會發現Memo中的中文沒儲存下來或儲存不完全。如果用Memo顯示欄位或變數的值,其中的中文顯示正常。
    網上能找到的解決方法主要有兩種:
一、在FastReport中新增變數,設定Memo的內容為變數的值,在報表的GetValue事件中給變數賦值。如果你的報表中有許多Memo的值相同,用這種方法最方便。
procedure TForm1.frxReport1GetValue(VarName: String; var Value: Variant);
begin
if CompareText(VarName, 'MyVar1') = 0 then
Value := 'Hello.';
end

二、設計時Memo內容為空,在Show報表前給Memo控制元件賦值。
procedure SetMemoData(aReport: TfrxReport; aMemoName, aString: string);
var
  mv: TfrxMemoView;
begin
  mv := aReport.FindObject(aMemoName) as TfrxMemoView;
  if mv<>nil then
    mv.Text := aString;
end;

    這裡要講的第三種方法是我最近發現的:
三、用FastReprot Studio3.20設計報表。
    FastReprot Studio3.20是獨立的可直接聯接資料庫做報表的程式,用它做報表和在Delphi中操作完全一樣,它的Memo中可設定中文內容,並且能正常顯示,儲存後也不會丟失。然後在Delphi中呼叫儲存好的報表,這樣Memo中的中文顯示就沒問題了。

/////////////////////////////
這是在CSDN搜尋到的,供參考

Fastreport3.x對中文的支援有問題.例如:frxMemoView中如果填了中文,那麼StoreInDFM設時就會有問題.

中文顯示不出來.

網上之前也流行了一些解決辦法,如:用變數儲存中文,執行時再賦值,又或者用另外的獨立的設計器來設計報

表.但我覺得這些辦法都不好,因為它改變了程式設計師的使用習慣.

其實問題出Fastreport3.x把widestrings屬性持久化到DFM時.因為它會先把text轉換成Utf8格式再儲存.但

delphi本身對Utf8的支援又不太好,(我發現兩個以上的Utf8格式字串相加有時會出錯),所以我把widestrings

這個類持久化函式改了一下去掉了Utf8的轉換部份,就把問題切底解決了.

frxUnicodeUtils單元下:
把TWideStrings類的ReadDataW和WriteDataW函式中關於Utf8的轉換去掉

具體是:

ReadDataW:
    //Add(Utf8Decode(Reader.ReadString));
    Add(Reader.ReadString);

WriteDataW:
    //Writer.WriteString(Utf8Encode(Get(I)));
    Writer.WriteString(Get(I));


    總結:FastReport中文Memo顯示不正常的原因大概是Delphi在dfm檔案儲存FastReport的報表控制元件時出了問題,不在dfm檔案中儲存報表,就不會有這個問題了